Андроид 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 успешно в первый или второй раз, но (согласно журналам) не удается обнаружить службы после этого, вызывая всевозможные сбои. Я начинаю задаваться вопросом, если это проблема с этим конкретным чипом?

644   4  

4 ответов:

важные подсказки реализации

(возможно, некоторые из этих подсказок больше не нужны из-за обновлений ОС Android.)

  1. некоторые устройства, такие как Nexus 4 с Android 4.3 подключение с использованием существующего экземпляра gatt занимает 45+ секунд. Работа вокруг: всегда закрывайте экземпляры gatt при отключении и создавайте новый экземпляр gatt при каждом подключении.
  2. не забудьте позвонить android.bluetooth.BluetoothGatt#close()
  3. начать новую тему внутри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)
  4. большинство устройств фильтруют рекламу
  5. лучше не использоватьandroid.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback)с параметром для фильтрации определенных UUIDs сервиса потому что это полностью сломано в Samsung Galaxy S3 с Android 4.3 и не работает для 128bit UUIDs в целом.
  6. Gatt всегда может обрабатывать одну команду за раз. Если несколько команд вызываются коротко после другой, первая команда отменяется из-за синхронного характера реализации ГАТТ.
  7. Я часто вижу даже на современных устройствах с Android 5, что Wifi мешает bluetooth и наоборот. в крайнем случае, выключите wifi для стабилизации блютус.

учебник для начинающих

довольно хорошо точка входа для новичков может быть это видео-учебник: разработка Bluetooth смарт-приложений для Androidhttp://youtu.be/x1y4tEHDwk0

проблема и обойти описанные ниже, вероятно, исправлена сейчас обновления ОС

работа вокруг: я мог бы "стабилизировать" мое приложение, делая это...

  1. Я предоставляю пользователю параметр " перезагрузка Блютус." Если эта настройка включена, я перезапускаю Bluetooth в некоторых точках, которые указывают на то, что начало стека BLE становится нестабильным. Например, если startScan возвращает false. Хороший момент может также быть, если serviceDiscovery не удается. Я просто выключаю и включаю Bluetooth.
  2. Я предоставляю другую настройку "отключить 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

    Ничего не найдено.