使用 Core Bluetooth 的 CBCentralManager ,可以使用 scanForPeripherals(withServices: [CBUUID]?, options: [String : Any]? = nil) 扫描设备。由于回调 centralManager(CBCentralManager, didDiscover: CBPeripheral, advertisementData: [String : Any], rssi: NSNumber) ,我可以检查设备。
实现回调 func centralManager(CBCentralManager, didDisconnectPeripheral: CBPeripheral, error: Error?) 允许检测外围设备断开(取消配对)。但是,如何在不重新扫描的情况下检测到故障(或移动)的未配对外围设备?
我是否需要定期扫描并保持配对设备的增量?
BLE 外围设备在关闭时是否会发送消息以警告监控设备,或者我是否应该假设未发送广告数据包的设备处于 sleep /死机/消失状态?广告过程是否遵循我可以信赖的明确规则,还是取决于设备的制造商/固件编写者?
Best Answer-推荐答案 strong>
这个有点复杂.....
在大多数情况下,如果您已连接,您就会知道设备就在附近。 (这不是 100% 正确,但通常足够接近。)因此应该列在列表中。
有可能连接手机,但不能连接您的应用程序。在这种情况下,该设备不会做广告,因此您不会看到它。您可以通过调用 retrieveConnectedPeripherals(withServices 来检查该列表。
然后是广告和扫描。默认配置只会向您返回一个广告设备一次。如果您将它从您的列表中清除,它就不会再被发现。您可能想要的是 CBCentralManagerScanOptionAllowDuplicatesKey (这是 scanForPeripherals(withServices 的一个选项。每次系统看到广告数据包时,这都会让您“发现”回调. 然后,您可以跟踪上次看到设备的时间,并清除“足够长的时间”没有看到的设备。
您也可以盲目地连接到设备(即使是当前不在身边的设备),当它最终成功时您会收到回调。这实际上是一种非常常见的技术(这是我最常使用的技术)。它甚至可以在应用程序处于后台时使用;当设备进入范围时,您将被启动。
关于ios - 核心蓝牙,如何确定检测的陈旧性?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/51311458/
|