Я работаю над фитнес-приложением, которое поддерживает два датчика BLE (частота сердечных сокращений, шаг). В итоге я получил две ограниченные службы (по одной для каждого датчика), вызванные и ограниченные моей основной деятельностью. Это работает на Nexus 7 II с KitKat. Я потратил дни, пытаясь перевести приложение в стабильное состояние. Соединения Gatt и уведомления работают отлично сразу после чистой перезагрузки. Проблема, с которой я сталкиваюсь, заключается в том, чтобы вернуть все в рабочее состояние после того, как одно или оба устройства были отключены и должны быть повторно подключены. Поскольку другие сообщали о подобных проблемах, я разработал и протестировал различные сценарии, которые включали сохранение службы и соединений при перезапуске активности, закрытие соединений и сервера, а затем запуск заново, только закрытие, а не отключение, ожидание до переподключение и т. д. В настоящее время с одним датчиком я могу заставить приложение переподключаться большую часть времени. С двумя датчиками соединения в большинстве случаев не восстанавливаются. Очень жаль, что Android BLE API настолько хрупок, учитывая, что каждую неделю появляется много новых устройств BLE. Мне интересно, повезло ли кому-нибудь еще с несколькими датчиками BLE и поделятся ли они своим подходом к тому, чтобы заставить его работать.
Android Bluetooth Low Energy (BLE) API не готов к прайм-тайму
Ответы (1)
Это не очень вопросительный вопрос, но ваш комментарий указывает на то, что знание того, что означает 0x85, поможет. Android BLE API был взят из второго BLE API от Samsung, но не все константы, определенные Samsung, были перенесены.
0x85 = 133 (что вы также видите в логах) — это GATT_ERROR. По сути, это означает, что что-то пошло не так, возможно, периферийное устройство вышло за пределы диапазона устройства или просто сломался чип Bluetooth. Я обнаружил, что вызов connect() в BluetoothGatt в onConnectionStateChange является достойным решением, так как он будет ждать, пока все уладится, и подключится, когда это возможно.
0x8D = 141 GATT_ALREADY_OPEN Это довольно очевидно.
Еще одна вещь, на которую следует обратить внимание, — это убедиться, что все, что происходит с Bluetooth, происходит последовательно. Множественные потоки, отправляющие команды в BluetoothGatt до того, как произойдет результат предыдущего действия, как правило, не являются хорошей идеей.