Почему для получения значения записи CBCharacteristics требуется больше времени, чем для обновления значения?

Я включил CoreBluetooth в одном из моих приложений. Существует центральное устройство iOS и до 2 периферийных устройств iOS, которые могут подключаться к центральному.

Я реализовал восходящую связь, используя одну характеристику на периферии, на которую подписывается центральная станция, и я реализовал нисходящую связь, используя другую характеристику на периферии, которую центральная система хранит и записывает с использованием writeValue:forCharacteristic:type:

Они настроены в периферийном устройстве следующим образом:

upstream = [[CBMutableCharacteristic alloc] initWithType:pipeUUID properties:CBCharacteristicPropertyNotify value:nil permissions:0];
downstream = [[CBMutableCharacteristic alloc] initWithType:downstreamUUID properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteable];

При отправке данных в нисходящем направлении, это обычно выглядит так:

NSData* data = [[NSString stringWithFormat:@"%d,%d", AppStateID, SomeValue] dataUsingEncoding:NSUTF8StringEncoding];
[_peripheral1 writeValue:data forCharacteristic:_peripheral1Downstream type:CBCharacteristicWriteWithResponse];

Эта реализация работает и работает довольно хорошо, но я заметил кое-что, что иногда мешает.

Когда я отправляю данные из периферийного устройства в центральное с помощью восходящей характеристики, центральное устройство получает данные почти мгновенно, обычно в одном кадре. Однако, когда я отправляю данные с центрального на периферийное устройство через нисходящую характеристику, периферийному устройству может потребоваться от 0,5 до 5 секунд для получения данных.

Это не большая проблема, но для пользователей было бы лучше, если бы общение не заняло у них так много времени.


Итак, мои вопросы:

  1. Что-то не так с моей реализацией в первую очередь?
  2. Если да, как правильно это сделать?
  3. Если нет, есть ли способ оптимизировать связь между центральным и периферийным устройствами ИЛИ есть ли аналогичная характеристика уведомления, которую я могу использовать для отправки данных в нисходящем, а не в восходящем направлении?

Если это связано, я отмечу, что я получаю повторяющуюся ошибку от запросов на запись, даже если они успешно выполняются.

Ошибка записи: Ошибка домена =CBATTErrorDomain Code=241 "Неизвестная ошибка ATT." UserInfo={NSLocalizedDescription= Неизвестная ошибка ATT.}

1 ответ

Ваша реализация выглядит нормально, но в периферийном коде вам нужно с успехом ответить на запрос на запись, иначе центральное время истечет и выдаст ошибку через 5 секунд или около того - тот, который вы получаете выше. Значение будет по-прежнему обновляться на Периферийном устройстве, но у центрального нет способа узнать это, если вы не ответите как (Swift):

self.peripheralManager.respondToRequest(request, withResult: CBATTError.Success)
Другие вопросы по тегам