#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);
— возможно, это неправильный поступок?