studio programacion onfragmentinteractionlistener móviles must libros implement desarrollo desarrollar curso aprende aplicaciones android performance bluetooth bluetooth-lowenergy connect

android - programacion - must implement onfragmentinteractionlistener kotlin



Android se conecta lentamente (2)

Hola, estoy escribiendo una aplicación de Android para conectarme a un dispositivo periférico BLE. Android 4.4.2, Galaxy Nexus.

Tengo un LED en el dispositivo para indicar el estado de conexión.

El problema es la duración desde la llamada connectGatt () hasta el punto de recibir onConnectionStateChange STATE_CONNECTED son tan inconsistentes. Algún tiempo es muy rápido, pero la mayoría de las veces toma 5s o más. Apagar y encender el Bluetooth no tiene ningún efecto.

Probé TI BTool en PC con el TI BLE Dongle y siempre establece la conexión muy rápido.

También probé con un iPhone 5S y es rápido también.

  1. ¿Alguien ha experimentado este problema también?
  2. ¿Hay alguna posibilidad de que podamos mejorar esto?

He experimentado una conexión lenta, pero solo al intentar volver a conectar el dispositivo remoto, conectar el dispositivo por primera vez no tiene ningún problema, pero la reconexión sigue siendo la conexión en el método onClientRegistered ()


Pasar true a connectGatt () argumento de conexión automática solicita una conexión en segundo plano, mientras que pasar false solicita una conexión directa. BluetoothGatt # connect () siempre solicita una conexión de fondo.

La conexión de fondo (según las fuentes de Bluedroid de 4.4.2 AOSP) tiene un intervalo de escaneo de 1280 ms y una ventana de 11.25 ms. Esto corresponde a aproximadamente el 0,9% del ciclo de trabajo, lo que explica por qué las conexiones, cuando no se escanean, pueden tardar mucho tiempo en completarse.

La conexión directa tiene un intervalo de 60 ms y una ventana de 30 ms, por lo que las conexiones se completan mucho más rápido. Además, solo puede haber una solicitud de conexión directa pendiente a la vez y se agota después de 30 segundos. onConnectionStateChange () recibe una llamada con el estado = 2, estado = 133 para indicar este tiempo de espera.

He verificado este comportamiento en Nexus5 pero obviamente YMMV.

Debo mencionar que hay una condición de carrera en BluetoothGatt.java que puede causar una solicitud de conexión directa incluso si autoconnect = true se pasa a BluetoothDevice # connectGatt ().