首页 > 解决方案 > 如何使函数等到使用Objective-C通过BLE接收到来自设备的ACK?

问题描述

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

-(void) sendCommand(){

switchToCommandMode();

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

sendTheDesiredCommand();

}

标签: iosobjective-c

解决方案


您可以通过在 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];

推荐阅读