Android BLE: ¿Identificar el tipo de característica?
Estoy desarrollando una aplicación android con BLE. El requisito de esta aplicación es actualizar la variación de voltaje en un hardware específico con varias entradas. Así que habilito BLE notificar API en esta aplicación. Esto notificará la aplicación en un período de tiempo con el voltaje de hardware más reciente.
Implementación
- El algoritmo de búsqueda de recursos del cargador de clases del sistema
- Diferencia entre setBackgroundDrawable () y setBackground ()
- Android: Vista de texto que no muestra el valor establecido programáticamente
- Establecer setChunkedStreamingMode en HttpURLConnection no puede entregar datos al servidor
- ¿Cómo puedo hacer que este zip rxjava funcione en paralelo?
mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); BluetoothGattDescriptor des = characteristic.getDescriptors(); des.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); //Set the value of the descriptor to enable notification mBluetoothGatt.writeDescriptor(des);
Estoy recibiendo una notificación en los valores de notificación en el método Gatt CallBack
@Override public void onCharacteristicChanged(BluetoothGatt Gatt, BluetoothGattCharacteristic characteristic) { Log.w(TAG, "**ACTION_DATA_AVAILABLE**" + characteristic.getUuid()); //Indication or notification was received broadcastUpdate(BLEConstants.ACTION_DATA_AVAILABLE, characteristic); //Go broadcast an intent with the characteristic data }
Pero mi problema es, estoy recibiendo la respuesta normal también en el mismo método de devolución de llamada de Gatt. Quiero actualizar la notificación como una forma específica en la interfaz de usuario. Así que necesito separar la respuesta normal y la notificación. ¿Hay alguna manera de hacer lo mismo? O cualquier opción para identificar el mensaje en particular es de notificar?
- Android: Ayuda bidimensional de ArrayList
- Cómo eliminar R.java de JavaDoc
- Cómo preformar un mensaje Reddit con okhttp
- La aplicación no responde después de reanudarla
- Android "Sólo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas." Error en Fragmento
- En evento de zoom para google maps en android
- Patrón de bloqueo de múltiples hilos de SQLiteDatabase
- Error de Android Studio: "El método getText () debe ser llamado desde el subproceso de interfaz de usuario, el subproceso inferido actualmente es el trabajador
En general, creamos (en el lado del hardware) una característica con las propiedades de ESCRIBIR y NOTIFICAR, para que podamos leer cuando queramos o habilitar completamente notificar para obtener datos en tiempo real.
Si tiene acceso al firmware de hardware y puede agregar características, sería bueno separar la característica de voltaje y la respuesta. Por lo tanto, puede probar el argumento onCharacteristicChanged:
int propertiesFlags = characteristic.getUuid();
Otra buena manera de hacerlo, y eso es lo que hago usualmente, es usar una característica, pero asignar intervalos de datos. Una especie de convención entre tu aplicación y el hardware:
@Override public void onCharacteristicChanged(BluetoothGatt Gatt, BluetoothGattCharacteristic characteristic) { byte[] data = characteristic.getValue(); if(data[1] < SOME_PREDIFINDED_VALUE){ //it's a real-time data update }else{ //it's a response to some data you sent. } }
De lo contrario, la respuesta sólo será un cambio característico que significa un nuevo valor de voltaje de hardware.
No, si no tiene la posibilidad de cambiar el firmware. De acuerdo con su explicación, parece que NOTIFY tipo de característica se activa no medidor si le pedimos valor o el valor se cambia.
Si es así, la única manera que puedo imaginar como solución es el siguiente.
- Usted ha pedido valor. Usted tiene que fijar la bandera y usted tiene que considerar que todos los valores divulgados mientras que la bandera se fija son los valores que usted ha estado pidiendo.
- No has pedido valor. Considéralo como notificaciones.
Espero eso ayude.
Actualizar:
Parece que usted está usando RN4020 MLDP que no tiene documentación expuesta para el servicio privado, de acuerdo con esto
Lo mejor que pude encontrar fue lo siguiente:
// private static final String MLDP_PRIVATE_SERVICE = "00035b03-58e6-07dd-021a-08123a000300"; //Private service for Microchip MLDP // private static final String MLDP_DATA_PRIVATE_CHAR = "00035b03-58e6-07dd-021a-08123a000301"; //Characteristic for MLDP Data, properties - notify, write // private static final String MLDP_CONTROL_PRIVATE_CHAR = "00035b03-58e6-07dd-021a-08123a0003ff"; //Characteristic for MLDP Control, properties - read, write // private static final String CHARACTERISTIC_NOTIFICATION_CONFIG = "00002902-0000-1000-8000-00805f9b34fb"; //Special UUID for descriptor needed to enable notifications
Desde aquí
Lo que significa que la única manera de transferir datos es usar
// private static final String MLDP_DATA_PRIVATE_CHAR = "00035b03-58e6-07dd-021a-08123a000301"; //Characteristic for MLDP Data, properties - notify, write
Y esta característica solo tiene NOTIFICAR, no leer. Así que si lo está utilizando, no puede evitar la devolución de llamada de notificación en el lado del dispositivo.
- Android Studio no puede encontrar los módulos opencv, pero compila ok
- Cómo subir un proyecto de estudio de Android a Subversion por primera vez