bal*_*lph 5 ios core-bluetooth bluetooth-lowenergy ios-bluetooth
我目前正在开发的 iPhone 应用程序需要在外围设备建立本地连接后每秒读取一次 RSSI CBCentralManager,无论是在前台还是后台。这意味着设置CBCentralManagerScanOptionAllowDuplicatesKey为true“调用时”scanForPeripherals(withServices:options:)是不可能的,因为当应用程序在后台运行时它会被忽略,并且它仅通过CBCentralManagerDelegate的centralManager(_:didDiscover:advertisementData:rssi:)方法启用 RSSI 更新,此时外设尚未连接。
受这个答案的启发,我在外围设备中实现了一个特性,该特性具有一个notify属性并每秒更新一次。在我的应用程序中,我使用 的CBPeripheral方法setNotifyValue(_:for:)通过 获取特征更新的通知peripheral(_:didUpdateValueFor:error:)。在此方法中,我peripheral.readRSSI()大约每秒通过 调用并获取 RSSI 更新peripheral(_:didReadRSSI:error:)。
我的代码的简化版本如下所示:
...
peripheral.setNotifyValue(true, for: characteristicUpdatingEverySecond)
...
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
peripheral.readRSSI()
}
func peripheral(_ peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: Error?) {
print("Peripheral \(peripheral) read RSSI: \(RSSI)")
}
Run Code Online (Sandbox Code Playgroud)
与核心蓝牙状态保存和恢复的正确实现相结合,这似乎工作得很好。尽管这似乎是一个可以接受的解决方案,但我仍然想知道是否有其他解决方案不依赖于外围设备的自我更新特性。
我曾考虑过使用 iBeacon(与蓝牙外设并行),但这对我们来说不是一个好的解决方案,因为它很容易被欺骗,我们在设置连接时依赖某些验证方法来确保外设是正品。
是否有人有使用核心蓝牙在前台和后台应用程序状态下轮询蓝牙外设的 RSSI 的经验?您是否找到了替代/不同/更好的解决方案?
| 归档时间: |
|
| 查看次数: |
911 次 |
| 最近记录: |