【问题标题】:Reconnect a CBPeripheral faster更快地重新连接 CBPeripheral
【发布时间】:2013-01-30 00:37:23
【问题描述】:

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

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

感谢您的帮助

【问题讨论】:

  • 你在问如何在你的应用程序中缓存一些东西吗?
  • 这将是缓存服务和特征的解决方案,但我已经尝试制作服务的副本。但遗憾的是 CBPeripheral、CBService 和 CBCharacteristic 都没有采用 NSCopying。有没有其他存储方式?
  • 您可以将 Pripheral 放在一个数组中。您可以使用 NSUserDefaults 类将该数组“保存”为用户默认值
  • 感谢@Areal-17 的意见。我试图在 NSUserDefaults 类中保存一个 CBPeripheral,但不幸的是只能存储属性值。这是错误输出: [NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '( { peripheral = " A8BB2F03-A42D-CC4E-9206-B936AA2AB663, Name = \" '__NSArrayM' 类的 LightControl Device\", IsConnected = NO>"; } )'。请注意,属性列表中的字典和数组也必须只包含属性值。
  • didDiscoverPeripheral: peripheral 委托方法中,您将发现的外设添加到数组中。例如:id peripheralUUID = (id)peripheral.UUID; if (![self.discoveredPeripherals containsObject:peripheralUUID]) { [self.discoveredPeripherals addObject:peripheralUUID]; }self.discoveredPeripherals 是一个 NSMutableArray 属性。下一步是使用 setObjectForKey: 设置 userDefault。重要的是将 CBUUID 对象转换为 id。

标签: ios objective-c core-bluetooth bluetooth-lowenergy cbperipheral


【解决方案1】:

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

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

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

      [peripheralManager respondToRequest:request withResult:CBATTErrorInsufficientAuthentication];

      ...
}

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

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

【讨论】:

  • 感谢您的回答。我已经填写了一份错误报告,Apple 告诉我,他们正在缓存服务和特征。但是我已经用我的外围设备进行了测试,我看到了同样缓慢的连接间隔。此缓存是否仅适用于 2 个 iOS 设备或也适用于第 3 方外围设备?
  • 如果您与第三方外围设备建立加密链接,它应该可以与它一起使用。自己没有测试过。
  • 对。只有加密的连接才能获得缓存行为。
  • 我相信配对过程会建立一个加密链接。当您尝试连接时,iOS 会弹出一个警报,要求用户配对或取消。在经理方面,您无需为配对做任何事情。我不知道它在外围方面是如何工作的。
  • @Williamhenderson 您写道“CoreBluetooth 有一个内部行为,设备 UDID 每隔几分钟就会更改一次(如果 CBPeripheral 是另一个 iOS 设备)。”我很想阅读更多关于这方面的信息,你能把我链接到你从哪里得到这些信息吗?
【解决方案2】:

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

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

【讨论】:

  • Darrinm,你能具体说明缓存解释在文章中的位置吗?我可能很愚蠢,我似乎找不到它。
  • @Max 没有太多解释,只有“外围数据缓存 [...] 得到了增强,包含来自每个特性和服务的更多数据,包括每个特性和服务的最后已知值特征。”因此,我对整个连接/发现服务/发现特征/读取值过程进行了计时,以查看新缓存的改进程度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 2013-03-28
  • 2014-04-22
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
相关资源
最近更新 更多