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