CoreBluetooth 扫描检测时间在 MacOS 上不可靠

CoreBluetooth scan detection times unreliable on MacOS

在 MacOS 上扫描 BluetoothLE 制造商广告时,发现回调的频率远低于 iOS。对于以 10 Hz 广播的发射器,iOS 每秒获得​​近 10 个发现回调。在 MacOS 上,通常每秒会看到 1-3 次回调,但有时回调之间可能会间隔很多秒——有几次我测得两次检测之间的间隔超过 90 秒!下面是我做的图表,显示了在大约两个小时的测试 运行 中发现之间的秒数。

为什么与 iOS 相比,MacOS 上的发现时间如此不可预测?有没有办法让回调更靠谱?

我在 MacBook Pro(Retina,15 英寸,2014 年年中)上的 macOS Sierra 10.12.6 上记录了这些数据,但我听到同事抱怨在较新的 MacBook 上存在类似的不可靠性。

centralManager = CBCentralManager(delegate: self, 
                                  queue: DispatchQueue.global(qos: .default))
centralManager.scanForPeripherals(withServices: nil, 
                                  options: [CBCentralManagerScanOptionAllowDuplicatesKey: true])

...

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
            let secsSinceDetection = Date().timeIntervalSince(self.lastDetectionTime)
            lastDetectionTime = Date()
            NSLog("LDT: \(secsSinceDetection))")
}

我在 MacBook Pro(15 英寸,2017 年)上发现 macOS High Sierra 10.13.3 存在同样的问题。甚至 Apple 的 Bluetooth Explorer 应用程序(Hardware IO Tools 的一部分)也显示了同样的问题。

一些外围设备受到的影响比其他外围设备大。 Apple TV 似乎总是显示得非常快,而其他外围设备则较慢或根本不显示。

相关问题在这里得到解答: CoreBluetooth advertising detection time 显然,CoreBluetooth 并没有连续监听,而是与 Wi-Fi 和普通蓝牙共享天线和资源。我最初认为关闭 Wi-Fi 和 "Handoff" 可以提高看到广告的能力并缩短连接时间。 "Handoff" 在 Apple - 系统偏好设置 - 常规中通过取消选中 "Allow Handoff between this Mac and your iCloud devices" 来关闭,但这可能不是真的。

请注意,问题未出现在 iOS 中,可能是由于更好的 BT 和 Wi-Fi co-existence 支持以及切换(Airdrop)和常规 BLE 使用之间。该问题似乎只是扫描和连接期间 BLE 侦听时间的比例之一。建立连接后,似乎没有那么多干扰。部分原因是,在一个连接之后,low-level BLE 重试和 fixed-in-time 连接间隔之间的跳频。在扫描和建立连接(两者都依赖于查看广告数据包)期间,一个在每个 scanInterval 上依次轮流通过 3 个 BLE 广告通道。从技术上讲,广告渠道不与 Wi-Fi 重叠(参见 http://www.argenox.com/a-ble-advertising-primer/)。

[为更新的信息编辑] 经过更广泛的测试后,macOS 的问题似乎不是来自 Wi-Fi 或 Handoff 的干扰,而是具有更像 Wi-Fi 的 scanWindow 和 scanInterval 设置=36=] 在后台工作。由于对于某些外围设备,有时需要长达 1.5 分钟才能被发现,因此 30/300 的比率加上 1 秒的广告和最多 10 毫秒的随机偏移(因此将 5 毫秒计算为平均偏移)可能需要 (300-30)/5 = 54 间隔(秒)被检测到如果外围设备没有遵循 Apple 的广告间隔指南,这些指南有意远离 300 毫秒的倍数并且运气不好随机移位可能会稍微长一些,这大致就是所看到的。不幸的是,我还没有找到一种方法来强制 macOS 使用类似于 iOS 前景的更高 scanWindow/scanInterval 比率。

[第二次编辑附加信息] 如果在外围设备中遵循 Apple 的 1022.5 毫秒广告时间,那么即使使用 iOS 背景或使用 macOS 30 毫秒 scanWindow 和 300 毫秒扫描间隔,中值时间也大约为 5秒,而最大值约为 19 秒,因此如果 0-10 毫秒随机偏移的运气非常糟糕,可能会更长一些。