为什么 CoreBluetooth 一次又一次地发现相同的外围设备?
Why Is CoreBluetooth Discovering the Same Peripheral Again, and Again, and Again?
我在 Whosebug 上查看了类似的问题,但它们都处理由于收到扫描响应数据而对 CBManager 委托的 didDiscover 方法的第二次调用。我的情况不同。
我坐在家里的办公桌前。我的应用是 运行 iPhone 6,iOS 10.2。我的应用程序在未指定任何服务 uuid 的情况下开始扫描(即发现所有外围设备)。我的应用程序未连接到发现的任何外围设备。正在发现五种不同的外围设备,其中包括我的开发版 MacBook Pro,它通过 USB/Lightening 电缆连接到 iPhone。
我的应用程序在 MacBook Pro 上表现异常。 didDiscover 方法被 MacBook Pro 一次又一次地调用,一秒又一秒。最后它停止了;直到我移动 MacBook Pro 的光标或点击键盘上的某个键;然后它又开始了。其他四台外围设备不会出现这种情况,其中有两台 Apple TV。
这是我的 didDiscover 方法:
@objc func centralManager(_ manager: CBCentralManager, didDiscover cbPeripheral: CBPeripheral, advertisementData data: [String : Any], rssi signalStrength: NSNumber) {
NSLog("Peripheral discovered: \(cbPeripheral)")
}
这是来自控制台的示例:
不知道怎么想的。我想不出任何我可以尝试或检查的东西,以揭示有关正在发生的事情的更多信息。任何想法将不胜感激。
更新 1:
首先补充一些信息:
- 我正在为 scanForPeripherals 方法的选项参数传递 nil
- 如果我连接到 MacBook Pro,那么调用 didDiscover 的频率会从大约每秒减少到大约每分钟。
但是,正如 CuriousRabbit 指出的那样,那又怎样?好吧,鉴于这种行为不是我疏忽的结果,我剩下的是:我如何编码?目前,我最好的拍摄是:
- 第一次调用 didDiscover - 执行我所做的以响应发现外围设备。
- 第二次调用 - 可能有感兴趣的扫描响应数据;见 here
- 后续调用 - 忽略
你们觉得这对吗?
并且,如果这里的教训是期望 didDiscover 在外围设备发送广告数据包时被调用(关于 CuriousRabbit 的 "your MacBook is advertising aggressively" 评论),那么为什么我看不到其他四个外围设备的这种行为?
对于未指定 CBCentralManagerScanOptionAllowDuplicatesKey 的情况 ,Apple documentation(请参阅 "Specify the CBCentralManagerScanOptionAllowDuplicatesKey Option Only When Necessary" 部分)声明重复调用 didDiscoverPeripheral 方法将每当广告数据改变时发生。
我观察到的是,如果信号强度 (rssi) 发生变化,也会发生重复呼叫。 对于 MacBook Pro,rssi 值会上下波动(尽管有时会有两个背靠背的日志语句,其中它没有改变但通常它正在改变)。广告数据永远不会改变。还;在为其他外围设备之一重复 discoverPeripheral 的极少数情况下,更改的是 rssi 值。
我非常相信 rssi 的变化可以解释我所看到的行为。
我在 Whosebug 上查看了类似的问题,但它们都处理由于收到扫描响应数据而对 CBManager 委托的 didDiscover 方法的第二次调用。我的情况不同。
我坐在家里的办公桌前。我的应用是 运行 iPhone 6,iOS 10.2。我的应用程序在未指定任何服务 uuid 的情况下开始扫描(即发现所有外围设备)。我的应用程序未连接到发现的任何外围设备。正在发现五种不同的外围设备,其中包括我的开发版 MacBook Pro,它通过 USB/Lightening 电缆连接到 iPhone。
我的应用程序在 MacBook Pro 上表现异常。 didDiscover 方法被 MacBook Pro 一次又一次地调用,一秒又一秒。最后它停止了;直到我移动 MacBook Pro 的光标或点击键盘上的某个键;然后它又开始了。其他四台外围设备不会出现这种情况,其中有两台 Apple TV。
这是我的 didDiscover 方法:
@objc func centralManager(_ manager: CBCentralManager, didDiscover cbPeripheral: CBPeripheral, advertisementData data: [String : Any], rssi signalStrength: NSNumber) {
NSLog("Peripheral discovered: \(cbPeripheral)")
}
这是来自控制台的示例:
不知道怎么想的。我想不出任何我可以尝试或检查的东西,以揭示有关正在发生的事情的更多信息。任何想法将不胜感激。
更新 1:
首先补充一些信息:
- 我正在为 scanForPeripherals 方法的选项参数传递 nil
- 如果我连接到 MacBook Pro,那么调用 didDiscover 的频率会从大约每秒减少到大约每分钟。
但是,正如 CuriousRabbit 指出的那样,那又怎样?好吧,鉴于这种行为不是我疏忽的结果,我剩下的是:我如何编码?目前,我最好的拍摄是:
- 第一次调用 didDiscover - 执行我所做的以响应发现外围设备。
- 第二次调用 - 可能有感兴趣的扫描响应数据;见 here
- 后续调用 - 忽略
你们觉得这对吗?
并且,如果这里的教训是期望 didDiscover 在外围设备发送广告数据包时被调用(关于 CuriousRabbit 的 "your MacBook is advertising aggressively" 评论),那么为什么我看不到其他四个外围设备的这种行为?
对于未指定 CBCentralManagerScanOptionAllowDuplicatesKey 的情况 ,Apple documentation(请参阅 "Specify the CBCentralManagerScanOptionAllowDuplicatesKey Option Only When Necessary" 部分)声明重复调用 didDiscoverPeripheral 方法将每当广告数据改变时发生。
我观察到的是,如果信号强度 (rssi) 发生变化,也会发生重复呼叫。 对于 MacBook Pro,rssi 值会上下波动(尽管有时会有两个背靠背的日志语句,其中它没有改变但通常它正在改变)。广告数据永远不会改变。还;在为其他外围设备之一重复 discoverPeripheral 的极少数情况下,更改的是 rssi 值。
我非常相信 rssi 的变化可以解释我所看到的行为。