ios - 如何使函数等到使用Objective-C通过BLE接收到来自设备的ACK?
问题描述
我正在尝试通过 BLE 从我的 iPhone 向设备写入特定命令。为此,我必须先发送另一个命令,将当前模式切换到命令模式,即处理和解释来自手机的命令的模式。成功设置 COMMAND MODE 后,我会收到相应的 ACK。我希望在收到 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 方法的对象(例如,它可能是您正在执行 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];
推荐阅读
- android - 当应用程序在 Android 设备上运行时,如何以编程方式获取用于安装的 APK 文件的名称?
- terraform - 带有列表的terraform模板文件插值问题
- java - 改造正在返回一个空的身体
- http - pytorch 安装时出现 CondaHTTPError
- php - AWS 服务器未向域外发送电子邮件
- c# - DocumentOpen Word 事件不起作用,如何在打开 word 文件时运行计时器
- json - 在 Angular > 10 中显示来自 JSON 的单个节点
- c - 如何在单个可执行文件中构建具有多个 Linux 实用程序的软件?
- python - 如何为python的虚拟环境设置特定的python版本?
- date - gql的Apollo Payload上的错误未知类型“DateTime”