Android BluetoothLEGatt BLE не остается подключенным к устройству

Я использую пример приложения BluetoothLeGatt от Google, и у меня возникают проблемы с подключением устройства. Я чувствую, что у меня немного случайное поведение. Bluetooth обычно не подключается с первой попытки (поэтому обычно я почти хочу сказать никогда).

Примерно в 50% случаев, когда я нажимаю кнопку подключения, приложение говорит, что состояние «Подключено». Однако аппаратное устройство имеет светодиод, который должен загораться при подключении, но не загорается. Затем через 5 или 6 секунд он отключается. Я подозреваю, что он подключается на долю секунды, а затем отключается, и приложение какое-то время просто не получает заметку. Вот логарифм:

D/BluetoothGatt: connect() - device: 54:4A:16:2F:3C:F6, auto: false
D/BluetoothGatt: registerApp()
D/BluetoothGatt: registerApp() - UUID=60edb0ed-90de-4d7d-b4d0-690bcc359fb7
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=10
D/BluetoothLeService: Trying to create a new connection.
D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=10 device=54:4A:16:2F:3C:F6
I/BluetoothLeService: Connected to GATT server.
D/BluetoothGatt: discoverServices() - device: 54:4A:16:2F:3C:F6
I/BluetoothLeService: Attempting to start service discovery:true
D/BluetoothGatt: onGetService() - Device=54:4A:16:2F:3C:F6 UUID=00001800-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetService() - Device=54:4A:16:2F:3C:F6 UUID=00001801-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetService() - Device=54:4A:16:2F:3C:F6 UUID=0000ffe0-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetCharacteristic() - Device=54:4A:16:2F:3C:F6 UUID=00002a00-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetCharacteristic() - Device=54:4A:16:2F:3C:F6 UUID=00002a01-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetCharacteristic() - Device=54:4A:16:2F:3C:F6 UUID=00002a02-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetCharacteristic() - Device=54:4A:16:2F:3C:F6 UUID=00002a03-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetCharacteristic() - Device=54:4A:16:2F:3C:F6 UUID=00002a04-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetCharacteristic() - Device=54:4A:16:2F:3C:F6 UUID=00002a05-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetCharacteristic() - Device=54:4A:16:2F:3C:F6 UUID=0000ffe1-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetDescriptor() - Device=54:4A:16:2F:3C:F6 UUID=00002902-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetDescriptor() - Device=54:4A:16:2F:3C:F6 UUID=00002902-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onGetDescriptor() - Device=54:4A:16:2F:3C:F6 UUID=00002901-0000-1000-8000-00805f9b34fb
D/BluetoothGatt: onSearchComplete() = Device=54:4A:16:2F:3C:F6 Status=0
D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=10 device=54:4A:16:2F:3C:F6
I/BluetoothLeService: Disconnected from GATT server.

Может быть, в 10% случаев я нажимаю кнопку подключения и ничего не вижу:

D/BluetoothGatt: connect() - device: 54:4A:16:2F:3C:F6, auto: false
D/BluetoothGatt: registerApp()
D/BluetoothGatt: registerApp() - UUID=7dbe26bc-4cee-48d2-9f47-59af4edb33bb
D/BluetoothGatt: onClientRegistered() - status=133 clientIf=0
I/BluetoothLeService: Disconnected from GATT server.
D/BluetoothLeService: Trying to create a new connection.

и, возможно, в 30% случаев он действительно подключается.

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

Изменить: для тех, кто следит за моей математикой. Последние 10 % времени приложение не находит ничего при сканировании, и мне приходится перезапускать приложение.

Изменить: я загрузил и попробовал 2 других приложения BLE из магазина воспроизведения и столкнулся с теми же проблемами с подключением, что и в примере приложения Google BLE. Есть ли какая-то настройка, которую должна иметь реализация BLE для Android, которая будет отличаться от iOS?


person Chase Roberts    schedule 03.11.2015    source источник
comment
Привет, ты нашел основную причину этой проблемы? Я столкнулся с той же проблемой, но не могу найти причину того же.   -  person Parikh Vaibhav    schedule 04.12.2015
comment
Есть куча вещей. Я много читал о том, что Android BLE sdk просто плох, потому что каждый производитель оборудования использует разные чипы BLE, поэтому сложно иметь надежный универсальный Android BLE sdk. Другая проблема заключалась в том, что наш чип не калибровался на правильную скорость. Я предполагаю, что разница в программных часах составляет 10%, из-за чего мы сбрасываем пакеты. (Я думаю, что это правильно - я не аппаратный парень)   -  person Chase Roberts    schedule 04.12.2015
comment
atmosphere.anaren.com/wiki/   -  person Chase Roberts    schedule 04.12.2015
comment
github.com/iDevicesInc/SweetBlue/wiki/Android-BLE-Issues   -  person Chase Roberts    schedule 04.12.2015
comment
Я могу немного сократить свой проект и отправить вам код, который я в итоге использовал, если хотите. По сути, я просто добавил кучу сторожевых таймеров, чтобы, если какой-либо шаг не удался или занял слишком много времени, он повторил этот шаг. По сути, просто суперзащитное программирование.   -  person Chase Roberts    schedule 04.12.2015
comment
Привет @Chase, спасибо за подробную информацию. Вы правы, это связано с проблемой калибровки. Сейчас это происходит редко. Спасибо за помощь и поддержку.   -  person Parikh Vaibhav    schedule 07.12.2015
comment
Без проблем. Удачи.   -  person Chase Roberts    schedule 07.12.2015
comment
Привет @ChaseRoberts, я был бы признателен, если бы вы опубликовали код, который вы использовали для решения этой проблемы, в качестве ответа для дальнейшего использования. Спасибо!   -  person Leo supports Monica Cellio    schedule 24.05.2016
comment
После борьбы с этим в течение нескольких месяцев. Я вернулся к примеру Google и попытался вообще не отклоняться от их кода. У них есть строка или две, где они проверяют, было ли устройство подключено раньше, и автоматически подключаются. Сначала я удалял эту линию, думая, что могу каждый раз начинать новую, но некоторые телефоны просто не подключаются с первой попытки, поэтому вам нужны эти линии повторного подключения.   -  person Chase Roberts    schedule 28.05.2016


Ответы (1)


Попробуйте использовать: BluetoothDevice.connectGatt (контекстный контекст, логическое autoConnect, обратный вызов BluetoothGattCallback, транспорт int)

с TRANSPORT_LE в качестве транспорта.

Это помогло мне.

person Evgeny Erlihman    schedule 06.03.2017