为什么CoreBluetooth再次发现同一个外设?
我已经回顾了StackOverflow上的类似问题,但是由于接收到扫描响应数据,他们都处理第二次调用CBManager委托的didDiscover方法。 我的情况是不同的。
我坐在家中的桌子上。 我的应用程序运行在iPhone 6,iOS 10.2上。 我的应用程序开始扫描,没有指定任何服务uuids(即发现所有外设)。 我的应用程序不连接到任何发现的外围设备。 五种不同的外围设备正在被发现,其中我的开发MacBook Pro通过USB / Lightening电缆连接到iPhone。
我的应用程序在MacBook Pro方面的performance很奇怪。 didDiscover方法被一次又一次地调用MacBook Pro,第二次。 最后停下来; 直到我移动MacBook Pro的光标或点击键盘上的一个键; 然后重新开始。 其他四款外设都没有出现,其中两款是苹果电视。
这是我的didDiscover方法:
@objc func centralManager(_ manager: CBCentralManager, didDiscover cbPeripheral: CBPeripheral, advertisementData data: [String : Any], rssi signalStrength: NSNumber) { NSLog("Peripheral discovered: \(cbPeripheral)") }
这里是一个来自控制台的示例:
我不知道该怎么想。 我不能拿出任何我可能会尝试或检查的东西,以揭示更多关于正在发生的事情的信息。 任何想法将不胜感激。
更新1:
首先一些额外的信息:
- 我传递零的scanForPeripherals方法的选项参数
- 如果我连接到MacBook Pro,那么对didDiscover的调用频率从大约每一秒钟减less到大约每分钟。
但是,正如CuriousRabbit所指出的那样呢? 那么,鉴于这种行为不是我的一些监督的结果,我留下的是:我如何编码? 目前,我的最佳投篮是:
- 首先打电话给didDiscover – 做我所做的,以响应被发现的外设。
- 第二次调用 – 可能存在感兴趣的扫描响应数据; 看到这里
- 随后的电话 – 忽略
这对你们来说似乎是正确的吗?
而且,如果从这里学到的教训是希望在外围设备发送广告数据包时调用didDiscover(re CuriousRabbit的“你的MacBook广告积极广告”评论),那么为什么我没有看到其他四个外设的这种行为?
对于未指定CBCentralManagerScanOptionAllowDuplicatesKey的情况, Apple文档 (请参阅“仅在必要时指定CBCentralManagerScanOptionAllowDuplicatesKey选项”部分)指出,只要广告数据发生更改,就会发生重复调用didDiscoverPeripheral方法。
我正在观察的是,如果信号强度(rssi)改变,重复调用也会发生。 对于MacBook Pro来说,rssi值是反弹的(尽pipe有时候会有两个背靠背的日志语句,其中它不会改变,但总的来说它正在改变)。 广告数据永远不会改变。 也; 在less数情况下,当disDiscoverPeripheral重复其他外设之一时,rssi值已经改变。
我有很高的信心,rssi的变化解释了我所看到的行为。