Я поддерживаю устаревшее приложение для 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 успешно подключается, но я предполагаю, что приложение полно обходных путей для ненадлежащего поведения устройств.