Android медленно подключается

Привет, я пишу приложение для Android для подключения к периферийному устройству BLE. Android 4.4.2, Galaxy Nexus.

У меня есть светодиод на устройстве, чтобы указать состояние подключения.

Проблема заключается в продолжительности вызова connectGatt() до точки получения onConnectionStateChange STATE_CONNECTED так противоречивы Некоторое время это очень быстро, но в большинстве случаев это занимает 5 секунд и более. Выключение / включение Bluetooth не имеет никакого эффекта.

Я попробовал TI BTool на ПК с ключом TI BLE, и он всегда очень быстро устанавливает соединение.

Я также пытался с iPhone 5S, и это тоже быстро.

  1. Кто-нибудь тоже сталкивался с этой проблемой?
  2. Есть ли шанс, что мы сможем улучшить это?

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()

Другие вопросы по тегам