Невозможно подключить Android к определенному устройству BLE - PullRequest
0 голосов
/ 12 мая 2018

Я поддерживаю устаревшее приложение для Android, которое извлекает данные из нескольких периферийных устройств BLE. Пытаясь добавить поддержку нового периферийного устройства, я обнаружил, что приложение не подключается к нему. Кажется, основная проблема заключается в том, что когда он вызывает .connectGatt(), я сразу же получаю сообщение об ошибке «уже подключено».

Я написал тестовый код, используя библиотеку RxAndroidBle. Если флаг autoConnect отключен, устройство сообщает DISCONNECTED, затем CONNECTING, а затем (примерно через 1,5 секунды) об ошибке подключения: Disconnected from <device address>. Когда autoConnect включен, он плавно проходит через состояния DISCONNECTED, CONNECTING и CONNECTED и работает нормально.

Более ранняя версия моего теста позволяла продолжить сканирование во время фазы подключения. Он все еще работал, если autoConnect был включен, но сначала (ложно) сообщал, что «уже подключен», затем через несколько секунд исправился и подключился в порядке.

Устаревшее приложение не будет подключаться независимо от значения autoConnect. Мое лучшее предположение на данный момент заключается в том, что приложение не останавливает сканирование достаточно быстро после обнаружения устройства (что не должно иметь значения, но, как мы узнали, существует множество нестабильных устройств BLE - и, как уже отмечалось, проблема заключается в том, что происходит только с этим устройством). Возможно ли, что простое обнаружение устройства приводит к тому, что оно создает какое-то наполовину разорванное соединение, которое мешает успешному соединению?

Я использую API 21, поэтому не могу попробовать другие формы .connectGatt(). Мобильное приложение сканера nRF компании Nordic успешно подключается, но я предполагаю, что приложение полно обходных путей для ненадлежащего поведения устройств.

1 Ответ

0 голосов
/ 12 октября 2018

В Android 6.0 и более поздних версиях метод connectGatt устройства BluetoothDevice поддерживает параметр «transport», который позволяет принудительно устанавливать соединение BLE.В более старых версиях Android эта версия метода доступна через отражение.Использование опции TRANSPORT_LE решает проблемы с подключением для многих устройств с двумя режимами (по крайней мере, для меня - не задокументировано, что фактически делает опция TRANSPORT_AUTO по умолчанию - некоторые стеки Bluetooth могут предпочесть BLE, когда доступны оба режима)

nRF Connectдолжна иметь возможность предпочитать соединения BLE над BR / EDR (или даже по умолчанию).

...