Android медленно подключается
Привет, я пишу приложение для Android для подключения к периферийному устройству BLE. Android 4.4.2, Galaxy Nexus.
У меня есть светодиод на устройстве, чтобы указать состояние подключения.
Проблема заключается в продолжительности вызова connectGatt() до точки получения onConnectionStateChange STATE_CONNECTED
так противоречивы Некоторое время это очень быстро, но в большинстве случаев это занимает 5 секунд и более. Выключение / включение Bluetooth не имеет никакого эффекта.
Я попробовал TI BTool на ПК с ключом TI BLE, и он всегда очень быстро устанавливает соединение.
Я также пытался с iPhone 5S, и это тоже быстро.
- Кто-нибудь тоже сталкивался с этой проблемой?
- Есть ли шанс, что мы сможем улучшить это?
2 ответа
Передача true в аргумент autoGnect connectGatt() запрашивает фоновое соединение, в то время как передача false запрашивает прямое соединение. BluetoothGatt#connect() всегда запрашивает фоновое соединение.
Фоновое соединение (согласно источникам Bluedroid из 4.4.2 AOSP) имеет интервал сканирования 1280 мс и окно 11,25 мс. Это соответствует рабочему циклу около 0,9%, что объясняет, почему соединения, если они не сканируются, могут занять много времени.
Прямое соединение имеет интервал 60 мс и окно 30 мс, поэтому соединения завершаются намного быстрее. Кроме того, одновременно может быть только один запрос на прямое подключение, и он истекает через 30 секунд. onConnectionStateChange() вызывается с state=2, status=133, чтобы указать этот тайм-аут.
Я проверил это поведение на Nexus5, но, очевидно, YMMV.
Я должен упомянуть, что в BluetoothGatt.java есть условие гонки, которое может вызвать прямой запрос соединения, даже если autoconnect=true передается в BluetoothDevice#connectGatt().
Я экспериментировал с медленным соединением, но только при попытке переподключения удаленного устройства при первом подключении устройства проблем не возникает, но при повторном подключении соединение остается в методе onClientRegistered()