【发布时间】: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 的缓存,所以实际上并没有做任何事情。
标签: ios core-bluetooth