Андроид медленно подключается

Привет, я пишу приложение для 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()