Приложение Android BLE для обратного вызова Gatt перестает отвечать

Я пытаюсь разработать приложение BLE, которое имеет несколько действий для управления пользовательским устройством BLE. Проблема, с которой я сталкиваюсь сейчас, связана с тем, что устройство находится вне зоны действия или когда соединение потеряно.

Приложение имеет службу BLE, которая обрабатывает сканирование и соединения Gatt. После того, как пользователь выбрал устройство в первом действии, запускается второе действие, и приложение подключается к выбранному устройству. Во втором действии пользователь может выбирать из 4 различных меню, каждое из которых запускает новое действие.

Одним из вариантов является управление устройством, используемое для запуска/остановки сбора данных. В любой момент времени, если соединение BLE потеряно, появляется диалоговое окно с предупреждением, позволяющее пользователю повторно подключиться к устройству. Однако, когда соединение теряется в третьем действии (управление устройством) при повторном подключении, если я затем выхожу из действия и снова возобновляю, приложение больше не обновляет статус.

Извините, я знаю, что это, вероятно, очень расплывчато, но я действительно понятия не имею, что вызывает эту проблему. Я сузил его до службы BLE, которая автоматически ставит в очередь запросы BLE (запись, чтение и т. д.) и выполняет их, когда Гатт не занят. И проблема возникает из-за того, что Гатт никогда не очищает флаг занятости после возвращения из второго действия, но я не могу понять, почему.

Спасибо за помощь.


person Bryan Hsieh    schedule 15.08.2019    source источник


Ответы (1)


Проблема, по-видимому, была решена благодаря первому прямому соединению через device.connectGatt(contex,false,callback), а последующие соединения обрабатывались BluetoothGatt.connect(), как показано в примере с BluetoothLeGatt. А также вызывать BlutoothGatt.disconnect() перед каждой попыткой повторного подключения, чтобы приложение не зависало в ожидании истечения времени ожидания соединения Gatt.

person Bryan Hsieh    schedule 16.08.2019