Андроид 4.3 Bluetooth низкой энергии нестабильны
в настоящее время я разрабатываю приложение, которое будет использовать Bluetooth Low Energy (тестирование на Nexus 4). После начала работы с официальными API BLE в Android 4.3 я заметил, что после первого подключения устройства я редко могу успешно подключиться к этому устройству или любому другому устройству снова.
следуя руководству здесь, Я могу успешно подключиться к устройству, сканировать службы и характеристики, а также чтение/запись / получение уведомлений без каких-либо проблем. Однако после отключения и повторного подключения я часто не могу сканировать службы/характеристики или не могу завершить чтение/запись. Я не могу найти ничего в журналах, чтобы указать, почему это происходит.
Как только это произойдет, мне придется удалить приложение, отключить Bluetooth и перезагрузить телефон, прежде чем он снова начнет работать.
всякий раз, когда устройство отключено, я обязательно вызываю close() на Объект BluetoothGatt и установите для него значение null. Какие-либо выводы?
EDIT:
Log dumps: для этих журналов я укоренил свой телефон и повысил уровни трассировки связанных элементов в /etc/bluetooth/bt_stack.conf
успешное соединение - первая попытка после перезагрузки телефона и установки приложения. Я могу подключаться, обнаруживать все службы/характеристики и читать/писать.
Неудачная Попытка 1 - Это очередная попытка после отсоединения от успешного соединения выше. Кажется, я смог обнаружить характеристики, но первая попытка чтения вернула нулевое значение и вскоре отключилась.
Неудачная Попытка 2 - пример, где я даже не в состоянии обнаружить услуги/характеристики.
EDIT 2:
Устройство, к которому я пытаюсь подключиться, основано на чипе TI CC2541. Я получил TI SensorTag (также на основе CC2541), чтобы поиграть с и обнаружил, что TI выпущен приложение для android для SensorTag вчера. Тем не менее, это приложение имеет та же проблема. я проверил это на двух других Nexus 4s с тем же результатом: соединение с SensorTag успешно в первый или второй раз, но (согласно журналам) не удается обнаружить службы после этого, вызывая всевозможные сбои. Я начинаю задаваться вопросом, если это проблема с этим конкретным чипом?
4 ответов:
важные подсказки реализации
(возможно, некоторые из этих подсказок больше не нужны из-за обновлений ОС Android.)
- некоторые устройства, такие как Nexus 4 с Android 4.3 подключение с использованием существующего экземпляра gatt занимает 45+ секунд. Работа вокруг: всегда закрывайте экземпляры gatt при отключении и создавайте новый экземпляр gatt при каждом подключении.
- не забудьте позвонить
android.bluetooth.BluetoothGatt#close()- начать новую тему внутри
onLeScan(..)и затем подключить. Причина:BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)всегда терпит неудачу, если внутриLeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)в том же потоке на Samsung Galaxy S3 с Android 4.3 (по крайней мере, для сборки JSS15J.I9300XXUGMK6)- большинство устройств фильтруют рекламу
- лучше не использовать
android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback)с параметром для фильтрации определенных UUIDs сервиса потому что это полностью сломано в Samsung Galaxy S3 с Android 4.3 и не работает для 128bit UUIDs в целом.- Gatt всегда может обрабатывать одну команду за раз. Если несколько команд вызываются коротко после другой, первая команда отменяется из-за синхронного характера реализации ГАТТ.
- Я часто вижу даже на современных устройствах с Android 5, что Wifi мешает bluetooth и наоборот. в крайнем случае, выключите wifi для стабилизации блютус.
учебник для начинающих
довольно хорошо точка входа для новичков может быть это видео-учебник: разработка Bluetooth смарт-приложений для Androidhttp://youtu.be/x1y4tEHDwk0
проблема и обойти описанные ниже, вероятно, исправлена сейчас обновления ОС
работа вокруг: я мог бы "стабилизировать" мое приложение, делая это...
- Я предоставляю пользователю параметр " перезагрузка Блютус." Если эта настройка включена, я перезапускаю Bluetooth в некоторых точках, которые указывают на то, что начало стека BLE становится нестабильным. Например, если startScan возвращает false. Хороший момент может также быть, если serviceDiscovery не удается. Я просто выключаю и включаю Bluetooth.
- Я предоставляю другую настройку "отключить WiFi". Если этот параметр включен, мое приложение отключает Wifi при запуске приложения (и затем снова включает его)
эта работа вокруг основана на follwoing опыты...
- перезапуск Bluetooth помогает устранить проблемы с BLE в большинстве случаев
- если вы выключите Wifi, стек BLE становится гораздо более стабильным. Однако он также отлично работает на большинстве устройств с включенным Wi-Fi.
- если вы выключите Wifi, перезапуск Bluetooth полностью восстановит стек BLE без необходимости перезагрузки устройства в большинстве случаев.
отключение WIFI:
Я также могу подтвердить, что отключение WIFI делает Bluetooth 4.0 более стабильным, особенно на Google Nexus (у меня есть Nexus 7).
проблема
Это приложение, которое я разрабатываю должен и WIFI непрерывность Bluetooth LE scanning. Поэтому отключение Wi-Fi не было для меня вариантом.
кроме того, я понял, что непрерывное сканирование Bluetooth LE может на самом деле убить WIFI соединение и выберите адаптер WIFI не удается повторно подключить к любой сети WIFI, пока не будет включено сканирование BLE. (Я не уверен в мобильных сетях и мобильном интернете).
Это определенно произошло на следующих устройствах:
- Nexus 7
- Motorola Moto G
однако сканирование BLE с WIFI on казалось довольно стабильным:
- Samsung S4
- HTC One
мой обходной
Я сканировать BLE для короткий промежуток времени 3-4 секунд потом выключить сканирование на 3-4 секунды. Снова.
- очевидно, что я всегда отключаю сканирование BLE при подключении к устройству BLE.
- когда я отключаюсь от устройства, я перезапускаю BLE (выключаю адаптер, а затем включаю), чтобы сбросить стек перед повторным запуском сканирования.
- я также сбрасываю BLE, когда открытие
servicesилиcharacteristicsне удается.- когда я получаю рекламные данные с устройства, к которому приложение должно подключиться (скажем, 500 раз без возможности подключения - это около 5-10 секунд рекламы), я снова сбрасываю BLE.
убедитесь, что ваш Nexus сопряжен с устройством. Я не могу проверить, работает ли связь правильно, но вы сможете подключиться более одного раза без перезагрузки. Кажется, что первое соединение не требует сопряжения, но все последующие попытки делают.я обновлю этот ответ через пару дней, когда я проверю обнаружение службы и запросы на чтение и запись gatt без перезагрузки.
изменить: Оказывается, я тестировал на разработку версия прошивки (наш датчик), которая вызывала проблемы, если не была сопряжена. Наша последняя сборка прошивки производства отлично работает на 2540-х и 2541s.
изменить: Я заметил, что на Nexus 7 2013 соединения более стабильны, когда Wi-Fi выключен. Я хотел бы знать, помогает ли это кому-нибудь еще.
изменить: Кажется, у меня было все наоборот с сопряжением. Все работает нормально, когда не в паре. После спаривания, я испытываю те же симптомы, что и у ОП. Это просто не известно еще, если это связано с нашей прошивкой или Android BLE API. Будьте осторожны при тестировании этого, потому что после спаривания вы не сможете распариться из-за ошибки, объясненной в 3b этого post.
в некоторых моделях есть дефект: https://code.google.com/p/android/issues/detail?id=180440
С другой стороны, в моем случае проблема заключалась в том, что мое соединение не было правильно закрыто в методе onDestroy. После правильного закрытия, проблема для меня не существует, не имеет значения, что Wi-Fi включен или выключен.
btGatt.disconnect(); btGatt.close();
Comments