Problemas con Android Bluetooth LE Notificaciones

Estoy tratando de escribir una aplicación Bluetooth LE que tiene acceso a un monitor cardiaco Zephyr HxM Smart. Este monitor tiene varios servicios de Bluetooth, pero estoy interesado en el servicio de la batería, el servicio de la frecuencia cardíaca, y un servicio de encargo que tiene actividad y aceleración máxima. Hay una característica para cada uno, nivel de batería, (BAT), medición de frecuencia cardiaca (HR) y medición personalizada (CUS). El HxM se actualiza una vez por segundo.

Estoy haciendo esto con un Galaxy S4 con Android 4.4.

No funciona como se espera de la documentación.

Mi enfoque inicial era hacer:

Read BAT Set notification for HR Set notification for CUS. 

A continuación, espere las devoluciones de llamada. Establecer notificación significa llamar

 BluetoothGatt.setCharacteristicNotification(Characteristic char , boolean enabled) 

(También se puede hacer una notificación para BAT, sin embargo, la especificación no requiere que se soporte, pero el HxM lo admite).

Esto no funcionó. Tengo BAT y notificaciones de HR, pero no CUS. Si eliminé el segundo paso, recibí notificaciones para CUS. No pude conseguir los dos. (Esto indica que estoy leyendo las características correctamente, por lo que es [probablemente] no el problema.)

He encontrado algunas indicaciones de que había problemas con la pila de Bluetooth para Android que es síncrono, pero no hay documentación dura . Entonces intenté lo siguiente:

 Read BAT. Wait for the BAT reading, then set notification for HR, Get HR, then disable notification for HR, and start notification for CUS. Get CUS, then disable notification for CUS, and start notification for HR. And continue to loop. 

Tengo BAT y eso es todo.

Por ensayo y error, descubrí los siguientes trabajos:

 Read BAT. Wait for the BAT reading, then set notification for HR, Get HR, then start notification for CUS. Get CUS, then start notification for HR. And continue to loop. 

(Igual que el anterior, pero sin deshabilitar notificaciones.) Normalmente, obtengo una lectura de HR, luego la CUS dentro de 200 ms. Se puede suponer que son de la misma actualización. En realidad, la lógica es más complicada, ya que los temporizadores son necesarios en caso de que las lecturas esperadas no entren. Esta lógica es mucho más complicada (y Más propenso al error) que mi primer intento, que es lo que la documentación parece decir es lo que es apropiado.

He contactado Zephyr, y dicen que el HxM Smart ha sido ampliamente probado en Windows, y hará notificaciones simultáneas como debería. También hay indicios de que funciona como debería en iOS.

Hay un problema adicional que no entiendo. Para recibir notificaciones, debes habilitar las características localmente para la notificación con algo como:

 BluetoothGattDescriptor descriptor = characteristic .getDescriptor(UUID_CLIENT_CHARACTERISTIC_CONFIG); resSet = descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); resWrite = mBluetoothGatt.writeDescriptor(descriptor); 

Este es un ajuste por característica, y sólo debe realizarse una vez, cuando se recibe la característica por primera vez. En su lugar, creo que tengo que hacerlo cada vez que establezco las notificaciones. Es posible que esto sólo cause un tiempo suficiente para que las cosas funcionen. No lo sé. Este ensayo y error está tomando mucho de mi tiempo. Sería bueno tener una declaración definitiva de cómo funciona.

Debo tener en cuenta que para todas las llamadas que devuelven un resultado, el resultado es verdadero (éxito).

Me disculpo por la larga declaración. Mi pregunta es:

No encuentro ninguna documentación que tenga que hacer las cosas descritas. Todas las indicaciones son que usted configura notificaciones y espera las devoluciones de llamada. ¿Hay documentación, o es un error, o simplemente una mala implementación? (¿O es mi error?) Me gustaría especialmente saber dónde está la documentación de lo que he tenido que hacer.

En segundo lugar, hay una complicación adicional. He intentado depurar en las rutinas para ver qué está haciendo realmente el código. Cuando llego a BluetoothGatt.class, las líneas de origen no coinciden con lo que dice la pila de depuración. Asumo así que el S4 no está utilizando el androide estándar. No sé a dónde ir desde allí. Ha sido frustrante, y aunque tengo algo que parece funcionar, es kludgy y casi con seguridad menos robusto.

Gracias por cualquier ayuda.

Tuve el mismo problema con la escritura de múltiples valores en secuencia, poniendo un Thread.sleep (200) entre ellos resuelto el problema (por desgracia, debo decir). Tal vez esto también ayuda con las notificaciones. Probado esto en android 4.4.2 en Nexus 5. Y no, 4.4 no resuelve todos los problemas …

Im probablemente muy tarde para esto, pero debe implementar una arquitectura de colas para configurar sus características para enviar notificaciones. Utilicé una técnica similar para miznick en el post https://stackoverflow.com/a/18207869/3314615 y acabé escribiendo código de contenedor para la pila BLE nativa, ya que hay varias aplicaciones en las que uso BLE. Desde entonces no he tenido problemas recibiendo notificaciones. Estoy de acuerdo con usted en que la documentación de BLE de Android debería tener algún tipo de información o advertencia sobre que la BLE Stack no es síncrona. Francamente, creo que debería ser re-escrito para manejar las llamadas de escritura síncrona y sólo ponerlos en cola.

Primero, establezca Notificación (es decir, setCharacteristicNotification y set Descriptor) para la primera característica.

Y, Establecer notificación para la segunda característica en la función de devolución de llamada onDescriptorWrite.

  • Android - ¿Cómo configurar una notificación para una fecha específica en el futuro?
  • Reiniciar la aplicación falla en android
  • ¿Cuál es la mejor manera de comunicarse entre las actividades del sitio web asp.net y la aplicación android?
  • ¿Es posible reducir el tiempo de notificación que se muestra en Android?
  • ¿Por qué Jelly Bean no muestra la segunda fila en una Notificación?
  • Cómo guardar notificaciones push de analizar por SharedPreferences
  • Android - administrador de notificaciones, tener una notificación sin intención
  • El icono de la barra de notificaciones se vuelve blanco en Android L
  • ¿Cómo borrar correctamente toda la notificación una vez hecho clic?
  • Imagen de botón de reproducción / pausa en la notificación, Android
  • Color de fondo de notificación predeterminado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.