¿Por qué setCharactersticNotification () no habilita realmente las notificaciones?

El ejemplo BluetoothLeGatt Android BLE contiene el código siguiente:

 public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled) { if (mBluetoothAdapter == null || mBluetoothGatt == null) { Log.w(TAG, "BluetoothAdapter not initialized"); return; } mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); // This is specific to Heart Rate Measurement. if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) { BluetoothGattDescriptor descriptor = characteristic.getDescriptor( UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG)); descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); mBluetoothGatt.writeDescriptor(descriptor); } } 

Mi pregunta es básicamente, ¿por qué el código marcado es específico para la medición del ritmo cardíaco? Parece que tener un Client Character Character Configurator (CCCD) charactertic es la forma estándar para controlar la notificación de características, así que ¿por qué no setCharactersticNotification() se encarga de escribir en ella? Y como no lo hace, ¿qué hace realmente setCharacteristicNotificaion() ?

Soy bastante nuevo para BLE y no hay ninguna explicación de que en Internet que no asumen que usted no lo entiende todo! Así que no asuma que sé lo que es un CCCD o lo que sea! ¡Era bastante difícil encontrar lo que CCCD representa!

Edit: Véase también esta respuesta que apoya mi comprensión de CCCDs (y me hace seguir preguntándose por qué tienes que escribirles manualmente en Android cuando hay una función que parece que debería hacer eso por ti): https: // devzone .nordicsemi.com / index.php / what-does-cccd-mean

Creo que es un poco tarde para dar una respuesta, pero hoy tuve la misma duda y encontré una respuesta clara. Utilizando setCharacteristicNotification() habilita la notificación localy (en el dispositivo android) y establece el descriptor CCC en ENABLE_NOTIFICATION_VALUE para habilitar la notificación en el periférico ble. De hecho, para habilitar la notificación CCC hay que usar setValue() y writeDescriptor() que son métodos utilizados para escribir las características (en este caso los descriptores de características) en el dispositivo remoto. Encontré esto en: http://processors.wiki.ti.com/index.php/SensorTag_User_Guide

Para los futuros pueblos que vienen a través de esto, aquí está la mejor respuesta que pude encontrar:

Al escribir en el descriptor Config de la característica del cliente, usted, el cliente, le está diciendo al servidor BLE que cambie las configuraciones. (Esto no tiene sentido para mí, ya sea inicialmente, pero en inglés 🙂

Esto le indica al dispositivo BLE que cambie modos (configuraciones) para recopilar e informar activamente los cambios de esta característica en lugar de cambiar y solo informar cuando se solicite.

Está mal nombrado, pero cavando a través de los documentos que aparece esto también va a ser utilizado para otros posibles cambios característicos que el cliente podría solicitar: de ahí el nombre confuso.

https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml

Esto plantea la pregunta, ¿por qué llamar a BluetoothGatt.setCharacteristicNotification() si sólo vamos a duplicar nuestros esfuerzos mediante la modificación del descriptor ?! La exploración a través de la fuente BluetoothGatt nos muestra que setCharacteristicNotification sólo prepara el servicio local para recibir notificaciones, no para activar actualizaciones persistentes.

Aquí hay un extracto del libro O'Reilly "Getting Started with Bluetooth Low Energy":

"Para habilitar las notificaciones en Android, normalmente debe habilitar localmente la notificación para la característica en particular que le interesa.

Una vez hecho esto, también tiene que habilitar las notificaciones en el dispositivo igual escribiendo al descriptor de configuración de característica del cliente (CCCD) del dispositivo "

Creo que esto responde a su pregunta.

Asi que

 mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); 

Se refiere a la primera parte

y

 mBluetoothGatt.writeDescriptor(descriptor); 

Se refiere al 2do.

Sé que parece una tontería, pero establecer el valor CCCD es la única manera en que puede indicarle a la API si va a activar la notificación o la indicación.

Actualmente no hay ninguna indicación setCharacteristic. Para habilitar la indicación, tiene que llamar a setCharacteristicNotification (confuso) y luego escribir BluetoothGattDescriptor.ENABLE_INDICATION_VALUE en CCCD, similar a lo que hizo para habilitar la Notificación.

"El descriptor de configuración de características de cliente define cómo la característica puede ser configurada por un cliente específico."

  • BluetoothGatt: la negociación de nuevos MTU tiene éxito pero el nuevo tamaño no se puede utilizar (diferencia de 3 bytes)
  • Android Cómo leer las propiedades de BLE Readable Writable Notifiable GATT Características
  • BluetoothDevice.ConnectGatt () con el parámetro de transporte
  • Samsung ble api no puede recibir notificación de múltiples características del GATT
  • Notificación de baja energía del bluetooth
  • BluetoothGatt que muestra 10.000 características idénticas para el servicio
  • Error Android Bluetooth LE: Error al registrar la devolución de llamada
  • BLE con Android 5.0: ¿Cómo conseguir que un dispositivo actúe como Central AND Server?
  • Cambio de tiempo de gatt de bajo consumo de energía de bluetooth o descarga de flujo de lectura para detectar el evento de desconexión más rápido
  • ¿Cómo enviar datos a través de un enlace Bluetooth Low Energy (BLE)?
  • BluetoothGattServer cancelConnection no cancela la conexión
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.