我正在尝试通过BLE从iPhone向设备写入特定命令。为此,我必须先发送另一个命令,该命令将当前模式切换为COMMAND MODE,即用于处理和解释手机中的命令的模式。成功设置命令模式后,我将相应地收到一个ACK。我希望在收到ACK后恢复发送所需的命令。如何让我的函数等待ACK事件发生?
-(void) sendCommand(){
switchToCommandMode();
//How to achieve this:
//wait until ACK is received.
//
sendTheDesiredCommand();
}
答案 0 :(得分:2)
您可以通过以下方式在BLE特性上写入某个状态值来编写命令以切换外围设备的状态:
[peripheral writeValue:value forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
一旦特征被写入,didWriteValueForCharacteristic回调将被触发,在这里您有机会发送所需的命令:
-(void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
if([characteristic.UUID isEqual:[CBUUID UUIDWithString:"STATUS_CHARACTERISTC"]]){
//Status written: Write your command here
}}
请记住首先在CBPeripheral对象上设置CBPeripheralDelegate:CBPeripheralDelegate对象将是将在其中实现didWriteValueForCharacteristic方法的对象(例如,它可能是正在执行BLE操作的viewController,但您可以分配一个单独的对象对象)。请注意,如果您忘记设置CBPeripheralDelegate,则不会触发该回调方法。
另一种方法是,每次外围设备上的状态特征发生变化时,首先注册您的应用以接收BLE通知。这样,当您更改外围设备状态时(例如,如上所述编写BLE特性),iOS应用程序上的CBPeripheralDelegate将自动得到通知,在这种情况下,将触发didUpdateValueForCharacteristic回调:
-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{
if([characteristic.UUID isEqual:[CBUUID UUIDWithString:"STATUS_CHARACTERISTC"]]){
NSData *dataValue = characteristic.value;
NSString *stringValue = [[NSString alloc] initWithData:dataValue encoding:NSUTF8StringEncoding];
NSLog(@"Status changed in: %@", stringValue);
//Send desired command here
}}
为了激活特征上的通知值:
[peripheral setNotifyValue:YES forCharacteristic:c];