核心蓝牙,如何确定检测是否陈旧?

时间:2018-07-12 17:31:57

标签: ios bluetooth-lowenergy

使用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外设在关闭时会发出消息以警告监视设备吗?还是我应该假设未发送广告包的设备处于睡眠/死亡/消失状态?广告过程是否遵循我可以依靠的明确规则,还是取决于设备的制造商/固件编写者?

1 个答案:

答案 0 :(得分:3)

这有点复杂.....

在大多数情况下,如果已连接,则知道设备在某处附近。 (这不是100%正确,但通常足够接近。)因此应该放在列表中。

可以连接手机,但不能连接您的应用程序。在这种情况下,该设备将不会做广告,因此您不会看到它。您可以通过调用retrieveConnectedPeripherals(withServices:)来检查该列表。

然后是广告和扫描。默认配置只会一次返回您一个广告设备。如果您从列表中清除它,则不会再次发现它。您可能想要的是CBCentralManagerScanOptionAllowDuplicatesKey(这是scanForPeripherals(withServices:)的一个选项。每次系统看到一个广告包时,您都会被“发现”回叫。然后您可以跟踪上一次您看到了一个设备,并以“足够长的时间”清除了您没有看到的设备。

您也可以盲目地连接到设备(甚至是目前不在使用中的设备),并且当它最终成功时,您将得到回调。这实际上是一种非常常见的技术(这是我最常使用的技术)。它甚至可以在应用程序在后台使用。当设备进入范围时,您将被启动。