Как синхронизировать связь между BLE Central (Mobile) и Peripheral?

Я работаю над приложением BLE. Я установил связь между мобильным приложением (ЦЕНТРАЛЬНЫЙ - BluetoothGattClient) и ПЕРИФЕРИЙНЫМ (GATT SERVER), хотя и не аккуратно.

ПЕРИФЕРИЙНЫЙ имеет одну услугу, которая, в свою очередь, имеет единственную характеристику, для которой ЦЕНТРАЛЬНЫЙ включил уведомление. Чтение/запись с обеих сторон происходит через эту характеристику

Вот полный поток связи с ЦЕНТРАЛЬНОЙ (мобильной) стороны

введите здесь описание изображения

Проблема 1

Иногда при получении нескольких пакетов от PERIPHERAL я получаю уведомление о прочтении - 'onCharcteristicChanged()' до того, как закончу запись ACK (ШАГ 9), т.е. onCharcteristicChanged() вызывается перед onCharctristicWrite().

В этом сценарии, хотя я выдаю bleGatt.readCharacteristic(charac), но onCharactristicRead() никогда не вызывается. ЦЕНТРАЛЬНЫЙ застревает. Невозможно прочитать во время ожидания.

Проблема 2

Иногда при отправке ACK после выдачи bleGatt.writeCharactristic(charac) onChactristicWrite() не вызывается, поэтому ACK не принимается PERIPHERAL и связь прекращается.

Проблема 3

В целом общение очень медленное. Для записи одного фрагмента (‹=20 байт) данных требуется> 400 мс.

Есть ли лучшая стратегия для правильной синхронизации чтения/записи? Я пытался сделать это с помощью BluetoothGattCallbacks, но, как объяснено, он не работает должным образом.

Что можно сделать, чтобы увеличить скорость общения?

И READ, и WRITE происходят в одном потоке.

Я тестировал это на Moto E (Marshmallow), Moto G5 (Nougat) и Samsung S6 (Lollipop). Поведение одинаково на всех устройствах.

Мое ПЕРИФЕРИЧЕСКОЕ устройство — nRF52840.

Спасибо


person iuq    schedule 10.04.2018    source источник


Ответы (1)


Самый простой способ убедиться, что ваша связь GATT работает правильно, — это использовать очередь для объекта BluetoothGatt, поскольку одновременно может выполняться только одна операция GATT. Вот почему это не работает, когда вы, например, вызываете readCharacteristic до того, как система вызовет onCharacteristicWrite.

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

Что вы можете сделать, чтобы ускорить общение, так это использовать «Запись без ответа» вместо «Запись с ответом». Таким образом, несколько пакетов могут быть отправлены за один цикл. Затем onCharacteristicWrite будет вызываться немедленно (пока внутренние буферы не заполнены). Просто помните об https://issuetracker.google.com/issues/37121017.

person Emil    schedule 11.04.2018