为什么iOS蓝牙会发现同一设备多次?

3

我正在寻找一款心率监测器,根据以下声明:

[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:SERVICE_HR]] options:@{@"CBCentralManagerScanOptionAllowDuplicatesKey":@NO} ];

SERVICE_HR被定义为心率服务号码。

根据文档,我给出的选项是将同一设备的所有发现合并为单个发现事件。我正在扫描仅有一个心率监测器的2.2秒,并且得到2或3个发现。由于心率监测器每秒广告一次,如果每次广告都被单独“发现”,这就很有道理了。我会收到以下回调2或3次:

 (void)centralManager:(CBCentralManager *)central
 didDiscoverPeripheral:(CBPeripheral *)peripheral
     advertisementData:(NSDictionary *)advertisementData
                  RSSI:(NSNumber *)RSSI

我将每个回调函数的数据保存在可变数组中。以下是包含两个发现的数组:
(lldb) po [RCLBTLE sharedBTLE].discoveredPeripherals
<__NSArrayM 0x17404bc70>(
<CBPeripheral: 0x1700f8180, identifier = 1DC9167F-6DB8-4216-5217-B1E8B2F3FB90, name = Polar H7 3F1DE71C, state = disconnected>,
<CBPeripheral: 0x1700f8180, identifier = 1DC9167F-6DB8-4216-5217-B1E8B2F3FB90, name = Polar H7 3F1DE71C, state = disconnected>
)

您可以看到同一设备被发现了两次,但我认为它只应该被发现一次。我做错了什么?还是我理解错了什么?


很好的发现!我搜索了但没有找到那个。那里唯一建议的答案是信号弱,但我的信号是-55 dB或-60 dB,应该没问题。我正在重新启动手机以查看他们提出的其他建议答案,但即使这样解决了问题,问题仍然存在,为什么会发生这种情况?这是已知的iOS漏洞吗? - RobertL
我重新启动了手机,从手机中删除了应用程序,并“清理”了Xcode,但仍然发生相同的事情。 - RobertL
1
这不是一个错误。当外设支持主动扫描时,它会过滤掉其他的发现包。这个答案解释了这个问题:https://dev59.com/v2gu5IYBdhLWcg3wHzoX#11731243,更多的解释请参考:http://lists.apple.com/archives/bluetooth-dev/2012/Apr/msg00047.html。即使将`CBCentralManagerScanOptionAllowDuplicatesKey`设置为“NO”,您仍然会收到同一外设的多个委托回调。在将其添加到数组之前,您只需要检查外设是否已经存在即可。 - Michał Ciuba
1个回答

2

在指定扫描时,请使用以下代码:

[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:TRANSFER_SERVICE_UUID]] options:@{CBCentralManagerScanOptionAllowDuplicatesKey :@NO}];

如果将上述键指定为 @YES,则无论何时检测到设备,都会检测到它。


1
如果您仔细阅读原始问题,您会发现我正在使用您建议的完全相同的代码,但我正在收到多个回调。 - RobertL
但这是用于获取单个/多个检测的代码。尝试在发现外围设备后调用centralmanager的stopScan,并查看是否仍然会多次调用。 - krishnanunni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接