【发布时间】:2015-01-13 20:37:01
【问题描述】:
我正在尝试使用以下语句发现心率监测器:
[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:SERVICE_HR]] options:@{@"CBCentralManagerScanOptionAllowDuplicatesKey":@NO} ];
SERVICE_HR 定义为心率服务号。
当我阅读文档时,我给出的选项是将同一设备的所有发现合并到一个发现事件中。我正在扫描 2.2 秒,只有一个心率监测器可用,并获得 2 或 3 个发现。由于 HR 监视器每秒发布一次广告,因此如果每个广告都是单独“发现”的,那么这是有道理的。我收到以下回调 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 错误吗?
-
我重启了手机,从手机中删除了应用程序,并“清理”了 Xcode,但同样的事情发生了。
-
这不是错误。它是关于当外围设备支持主动扫描时过滤额外的发现数据包。这个答案解释了它:stackoverflow.com/a/11731243/2128900,进一步解释:lists.apple.com/archives/bluetooth-dev/2012/Apr/msg00047.html。即使将
CBCentralManagerScanOptionAllowDuplicatesKey设置为NO,您也会收到多个针对同一外设的委托回调。您只需要在将外围设备添加到数组之前检查它是否已经存在。
标签: ios bluetooth bluetooth-lowenergy core-bluetooth