CoreBluetooth 在重新连接时未发现服务
Posted
技术标签:
【中文标题】CoreBluetooth 在重新连接时未发现服务【英文标题】:CoreBluetooth doesn't discover services on reconnect 【发布时间】:2015-02-02 19:36:57 【问题描述】:我们有一个应用程序正在与我们自己的 BLE 设备进行通信。当我们推送新固件时,我们会重新启动并获得centralManager: didDisconnectPeripheral: error:
和centralManager: didConnectPeripheral:
,但是当我们调用[peripheral discoverServices:nil]
时,我们永远不会收到peripheral: didDiscoverServices:
的回调。我们在最初连接时得到它,但在重新连接时却没有。 CoreBluetooth 似乎知道服务和特征是什么,因为我们可以与设备进行交互,但我们希望能够在重启后立即编写特征,但找不到可靠的方法来判断何时是。
-= 编辑 =-
这是我们用来编写特征的代码。当我们尝试在第二次调用 didConnect
时调用它时,它会失败,因为外围设备没有任何服务:
+(void)writeData:(NSData*)data toPeripheral:(CBPeripheral*)peripheral service:(NSString*)sCBUUID characteristic:(NSString*)cCBUUID
// Sends data to BLE peripheral to process HID and send EHIF command to PC
for(CBService *service in peripheral.services)
if([service.UUID.stringValue isEqualToString:sCBUUID])
for(CBCharacteristic *characteristic in service.characteristics)
if([characteristic.UUID.stringValue isEqualToString:cCBUUID])
/* EVERYTHING IS FOUND, WRITE characteristic ! */
[peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
return;
【问题讨论】:
第二次打到didConnectPeripheral
,你就不能看书吗?
我们尝试过但失败了,因为此时外围设备不知道它的服务。我用更多信息更新了我的问题。
我也遇到过类似的问题。原来,ios 在内部缓存了特征描述符。固件更新后,外围设备中的描述符表发生了某种变化,手机无法再发现它们(直到手机重新启动)。我会向我的固件同事询问更多详细信息。
@MichałCiuba 非常酷!我期待听到您的回复。
是的,我们做到了。我们调用NSArray * peripherals = [self.centralManager retrieveConnectedPeripheralsWithServices:self.allServices];
,它返回CoreBluetooth 认为它连接到的设备列表。因为它有那些调用 discoverServices 的缓存,所以实际上并没有做任何事情。
【参考方案1】:
我记得在我与 CoreBluetooth 的合作中,这种行为是有意的,因为它是以这种方式记录的。一旦断开连接,我们不应该重用相同的外围实例。 Instead we should ask CBCentralManager to give us a fresh CBPeripheral using its known peripheral UUID. 另见:CBCentralManager.retrievePeripheralsWithIdentifiers:
【讨论】:
你能找出问题所在吗? 是的,我已经重写了我的答案 感谢@Lars 重写答案。那么,断开并重新连接后是否清除了服务和特征缓存? 不,缓存没有被清除。事实上,iOS 会缓存服务和特征。它只会在你重启 iOS 时清除缓存。 但是,一旦断开连接,您需要获得一个新的 CBPeripheral。只需在新实例上调用 connect 并等待它连接。一旦它在附近,它将连接。如果您还有其他问题,请告诉我。以上是关于CoreBluetooth 在重新连接时未发现服务的主要内容,如果未能解决你的问题,请参考以下文章
Tomcat 在数据库重新启动时未重新连接 PostgreSQL JDBC 池
未使用 CoreBluetooth (iPhone 6) 接收外围设备发现回调