3

我正在开发一个应用程序,它可以多次连接和断开不同的蓝牙低功耗外围设备。在互联网上进行了大量研究后,我没有找到一种方法来存储已经发现的服务和特征,以便我可以更快地重新连接。目前,我在每次重新连接后发现所需的服务和特征,这花费了我 1.5 到 2 秒。

是否有人有存储/缓存 CBService 或 CBCharacteristic 的经验或解决方案,或者是否有人知道更快重新连接的方法?

谢谢你的帮助

4

2 回答 2

6

我尝试在内存中缓存外围设备、服务和特征对象,但手动缓存不起作用。一旦与外围设备断开连接,服务和特征对象将不再有效使用。事实上,即使是 CBPeripheral 也可以从你下面改变——CoreBluetooth 有一个内部行为,设备 UDID 每隔几分钟就会改变一次(如果 CBPeripheral 是另一个 iOS 设备)。

但是,如果您正在为 iOS 6 进行开发,有一种方法可以加快速度。如果您观看WWDC 2012 上的高级蓝牙演讲,您会看到一张关于缓存服务和特性的幻灯片。本质上,操作系统可以为您缓存它们,但仅限于配对设备。要配对,您需要以身份验证不足错误响应写入请求。例如,对于 iOS 外围设备,您可以编写如下内容:

- (void)peripheralManager:(CBPeripheralManager *)peripheralManager didReceiveWriteRequests:(NSArray *)requests {
      ...

      [peripheralManager respondToRequest:request withResult:CBATTErrorInsufficientAuthentication];

      ...
}

这将在 iOS 外围设备上弹出一个配对对话框,之后您将进行配对。除此之外,您不必更改代码——只需像往常一样调用discoverServices 等,它们会更快地响应(即立即)。

我还在 10.8.3 上测试了这种行为,但它似乎不起作用。所以,我不知道在 OS X 上加快速度的方法(除了保持与外围设备的连接)。

于 2013-04-17T03:52:34.547 回答
3

iOS 7 添加了额外的缓存(iOS 7:Bluetooth LE 中的新增功能)。我看到重新连接到外围设备、发现服务、发现特征和读取单个特征值的总时间不到 100 毫秒(平均约 80 毫秒)。

我的测试配置是连接 iPad 3 的 iPad Air。

于 2013-11-14T19:31:19.877 回答