Как заставить функцию ждать, пока ACK от устройства не будет получен через BLE, используя Objective-C? - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь записать определенную команду на устройство с моего iPhone через BLE. Для этого я должен сначала отправить другую команду, которая переключает текущий режим в КОМАНДНЫЙ РЕЖИМ, то есть режим для обработки и интерпретации команд с моего телефона. После успешной установки КОМАНДНОГО РЕЖИМА я получу ACK соответственно. Я надеюсь возобновить отправку желаемой команды после получения ACK. Как заставить мою функцию ждать, пока не произойдет событие ACK?

-(void) sendCommand(){

switchToCommandMode();

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

sendTheDesiredCommand();

}

1 Ответ

2 голосов
/ 11 апреля 2019

Вы можете написать команду для переключения состояния периферийного устройства, записав определенное значение состояния в характеристику 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  
}}

Не забудьте сначала установить CBPeripheralDelegate на свой объект CBPeripheral: объект CBPeripheralDelegate будет тем, в котором будет реализован метод didWriteValueForCharacteristic (например, это может быть viewController, для которого вы выполняете операции BLE, но вы можете выделить отдельный объект). объект тоже). Обратите внимание, что если вы забудете установить CBPeripheralDelegate, метод обратного вызова не будет запущен.

Другой подход - сначала зарегистрировать приложение, чтобы получать уведомления BLE каждый раз, когда характеристика состояния изменяется на периферийном устройстве. Таким образом, когда вы изменяете периферийное состояние (например, записываете характеристику BLE, как описано выше), CBPeripheralDelegate в приложении iOS будет автоматически уведомлено, и в этом случае будет вызван обратный вызов 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...