我们有一个与我们自己的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;
}
}
}
}
}
答案 0 :(得分:1)
我记得在我使用CoreBluetooth的工作中,这种行为是有意的,因为它是以这种方式记录的。断开连接后,我们不应重用相同的外围设备实例。 Instead we should ask CBCentralManager to give us a fresh CBPeripheral using its known peripheral UUID.另请参阅:CBCentralManager.retrievePeripheralsWithIdentifiers: