Я работаю над приложением 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.
Спасибо