Android 4.3 Bluetooth de baja energía inestable


Actualmente estoy desarrollando una aplicación que utilizará Bluetooth de baja energía (pruebas en el Nexus 4). Después de comenzar con las API oficiales de BLE en Android 4.3, he notado que después de conectar un dispositivo por primera vez, rara vez puedo conectarme / comunicarme con ese dispositivo o cualquier otro dispositivo nuevamente.

Siguiendo la guía aquí , puedo conectarme con éxito a un dispositivo, escanear servicios y características, y leer / escribir / recibir notificaciones sin ningún problema. Sin embargo, después de desconectar y volver a conectar, a menudo no puedo escanear servicios/características o no puedo completar una lectura/escritura. No puedo encontrar nada en los registros que indique por qué está pasando esto.

Una vez que esto sucede, tengo que desinstalar la aplicación, desactivar Bluetooth y reiniciar el teléfono antes de que comience a funcionar de nuevo.

Cuando se desconecta un dispositivo, me aseguro de llamar a close () en el objeto BluetoothGatt y establecer a null. ¿Alguna idea?


EDITAR:
Volcados de registros: Para estos registros, rooteé mi teléfono y aumenté los niveles de seguimiento de elementos relacionados en /etc/bluetooth/bt_stack.conf

Conexión exitosa - Primer intento después de reiniciar el teléfono e instalar la aplicación. Soy capaz de conectar, descubrir todos los servicios / características, y leer / escribir.

Intento fallido 1 : Este es el siguiente intento después de desconectarse de la conexión exitosa anterior. Parece que fue capaz de descubrir características, pero el primer intento de leer devolvió un valor nulo y se desconectó poco después.

Intento fallido 2 - Un ejemplo donde ni siquiera soy capaz de descubrir servicios/características.


EDITAR 2:
El dispositivo al que estoy tratando de conectar se basa en el chip CC2541 de TI. Obtuve un TI SensorTag (también basado en el CC2541) para jugar y descubrí que TI lanzó una aplicación para Android para el SensorTag ayer. Sin embargo, esta aplicación tiene el mismo problema. Probé esto en otros dos Nexus 4s con el mismo resultado: La conexión al SensorTag es exitosa la primera o segunda vez, pero (de acuerdo con los registros) no puede descubrir los servicios a partir de entonces, causando todo tipo de bloqueos. Estoy empezando a preguntarme si es un problema con este chip?

Author: sa.shadow, 2013-07-26

4 answers

Consejos importantes de implementación

(Quizás algunas de esas pistas ya no son necesarias debido a las actualizaciones del sistema operativo Android.)

  1. Algunos dispositivos como Nexus 4 con Android 4.3 tardan más de 45 segundos en conectarse utilizando una instancia gatt existente. Trabaje alrededor: Siempre cierre las instancias del gatt al desconectarse y cree una nueva instancia del gatt en cada conexión.
  2. No olvides llamar a android.bluetooth.BluetoothGatt#close()
  3. Iniciar un nuevo hilo dentro onLeScan(..) y luego conectar. Motivo: BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback) siempre falla, si se llama dentro de LeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) en el mismo hilo en Samsung Galaxy S3 con Android 4.3 (al menos para la compilación JSS15J.I9300XXUGMK6)
  4. La mayoría de los dispositivos filtran publicidad
  5. Mejor no usar android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback) con el parámetro para filtrar ciertos UUIDs de servicio porque esto está roto completamente en Samsung Galaxy S3 con Android 4.3 y no funciona para UUIDs de 128 bits en general.
  6. El Gatt siempre puede procesar un comando a la vez. Si varios comandos son llamados poco después de otro, el primero se cancela debido a la naturaleza sincrónica de la implementación del gatt.
  7. A menudo veo incluso en dispositivos modernos con Android 5, que Wifi interfiere con bluetooth y viceversa. Como último recurso, apague wifi para estabilizar bluetooth.

Tutorial para principiantes

Un punto de entrada bastante bien para los recién llegados podría ser este video tutorial: Desarrollo Aplicaciones inteligentes Bluetooth para Android http://youtu.be/x1y4tEHDwk0

El problema y la solución que se describen a continuación probablemente se hayan solucionado ahora gracias a las actualizaciones del sistema operativo

