3

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

有人有经验或解决方案来存储/缓存CBService或CBCharacteristic或确实有人知道更快地重新连接的方法吗?

感谢所有帮助

+0

你问如何缓存在应用程序中的东西吗? – 2013-02-14 23:49:45

+1

这将是缓存服务和特性的解决方案,但我已经尝试制作服务的副本。但不幸的是CBPeripheral,CBService和CBCharacteristic都没有采用NSCopying。有另一种方式来存储它们吗? – 2013-02-15 07:49:48

+0

您可以将Pripheral放入数组中。您可以使用NSUserDefaults类 – 2013-02-19 12:23:28

回答

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上加快速度的方法(除了保持与外设的连接)。

+0

谢谢你的回答。我已经填写了一份错误报告,苹果告诉我,他们正在缓存服务和特性。但我已经用我的外设测试过了,我看到了相同的连接间隔。这种缓存仅适用于2个iOS设备还是第三方外设? – 2013-04-18 15:13:06

+1

如果您使用第三方外设建立加密链接,它应该可以使用。自己没有测试过。 – 2013-04-23 18:33:44

+0

它是一个加密的连接?因为目前我连接到我的外设没有任何加密 – 2013-04-25 20:45:25

3

iOS 7增加了额外的缓存(iOS 7: What's New in Bluetooth LE)。我看到,重新连接外设的时间少于100ms(平均约80ms),发现服务,发现特性并阅读单个特性的价值。

我的测试配置为一台iPad的空气连接到一台iPad 3

+0

Darrinm,你能指定文章中缓存解释的确切位置吗?我可能很愚蠢,我似乎无法找到它。 – Max 2014-01-08 19:49:36

+0

@Max没有太多的解释,只有“外围数据缓存增强了每个特性和服务的更多数据,包括每个特性的最后一个已知值。”因此,我计算了整个连接/发现服务/发现特性/读取值过程,以了解新缓存所作的改进。 – darrinm 2014-01-09 02:02:41