如何使用Objective-C使功能等待通过BLE接收到来自设备的ACK?

时间:2019-04-11 05:31:42

标签: ios objective-c

我正在尝试通过BLE从iPhone向设备写入特定命令。为此,我必须先发送另一个命令,该命令将当前模式切换为COMMAND MODE,即用于处理和解释手机中的命令的模式。成功设置命令模式后,我将相应地收到一个ACK。我希望在收到ACK后恢复发送所需的命令。如何让我的函数等待ACK事件发生?

-(void) sendCommand(){

switchToCommandMode();

//How to achieve this:
//wait until ACK is received.
//

sendTheDesiredCommand();

}

1 个答案:

答案 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];