当外围设备消失时如何使用 CoreBluetooth 进行检测?
How to detect with CoreBluetooth when a peripheral disappears?
我想要一份我的 iOS 可以连接的 ble 设备列表,当 ble 设备出现和消失时会刷新。
为了做到这一点,我创建了一个 NSMutableDictionnary* peripheralsAvailable
,每次 CBCentralManager 调用 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;
时,我都会将外围设备添加到 peripheralsAvailable 字典(然后更新一个 UITableView)。这里一切正常。
但是,如果是外围设备 "disappear",我找不到如何更新字典。貌似我只能在检测到外设时在我的字典中添加,但是当我关闭它时我不能删除一个。
你能告诉我是否遗漏了什么吗?
OS 将缓存设备发现。 IE。每台设备只能获得一个 "discovery" 事件。
要在外设广播时持续获取发现事件,您必须使用以下选项:
CBCentralManagerScanOptionAllowDuplicatesKey
A Boolean value that specifies whether the scan should run without
duplicate filtering.
The value for this key is an NSNumber object. If YES, filtering is
disabled and a discovery event is generated each time the central
receives an advertising packet from the peripheral. Disabling this
filtering can have an adverse effect on battery life and should be
used only if necessary. If NO, multiple discoveries of the same
peripheral are coalesced into a single discovery event. If the key is
not specified, the default value is NO.
将上述选项设置为 YES
,您可以跟踪所有正在广播的外围设备,当它停止广播时,您可以将其从列表中删除。
对于您已连接的设备,存在 didDisconnectPeripheral
委托事件。
蓝牙设备不会通知它们即将离开,也不会通知您即将超出范围。当他们正在做广告并且您在范围内时,您会收到广告,而当您超出范围或他们停止广告时,您什么也得不到。当他们离开时,没有事件可以触发。您必须记住正在播放广告的设备,当它们停止播放广告时(您有一段时间没有收到广告),您可以将其从列表中删除。
Marcus 的回答很棒。要添加的另一项说明是,如上所述的扫描选项 CBCentralManagerScanOptionAllowDuplicatesKey 在后台不起作用。
指定了bluetooth-central后台模式的应用可以在后台进行扫描。也就是说,它们必须通过在 serviceUUIDs 参数中指定来显式扫描一项或多项服务。在后台扫描时忽略 CBCentralManager 扫描选项。
我想要一份我的 iOS 可以连接的 ble 设备列表,当 ble 设备出现和消失时会刷新。
为了做到这一点,我创建了一个 NSMutableDictionnary* peripheralsAvailable
,每次 CBCentralManager 调用 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI;
时,我都会将外围设备添加到 peripheralsAvailable 字典(然后更新一个 UITableView)。这里一切正常。
但是,如果是外围设备 "disappear",我找不到如何更新字典。貌似我只能在检测到外设时在我的字典中添加,但是当我关闭它时我不能删除一个。
你能告诉我是否遗漏了什么吗?
OS 将缓存设备发现。 IE。每台设备只能获得一个 "discovery" 事件。
要在外设广播时持续获取发现事件,您必须使用以下选项:
CBCentralManagerScanOptionAllowDuplicatesKey
A Boolean value that specifies whether the scan should run without duplicate filtering.
The value for this key is an NSNumber object. If YES, filtering is disabled and a discovery event is generated each time the central receives an advertising packet from the peripheral. Disabling this filtering can have an adverse effect on battery life and should be used only if necessary. If NO, multiple discoveries of the same peripheral are coalesced into a single discovery event. If the key is not specified, the default value is NO.
将上述选项设置为 YES
,您可以跟踪所有正在广播的外围设备,当它停止广播时,您可以将其从列表中删除。
对于您已连接的设备,存在 didDisconnectPeripheral
委托事件。
蓝牙设备不会通知它们即将离开,也不会通知您即将超出范围。当他们正在做广告并且您在范围内时,您会收到广告,而当您超出范围或他们停止广告时,您什么也得不到。当他们离开时,没有事件可以触发。您必须记住正在播放广告的设备,当它们停止播放广告时(您有一段时间没有收到广告),您可以将其从列表中删除。
Marcus 的回答很棒。要添加的另一项说明是,如上所述的扫描选项 CBCentralManagerScanOptionAllowDuplicatesKey 在后台不起作用。
指定了bluetooth-central后台模式的应用可以在后台进行扫描。也就是说,它们必须通过在 serviceUUIDs 参数中指定来显式扫描一项或多项服务。在后台扫描时忽略 CBCentralManager 扫描选项。