Trabajar alrededor: Podría "estabilizar" mi aplicación haciendo eso...

  1. Proporciono al usuario una configuración "Reiniciar Bluetooth". Si esa configuración está habilitada, reinicio Bluetooth en algunos puntos que indican que el comienzo de la pila BLE se vuelve inestable. Por ejemplo, si startScan devuelve false. Un buen punto también puede ser si El descubrimiento de servicios falla. Acabo de apagar y encender el Bluetooth.
  2. Proporciono otro ajuste "Apagar WiFi". Si esa configuración está habilitada, mi aplicación desactiva Wifi cuando la aplicación se está ejecutando (y la vuelve a activar después)

Este trabajo se basa en experiencias posteriores...

  • Reiniciar Bluetooth ayuda a solucionar problemas con BLE en la mayoría de los casos
  • Si desactivas Wifi, la pila BLE se vuelve mucho más estable. Sin embargo, también funciona bien en la mayoría de los dispositivos con wifi encendido.
  • Si desactiva Wifi, reiniciar Bluetooth recupera completamente la pila BLE sin la necesidad de reiniciar el dispositivo en la mayoría de los casos.
 171
Author: OneWorld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-06 09:09:15

Apagar WIFI:

También puedo confirmar que apagar WIFI hace que Bluetooth 4.0 sea más estable, especialmente en Google Nexus (tengo un Nexus 7).

El problema

Es que la aplicación que estoy desarrollando necesitaambos WIFIy continuo Bluetooth LE scanning. Así que apagar el WIFI no era una opción para mí.

Además, me he dado cuenta de que el escaneo continuo de Bluetooth LE puede en realidad matar la conexión WIFI y hacer que el adaptador WIFI no puede volver a conectar a ninguna red WIFI hasta que BLE scan esté ACTIVADO. (No estoy seguro de las redes móviles e internet móvil).
Esto definitivamente sucedió en los siguientes dispositivos:

  • Nexus 7
  • Motorola Moto G

Sin embargo, el escaneo BLE con WIFI activado parecía bastante estable:

  • Samsung S4
  • HTC One

Mi solución

I scan BLE for a short period of time 3-4 segundos luego yo apago el escaneo durante 3-4 segundos. Luego otra vez.

  • Obviamente siempre apago BLE scan cuando me estoy conectando a un dispositivo BLE.
  • Cuando me desconecto de un dispositivo, reinicio BLE (apague el adaptador y luego lo encienda) para restablecer la pila antes de iniciar nuevamente el escaneo.
  • También reseteo BLE cuando se descubre services o characteristics falla.
  • Cuando obtengo datos de publicidad de un dispositivo al que la aplicación debería conectarse (digamos 500 veces sin ser capaz de conectar - eso es alrededor de 5-10 segundos de publicidad) restablezco BLE de nuevo.
 15
Author: benka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-12 14:54:47

Asegúrate de que tu Nexus esté vinculado al dispositivo. No puedo verificar si la comunicación funciona correctamente o no, pero podrá conectarse más de una vez sin reiniciar. Parece que la primera conexión no requiere emparejamiento, pero todos los intentos posteriores lo hacen.

Actualizaré esta respuesta en un par de días cuando pruebe service discovery y gatt read and write requests sin reiniciar.

EDITAR: Resulta que estaba probando en una versión de firmware de desarrollo (nuestra sensor) que estaba causando problemas si no se emparejó. Nuestra última compilación de firmware de producción funciona bien en los modelos 2540 y 2541.

EDITAR: Me di cuenta de que en el Nexus 7 2013, las conexiones son más estables cuando WiFi está apagado. Me gustaría saber si esto ayuda a alguien más.

EDITAR: Parece que lo he tenido al revés con el emparejamiento. Todo funciona bien cuando no está emparejado. Después del emparejamiento, estoy experimentando exactamente los mismos síntomas que la OP. Es solo que aún no se sabe si esto está relacionado con nuestro firmware o la API de Android BLE. Tenga cuidado si prueba esto porque una vez emparejado, es posible que no pueda descomprimir debido a un error explicado en 3b de este post.

 6
Author: Mikt25,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-09 19:45:58

En algunos modelos hay un defecto: https://code.google.com/p/android/issues/detail?id=180440

Por otro lado, en mi caso el problema era que mi conexión no estaba correctamente cerrada en el método onDestroy. Después del cierre correcto, el problema para mí no existe, no importa que el wifi esté encendido o apagado.

btGatt.disconnect();
btGatt.close();
 4
Author: Krystian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-13 19:07:23