Медленный отклик при записи значения в характеристику для BLE (Objective C)

#objective-c #bluetooth-lowenergy #core-bluetooth

#objective-c #bluetooth-низкое энергопотребление #ядро-bluetooth

Вопрос:

Я пытаюсь обновить характеристику на устройстве BLE с помощью Objective C и CoreBluetooth. Это работает (при записи на устройстве загорается индикатор, поэтому я могу видеть, когда происходит обновление), Но задержка между записью значения и ответом на устройстве составляет около 15-25 секунд (!).

Я записываю значение, используя:

 [peripheral writeValue:data forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
  

и я получаю обратный вызов на didWriteValueForCharacteristic 15 с лишним секунд позже.

Я заметил, что это, похоже, как-то связано с тем, как я сохраняю CBPeripheral объект. Я думаю это потому, что если я попытаюсь выполнить запись на устройство напрямую из одной из функций обратного вызова в CBPeripheralDelegate (например didDiscoverCharacteristicsForService ), которая передает периферийное устройство в качестве аргумента, то ответ от устройства будет мгновенным. Длительные задержки возникают, только если я пытаюсь записать значения на периферийное устройство, используя мою сохраненную версию.

Я попытался сохранить периферийное устройство как свойство в массиве, и я попытался выполнить запись через очередь с помощью dispatch_async (поскольку действие для записи значения происходит из действия пользовательского интерфейса в программе C ).

У вас есть какие-либо мысли или предложения относительно того, почему я испытываю эти проблемы?

Спасибо, Адам

p.s. устройство, на которое я пытаюсь записать, является микроразрядом

Комментарии:

1. Если вы используете LightBlue.app (доступно в AppStore), занимает ли это так много времени? Это может проверить, связана ли проблема с кодом iPhone или с кодом устройства BLE.

2. Да, я пробовал это, и приложение LightBlue, похоже, вызывает мгновенный отклик на устройстве. Значит, это должно быть что-то в моем коде. Я не понимаю, что вызывает задержку между моим вызовом writeValue и ответом от didWriteValueForCharacteristic . Кажется, я это не контролирую…

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

4. Хм, да, я подозреваю что-то подобное. Я нашел подсказку — если периферийное устройство предоставлено мне в функции обратного вызова (например, в didDiscoverCharacteristicsForService ), и я вызываю свою функцию для записи в характеристику на устройстве, это работает немедленно без задержки. Если я сохраняю периферийное устройство и пытаюсь вызвать его из другого места, то я получаю задержку в 15-20 секунд. Есть какие-нибудь советы о том, как убедиться, что я здесь не блокирую?

5. Я выполняю свое действие в очереди отправки… dispatch_queue_t queue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_HIGH, 0); — возможно, это неправильный поступок?