Android BLE GATT отключен и устройство отключено

Я работаю над приложением для Android, которое взаимодействует с пользовательским устройством Bluetooth. После вызова BluetoothGatt.Disconnect() я вижу, что обратный вызов OnConnectionStateChange вызывается, а новое состояние — Disconnected, однако, похоже, существует задержка между тем, когда это происходит, и тем, когда само устройство фактически отключено. Например, если я вызываю BluetoothManager.GetConnectionState(...) с подключенным устройством, он все равно возвращает Connected. Иногда требуется несколько секунд, прежде чем GetConnectionState вернет Disconnected. Это нормально? Возможно ли, что я делаю что-то неправильно в своем приложении, что может быть причиной этого? например отключение от протектора без UI или что-то в этом роде? Или возможно, что само физическое устройство Bluetooth не обрабатывает отключение должным образом и, возможно, не завершает событие отключения в кратчайшие сроки?


person PICyourBrain    schedule 13.06.2017    source источник


Ответы (2)


Когда вы вызываете «disconnect()», вы только отключаете свой клиентский объект (объект BluetoothGatt). Вы можете иметь несколько объектов BluetoothGatt, подключенных к одному и тому же физическому устройству. Несколько приложений также могут иметь собственные объекты BluetoothGatt, подключенные к одному и тому же устройству.

Как только вы вызываете «disconnect()», запрос обрабатывается в стеке Bluetooth в системе, и он сразу же вызывает обратный вызов onConnectionStateChange в вашем приложении, когда он завершает обработку запроса. Однако он не отключит соединение, пока не отключатся все остальные клиенты. Более новые версии Android также задерживают физическое отключение на несколько секунд (не знаю почему). Кроме того, после отправки запроса на отключение на контроллер Bluetooth может потребоваться некоторое время для фактического отключения, поскольку удаленному устройству необходимо подтвердить отключение (или тайм-аут). Время ожидания по умолчанию составляло 20 секунд, пока оно не было недавно изменено на 5 секунд в последней версии Android.

person Emil    schedule 13.06.2017
comment
Благодарю за разъяснение. Знаете ли вы, возможно ли получить событие обратного вызова, когда устройство фактически отключается? - person PICyourBrain; 13.06.2017
comment
Просто зарегистрируйте широковещательный приемник для прослушивания developer.android.com/reference /андроид/блютуз/. - person Emil; 13.06.2017

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

Обычно для окончательного отключения требуется 30 секунд, а иногда и минут! Все зависит от того, какой телефон вы использовали в то время.

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

Преимущество, которое я видел, заключается в том, что оно работает ВСЕГДА (поскольку «жесткое» отключение всегда воспринимается Android, тогда как запрос «мягкого» отключения может вызвать некоторые проблемы на некоторых телефонах). Обычно «хорошие» телефоны не демонстрируют такого поведения (особенно Marshmallow и так далее), но в те времена KitKat… Ух ты….

Еще одно преимущество... Если вы используете iOS, вы можете сканировать или повторно подключаться к отключенным периферийным устройствам намного быстрее.

person SJoshi    schedule 14.06.2017