Ios 如何使用Objective-C使函数等待直到通过BLE接收到来自设备的ACK?

Ios 如何使用Objective-C使函数等待直到通过BLE接收到来自设备的ACK?,ios,objective-c,Ios,Objective C,我正试图通过BLE从iPhone向设备写入特定命令。为此,我必须先发送另一个命令,将当前模式切换为命令模式,即处理和解释手机命令的模式。成功设置命令模式后,我将收到相应的ACK。我希望在收到ACK后继续发送所需的命令。如何使我的函数等待确认事件发生 -(void) sendCommand(){ switchToCommandMode(); //How to achieve this: //wait until ACK is received. // sendTheDesiredComman

我正试图通过BLE从iPhone向设备写入特定命令。为此,我必须先发送另一个命令,将当前模式切换为命令模式,即处理和解释手机命令的模式。成功设置命令模式后,我将收到相应的ACK。我希望在收到ACK后继续发送所需的命令。如何使我的函数等待确认事件发生

-(void) sendCommand(){

switchToCommandMode();

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

sendTheDesiredCommand();

}

您可以通过以下方式在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方法的对象(例如,它可能是您正在执行可编辑操作的viewController,但您也可以分配单独的对象)。请注意,如果忘记设置CBPeripheraldegate,则不会触发回调方法

另一种方法是,首先注册应用程序,以便在外围设备的状态特征每次更改时接收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];

不要“等待”。感谢你的回复!在我的例子中,你介意再解释一下如何使用它吗?在为现代交互环境(如iOS)编程时,你需要代码是“事件驱动的”。当事件发生时,您可以使用该事件的数据和当前状态来决定要执行的操作。可以使用变量来保存表示当前状态的值(枚举可以正常工作)。您的初始状态是“开始”。发送命令并将状态设置为“已发送开关”。当你得到数据回来,你检查状态,并确认数据是你所期望的。如果您移动到“命令启用”状态并发送命令,然后移动到“命令已发送”状态,如果您在任何时候都没有得到正确的响应,您可以将状态重置为“错误”或“重试”或其他任何状态。您可以绘制一个状态图来帮助您编写代码。这意味着您不能真正拥有block
sendCommand
功能。您可能希望创建一个队列,以便可以提交要处理的命令