В настоящее время я занимаюсь разработкой приложения, которое будет использовать Bluetooth Low Energy (тестирование на Nexus 4). После начала работы с официальными API BLE в Android 4.3 я заметил, что после первого подключения устройства я редко могу успешно подключиться к этому устройству или любому другому устройству или связаться с ним.
Следуя приведенному здесь руководству , я могу без проблем подключаться к устройству, сканировать услуги и характеристики, а также читать / писать / получать уведомления. Однако после отключения и повторного подключения я часто не могу ни сканировать услуги / характеристики, ни выполнить чтение / запись. Я не могу найти ничего в журналах, чтобы указать, почему это происходит.
Как только это произойдет, я должен удалить приложение, отключить Bluetooth и перезагрузить телефон, прежде чем он снова начнет работать.
Всякий раз, когда устройство отключается, я вызываю функцию close () для объекта BluetoothGatt и устанавливаю для него значение null. Есть идеи?
РЕДАКТИРОВАТЬ:
Лог дампов: для этих журналов я рутировал свой телефон и поднял уровни трассировки связанных элементов в /etc/bluetooth/bt_stack.conf
Успешное подключение - Первая попытка после перезагрузки телефона и установки приложения. Я могу подключиться, обнаружить все услуги / характеристики и читать / писать.
Неудачная попытка 1 - это следующая попытка после отключения от успешного подключения выше. Кажется, мне удалось обнаружить характеристики, но первая попытка чтения вернула нулевое значение и вскоре после этого отключилась.
Неудачная попытка 2 - пример, когда я даже не могу обнаружить услуги / характеристики.
РЕДАКТИРОВАТЬ 2:
устройство, к которому я пытаюсь подключиться, основано на микросхеме TI CC2541. Я получил TI SensorTag (также основанный на CC2541), чтобы поиграть с ним, и обнаружил, что TI выпустила приложение для Android для SensorTag вчера. Тем не менее, это приложение имеет ту же проблему. Я проверил это на двух других Nexus 4 с тем же результатом: подключение к SensorTag было успешным в первый или второй раз, но (согласно журналам) не удается обнаружить службы после этого, вызывая всевозможные сбои. Я начинаю удивляться, если это проблема с этим конкретным чипом?
Ответы:
Важные советы по реализации
(Возможно, некоторые из этих подсказок больше не нужны из-за обновлений ОС Android.)
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)
этот параметр для фильтрации определенных идентификаторов UUID службы, поскольку в Samsung Galaxy S3 с Android 4.3 это полностью нарушается и в целом не работает для 128-битных UUID .Учебник для начинающих
Хорошей отправной точкой для новичков может стать видеоурок: «Разработка приложений Bluetooth для Android» http://youtu.be/x1y4tEHDwk0
Описанная ниже проблема и способ ее устранения, вероятно, теперь исправлены обновлениями ОС
Обойти: я мог бы "стабилизировать" мое приложение, делая это ...
Эта работа основана на следующем опыте ...
источник
ВЫКЛЮЧЕНИЕ WIFI:
Я также могу подтвердить, что отключение WIFI делает Bluetooth 4.0 более стабильным, особенно в Google Nexus (у меня Nexus 7).
Эта проблема
является то, что приложение, которое я разрабатываю потребности как WIFI, так и постоянного сканирования Bluetooth LE . Так что отключение WIFI не было для меня вариантом.
Более того, я понял, что непрерывное сканирование Bluetooth LE может на самом деле разорвать соединение WIFI и сделать адаптер WIFI неспособным повторно подключиться к любой сети WIFI, пока не будет включено сканирование BLE. (Я не уверен насчет мобильных сетей и мобильного интернета).
Это определенно произошло на следующих устройствах:
Однако BLE сканирование с включенным WIFI показалось довольно стабильным:
Мой обходной путь
Я сканирую BLE в течение короткого промежутка времени 3-4 секунды, затем выключаю сканирование на 3-4 секунды . Затем снова включите.
services
илиcharacteristics
сбое.источник
Убедитесь, что ваш Nexus подключен к устройству. Я не могу проверить, работает ли связь должным образом, но вы сможете подключиться более одного раза без перезагрузки. Кажется, что первое соединение не требует сопряжения, но все последующие попытки делают.Я обновлю этот ответ через пару дней, когда я протестирую обнаружение службы и получу запросы на чтение и запись без перезагрузки.
РЕДАКТИРОВАТЬ: Оказывается, я тестировал версию встроенного программного обеспечения (наш датчик), который вызывал проблемы, если не было сопряжено. Наша последняя сборка серийной прошивки прекрасно работает на 2540-х и 2541-х годах.
РЕДАКТИРОВАТЬ: я заметил, что на Nexus 7 2013, соединения более стабильны, когда WiFi выключен. Я хотел бы знать, помогает ли это кому-нибудь еще.
РЕДАКТИРОВАТЬ: Кажется, я имел это задом наперед с сопряжением. Все отлично работает, когда не в паре. После сопряжения я испытываю те же симптомы, что и ОП. Пока неизвестно, связано ли это с нашей прошивкой или Android BLE API. Будьте внимательны при тестировании этого, потому что после сопряжения вы не сможете разорвать связь из-за ошибки, описанной в 3b этого поста .
источник
В некоторых моделях есть дефект: https://code.google.com/p/android/issues/detail?id=180440
С другой стороны, в моем случае проблема заключалась в том, что мое соединение не было правильно закрыто в методе onDestroy. После корректного закрытия проблема для меня не существует, не важно, включен или выключен вайфай.
источник
close
нужно?Я столкнулся с аналогичной проблемой. Мое исправление было
& звонить закрыть после отключения.
источник