Как синхронизировать связь между BLE Central (Mobile) и периферией?
Я работаю над приложением BLE. Я дошел до установления связи между мобильным приложением (CENTRAL - BluetoothGattClient) и PERIPHERAL (GATT SERVER), хотя и не аккуратно.
У PERIPHERAL есть одна служба, которая, в свою очередь, имеет единственную характеристику, для которой CENTRAL включил уведомление. Чтение / запись с обеих сторон происходит через эту характеристику
Вот полный поток сообщений со стороны ЦЕНТРАЛЬНОЙ (мобильной)
Проблема 1
Иногда при получении нескольких пакетов из PERIPHERAL я получаю уведомление о прочтении - 'onCharcteristicChanged()', прежде чем я заканчиваю писать ACK (STEP 9), т.е. onCharcteristicChanged () вызывается перед onCharctristicWrite ().
В этом сценарии я использую bleGatt.readCharacteristic (character), но onCharactristicRead () никогда не вызывается. ЦЕНТРАЛЬ застревает. Невозможно прочитать во время ожидания.
Проблема 2
Иногда при отправке ACK, после выдачи bleGatt.writeCharactristic(character), onChactristicWrite() не вызывается, следовательно, ACK не принимается PERIPHERAL и связь прекращается.
Проблема 3
Общее общение очень медленное. Для записи одного фрагмента (<=20 байт) данных требуется> 400 мс.
Есть ли лучшая стратегия для правильной синхронизации чтения / записи? Я попытался сделать это с помощью BluetoothGattCallbacks, но, как объяснено, он не работает должным образом.
Что можно сделать, чтобы увеличить скорость общения?
И READ, и WRITE происходит в одном потоке.
Я проверял это на Moto E (зефир), Moto G5 (нуга) и Samsung S6 (леденец). Поведение является одинаковым для всех устройств.
Мое ПЕРИФЕРИЧЕСКОЕ устройство - nRF52840.
Спасибо
1 ответ
Самый простой способ убедиться, что ваша связь GATT работает правильно, - это использовать очередь для объекта BluetoothGatt, поскольку одновременно может выполняться только одна операция GATT. Вот почему это не работает, когда вы, например, вызываете readCharacteristic до вызова системой onCharacteristicWrite.
Причина, по которой вы получаете уведомление до ответа на запись, заключается в том, что периферийное устройство отправляет уведомление до ответа на запись.
Чтобы ускорить обмен данными, вы можете использовать запись без ответа вместо записи с ответом. Таким образом, несколько пакетов могут быть отправлены за один прием. OnCharacteristicWrite будет вызываться немедленно (если внутренние буферы не заполнены). Просто будьте в курсе https://issuetracker.google.com/issues/37121017.