15

我想要一个我的 iOS 可以连接的 ble 设备列表,当 ble 设备出现和消失时会刷新。

为了做到这一点,我创建了一个NSMutableDictionnary* peripheralsAvailable,并且每次- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;被 CBCentralManager 调用,我将外围设备添加到 peripheralsAvailable 字典中(然后更新 UITableView)。这里一切正常。

但是,如果外围设备“消失”,我找不到如何更新字典。似乎我只能在检测到外围设备时在我的字典中添加外围设备,但例如当我关闭它时我无法删除它。

如果我遗漏了什么,你能告诉我吗?

4

2 回答 2

10

操作系统将缓存设备发现。即每台设备您只会获得一个“发现”事件。

要在外围设备广告时不断获取发现事件,您必须使用以下选项:

CBCentralManagerScanOptionAllowDuplicatesKey

一个布尔值,指定扫描是否应在不进行重复过滤的情况下运行。

这个键的值是一个 NSNumber 对象。如果是,则过滤被禁用,并且每次中央接收到来自外围设备的广告数据包时都会生成一个发现事件。禁用此过滤可能会对电池寿命产生不利影响,应仅在必要时使用。如果否,则将同一外围设备的多个发现合并为单个发现事件。如果未指定键,则默认值为 NO。

将上述选项设置为YES,您可以跟踪所有正在广告的外围设备,当它停止广告时,您可以将其从列表中删除。

对于您已连接的设备,有didDisconnectPeripheral委托事件。


蓝牙设备不会宣传它们即将消失,也不会宣传您即将超出范围。当他们在做广告并且您在范围内时,您会收到广告,而当您超出范围或他们停止广告时,您什么也得不到。当他们离开时,没有事件可以触发。您必须记住正在投放广告的设备,当它们停止投放广告时(您有一段时间没有收到广告),您可以将其从列表中删除。

于 2015-06-10T14:15:25.940 回答
1

马库斯的回答很好。要添加的另一个注意事项是,上面提到的扫描选项 CBCentralManagerScanOptionAllowDuplicatesKey 在后台不起作用。

已指定 bluetooth-central 后台模式的应用程序可以在后台进行扫描。也就是说,他们必须通过在 serviceUUIDs 参数中指定一项或多项服务来显式扫描它们。在后台扫描时忽略 CBCentralManager 扫描选项。

于 2017-10-12T04:24:24.637 回答