为啥 CoreBluetooth 一次又一次地发现相同的外设?

Posted

技术标签:

【中文标题】为啥 CoreBluetooth 一次又一次地发现相同的外设?【英文标题】:Why Is CoreBluetooth Discovering the Same Peripheral Again, and Again, and Again?为什么 CoreBluetooth 一次又一次地发现相同的外设? 【发布时间】:2017-04-11 16:37:25 【问题描述】:

我在 *** 上查看了类似的问题,但它们都处理了由于接收到扫描响应数据而对 CBManager 委托的 didDiscover 方法的第二次调用。我的情况不同。

我坐在家里的办公桌前。我的应用在 iPhone 6、ios 10.2 上运行。我的应用程序在没有指定任何服务 uuid 的情况下开始扫描(即发现所有外围设备)。我的应用程序未连接到发现的任何外围设备。正在发现五种不同的外围设备,其中包括我开发的 MacBook Pro,它通过 USB/Lightening 电缆连接到 iPhone。

我的应用程序在 MacBook Pro 上表现异常。 MacBook Pro 一次又一次地调用 didDiscover 方法。最后它停止了;直到我移动 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:

首先是一些附加信息:

    我将 nil 传递给 scanForPeripherals 方法的 options 参数 如果我连接到 MacBook Pro,则调用 didDiscover 的频率会从大约每秒减少到大约每分钟。

但是,正如 CuriousRabbit 指出的那样,那又如何呢?好吧,鉴于这种行为不是我疏忽的结果,我剩下的就是:我如何编码?目前,我最好的选择是:

    第一次调用 didDiscover - 执行我所做的以响应发现的外围设备。 第二次调用 - 可能有感兴趣的扫描响应数据;见here 后续调用 - 忽略

你们觉得这对吗?

而且,如果这里学到的教训是期望在外围设备发送广告数据包时调用 didDiscover(重新 CuriousRabbit 的“你的 MacBook 正在积极地广告”评论),那么为什么我看不到其他四个外围设备的这种行为?

【问题讨论】:

因为您的 MacBook 一直在 BLE 中显示“我在这里”(广告)。 CBCentralManager“并不总是跟踪”设备,它只是通过触发委托方法 didDiscoverDevice 来响应广告。我猜你在扫描方法中设置了允许重复键? 它不断发现你的 Mac 是因为它在广告中咄咄逼人?为什么这有关系?这里有什么问题? @Larme 我将 nil 传递给 scanForPeripherals 方法的选项参数。 @CuriousRabbit 好的,我经常看到它,因为 MacBook 经常做广告。那么,为什么我在其他外围设备上看不到它呢?尽管如此,我明白你 - 那又怎样?我将更新我的问题。 @Verticon - 我不知道为什么不经常看到其他外围设备。我猜 MacBook 在功率方面并没有那么保守,广告频率也很高,但由于缺乏了解,我不再推测。 【参考方案1】:

对于未指定 CBCentralManagerScanOptionAllowDuplicatesKey 的情况,Apple documentation(请参阅“仅在必要时指定 CBCentralManagerScanOptionAllowDuplicatesKey 选项”部分)指出,只要广告数据变化。

我观察到的是,如果信号强度 (rssi) 发生变化,也会发生重复调用。 对于 MacBook Pro,rssi 值会上下波动(尽管有时会有两个背靠背日志陈述,其中它没有改变,但一般来说它正在改变)。广告数据永远不会改变。还;在极少数情况下,当发现其他外围设备之一重复发现外围设备时,更改的是 rssi 值。

我非常有信心 rssi 的变化可以解释我所看到的行为。

【讨论】:

以上是关于为啥 CoreBluetooth 一次又一次地发现相同的外设?的主要内容,如果未能解决你的问题,请参考以下文章

使用循环一次又一次地迭代

为啥Android系统一次又一次将相同的内容绘制到画布上

Push sharp:一次又一次地发送相同的消息

一次又一次地解析错误[关闭]

Git rebase 一次又一次地回到同一个地方

一次又一次地初始化时,指针在循环内做了啥?