这个问题在十月份已经被讨论过了,链接。由于CoreBluetooth是相对较新的技术,自那时以来可能发生了一些变化,所以这是一个新问题。
我有一个每2秒广告的BLE设备。扫描是通过以下方式启动的:
[self.CM scanForPeripheralsWithServices:nil options:0]
这段代码通过中央管理器 (CentralManager) 的 didDiscoverPeripheral 回调函数返回一个结果,通常需要2到4秒的时间。
然而,约30%的情况下,扫描需要10到18秒的时间。附近设备的WiFi和蓝牙已被禁用以尽可能清除频谱干扰。扫描时间似乎与RSSI(接收信号强度指示)无关,在与iPAd3相邻时为-40dB,在另一房间约5米远时为-70dB。
[self.CM stopScan];
在 scanWithPeripherals 之前,需要调用这个函数,以减少长时间等待的发生。
没有建立连接,也没有请求任何特征或服务数据。广告数据就足够了。
有一个TI的演示应用程序非常有用。它可以提供类似的结果(实际上稍微差一些,因为它没有进行任何 stopScan 调用)。
CBCentralManagerScanOptionAllowDuplicatesKey 选项在这个 Stackoverflow 回答中提到,如果使用该选项反而会延长发现时间。
显然,下一步是使用一些更高级的 BT 嗅探器 / 广告生成工具来进一步表征这个 CoreBluetooth 响应。
这是另一个有用的 SO 问题,但对响应时间的解释不够详细。