Android 4.3 Bluetooth Низкая энергия нестабильная

В настоящее время я разрабатываю приложение, которое будет использовать Bluetooth Low Energy (тестирование на Nexus 4). После начала работы с официальными BLE API в Android 4.3 я заметил, что после подключения устройства в первый раз я редко могу успешно подключиться к этому устройству или другому устройству снова.

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

Как только это произойдет, я должен удалить приложение, отключить Bluetooth и перезагрузить телефон, прежде чем он снова начнет работать.

Всякий раз, когда устройство отключено, я не забудьте вызвать функцию close () на объекте BluetoothGatt и установить его значение null. Любые идеи?


РЕДАКТИРОВАТЬ:
Лог-дампы: для этих журналов я укоренил свой телефон и увеличил уровни трассировки связанных элементов в файле /etc/bluetooth/bt_stack.conf

Успешное подключение – первая попытка после перезагрузки телефона и установки приложения. Я могу подключиться, обнаружить все сервисы / характеристики и читать / писать.

Failed Attempt 1 – Это следующая попытка после отсоединения от успешного соединения выше. Кажется, мне удалось обнаружить характеристики, но первая попытка чтения вернула нулевое значение и вскоре отключилась.

Failed Attempt 2 – Пример, когда я даже не могу обнаружить службы / характеристики.


EDIT 2:
Устройство, к которому я пытаюсь подключиться, основано на чипе CC2541 от TI. Я получил TI SensorTag (также на основе CC2541), чтобы поиграть и обнаружил, что TI вчера выпустил приложение Android для SensorTag. Однако это приложение имеет ту же проблему. Я тестировал это на двух других Nexus 4 с тем же результатом: подключение к SensorTag успешно выполняется первым или вторым временем, но (в соответствии с журналами) не удается обнаружить службы после этого, вызывая всевозможные сбои. Я начинаю сомневаться, если это проблема с этим конкретным чипом?

Solutions Collecting From Web of "Android 4.3 Bluetooth Низкая энергия нестабильная"

Важные рекомендации по внедрению

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

  1. Некоторые устройства, такие как Nexus 4 с Android 4.3, занимают 45 + секунд для подключения с использованием существующего экземпляра gatt . Работайте: всегда закрывайте экземпляры 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) внутри 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) с параметром для фильтрации определенных UUID служб, поскольку это полностью нарушено в Samsung Galaxy S3 с Android 4.3 и не работает для 128-битных UUID в целом ,
  6. Gatt всегда может обрабатывать одну команду за раз . Если несколько команд получают короткий вызов за другим, первый из них отменяется из-за синхронности реализации gatt.
  7. Я часто вижу даже на современных устройствах с Android 5, что Wifi вмешивается в bluetooth и наоборот. В крайнем случае отключите Wi-Fi, чтобы стабилизировать Bluetooth.

Учебное пособие для начинающих

Примером хорошей точки входа для новичков может быть этот видеоурок: Разработка Bluetooth Smart Applications для Android http://youtu.be/x1y4tEHDwk0

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

Работайте: я мог бы «стабилизировать» свое приложение, делая это …

  1. Я предоставляю пользователю настройку «Перезапустить Bluetooth». Если этот параметр включен, я перезапускаю Bluetooth в некоторых точках, которые указывают, что начало стека BLE становится неустойчивым. Например, если startScan возвращает false. Хорошим моментом может быть и в случае сбоя serviceDiscovery. Я просто включил Bluetooth и включил его.
  2. Я предоставляю еще одну настройку «Turn of WiFi». Если этот параметр включен, мое приложение отключает Wifi, когда приложение работает (и снова включает его)

Эта работа основана на последующем опыте …

  • Перезапуск Bluetooth помогает устранять проблемы с BLE в большинстве случаев
  • Если вы отключите Wifi, стек BLE станет намного более стабильным. Тем не менее, он также отлично работает на большинстве устройств с включенным Wi-Fi.
  • Если вы отключите Wi-Fi, перезагрузка Bluetooth полностью восстановит стек BLE без необходимости перезагрузки устройства в большинстве случаев.

Выключение WIFI:

Я также могу подтвердить, что включение WIFI OFF делает Bluetooth 4.0 более стабильным, особенно в Google Nexus (у меня есть Nexus 7).

Проблема

Заключается в том, что приложение, которое я разрабатываю, требует как WIFI, так и непрерывного сканирования Bluetooth LE . Поэтому поворот WIFI OFF был для меня не вариантом.

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

  • Нексус 7
  • Motorola Moto G

Однако сканирование BLE с WIFI показалось довольно стабильным:

  • Samsung S4
  • HTC One

Мое обходное решение

Я сканирую BLE в течение короткого периода времени 3-4 секунды, затем я поворачиваю сканирование в течение 3-4 секунд . Затем снова включите.

  • Очевидно, что я всегда выключаю BLE-сканирование OFF, когда я подключаюсь к устройству BLE.
  • Когда я отсоединяюсь от устройства, я перезапускаю BLE (выключите адаптер, а затем ВКЛ), чтобы сбросить стек перед повторным запуском сканирования.
  • Я также перезагружаю BLE, когда обнаружение services или characteristics терпит неудачу.
  • Когда я получаю рекламные данные с устройства, к которому приложение должно подключиться (скажем, 500 раз, не имея возможности подключиться – это примерно 5-10 секунд рекламы), я снова перезагружаю BLE.

Убедитесь, что ваш Nexus подключен к устройству. Я не могу проверить, правильно ли работает связь, но вы можете подключаться более одного раза без перезагрузки. Кажется, что первое подключение не требует спаривания, но все последующие попытки.

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

EDIT: Оказывается, я тестировал версию прошивки разработки (наш датчик), которая вызывала проблемы, если не была сопряжена. Наша новейшая производственная прошивка работает отлично на 2540 и 2541 годах.

EDIT: Я заметил, что на Nexus 7 2013 соединения более стабильны, когда WiFi выключен. Я хотел бы знать, помогает ли это кому-то еще.

EDIT: Кажется, у меня было это с обратной связью. Все работает нормально, когда не сопряжено. После спаривания я испытываю те же симптомы, что и ОП. Пока ничего не известно, если это связано с нашей прошивкой или Android BLE API. Будьте осторожны, проверяя это, поскольку после спаривания вы не сможете устранить проблему из-за ошибки, описанной в 3b этого сообщения .

В некоторых моделях есть дефект: https://code.google.com/p/android/issues/detail?id=180440

С другой стороны, в моем случае проблема заключалась в том, что моя связь не была должным образом закрыта методом onDestroy. После правильного закрытия проблема для меня не существует, не важно, что Wi-Fi включен или выключен.

 btGatt.disconnect(); btGatt.close();