Actualmente estoy desarrollando una aplicación que utilizará Bluetooth Low Energy (prueba en el Nexus 4). Después de comenzar con las API BLE oficiales en Android 4.3, he notado que después de conectar un dispositivo por primera vez, rara vez puedo conectarme / comunicarme con ese dispositivo u otro dispositivo con éxito.
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 para indicar por qué sucede esto.
Una vez que esto sucede, tengo que desinstalar la aplicación, desactivar Bluetooth y reiniciar el teléfono antes de que vuelva a funcionar.
Cada vez que se desconecta un dispositivo, me aseguro de llamar a close () en el objeto BluetoothGatt y configurarlo como nulo. Alguna idea?
EDITAR:
volcados de registro: para estos registros rooteé mi teléfono y subí los niveles de rastreo 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. Puedo conectarme, 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 pude descubrir características, pero el primer intento de lectura devolvió un valor nulo y se desconectó poco después.
Intento fallido 2 : un ejemplo en el que ni siquiera puedo descubrir servicios / características.
EDIT 2:
el dispositivo al que estoy intentando conectarme está basado en el chip CC2541 de TI. Obtuve una TI SensorTag (también basada en el CC2541) para jugar y descubrí que TI lanzó una aplicación de Android para SensorTag ayer. Sin embargo, esta aplicación tiene el mismo problema. Probé esto en otros dos Nexus 4 con el mismo resultado: la conexión al SensorTag es exitosa la primera o la segunda vez, pero (según los registros) no puede descubrir los servicios a partir de entonces, causando todo tipo de fallas. ¿Estoy empezando a preguntarme si es un problema con este chip específico?
Respuestas:
Sugerencias importantes de implementación
(Quizás algunas de esas sugerencias ya no sean necesarias debido a las actualizaciones del sistema operativo Android).
android.bluetooth.BluetoothGatt#close()
onLeScan(..)
y luego conéctese. Motivo:BluetoothDevice#connectGatt(Context context, boolean autoConnect, BluetoothGattCallback callback)
siempre falla, si se llama dentroLeScanCallback() {...}.onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
del mismo hilo en Samsung Galaxy S3 con Android 4.3 (al menos para la compilación JSS15J.I9300XXUGMK6)android.bluetooth.BluetoothAdapter#startLeScan(UUID[] serviceUuids, LeScanCallback callback)
con el parámetro para filtrar ciertos UUID de servicio porque esto se rompe por completo en Samsung Galaxy S3 con Android 4.3 y no funciona para los UUID de 128 bits en general.Tutorial para principiantes
Un punto de entrada bastante bueno para los recién llegados podría ser este video tutorial: Desarrollo de aplicaciones inteligentes de Bluetooth para Android http://youtu.be/x1y4tEHDwk0
El problema y la solución que se describen a continuación probablemente se solucione ahora mediante actualizaciones del sistema operativo
Solución: podría "estabilizar" mi aplicación haciendo eso ...
Este trabajo se basa en las siguientes experiencias ...
fuente
Desactivar 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 necesita tanto WIFI y continua exploración de Bluetooth LE . Así que apagar WIFI no era una opción para mí.
Además, me he dado cuenta de que el escaneo continuo de Bluetooth LE puede matar la conexión WIFI y hacer que el adaptador WIFI no pueda volver a conectarse a ninguna red WIFI hasta que el escaneo BLE esté ENCENDIDO. (No estoy seguro acerca de las redes móviles e Internet móvil).
Esto definitivamente sucedió en los siguientes dispositivos:
Sin embargo, el escaneo BLE con WIFI activado parecía bastante estable en:
Mi solución
Me escanear ble para un corto período de tiempo de 3-4 segundos y luego me APAGAR el rastreo durante 3-4 segundos . Luego ENCENDIDO nuevamente.
services
ocharacteristics
falla.fuente
Asegúrese de que su Nexus esté emparejado con el 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 sí.Actualizaré esta respuesta en un par de días cuando pruebe el descubrimiento de servicios y recopile solicitudes de lectura y escritura sin reiniciar.
EDITAR: Resulta que estaba probando una versión de firmware de desarrollo (nuestro sensor) que causaba problemas si no estaba emparejado. Nuestra última compilación de firmware de producción funciona bien en los años 2540 y 2541.
EDITAR: Noté que en el Nexus 7 2013, las conexiones son más estables cuando el WiFi está apagado. Me gustaría saber si esto ayuda a alguien más.
EDITAR: Parece que lo tuve 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 el OP. Aún no se sabe si esto está relacionado con nuestro firmware o la API BLE de Android. Tenga cuidado si prueba esto porque una vez emparejado, es posible que no pueda desvincular debido a un error explicado en 3b de este publicación .
fuente
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 se cerró correctamente en el método onDestroy. Después del cierre correcto, el problema para mí no existe, sin importar que el wifi esté activado o desactivado.
fuente
close
necesario?Estaba enfrentando un problema similar. Mi solución fue
& llamando cerca después de desconectar.
fuente