¿Cómo saber cuándo un dispositivo BLE se suscribe a una característica de Android?

Viniendo de un fondo de dev iOS, al trabajar con Bluetooth LE actuando como un periférico puede registrarse para una devolución de llamada cuando un dispositivo "central" BLE se suscribe (habilita notificaciones) para una característica.

Estoy luchando para ver cómo se logra esto en Android. Si estás trabajando con Bluetooth LE actuando como central, puedo ver cómo te suscribiste: bluetoothGatt.setCharacteristicNotification(characteristicToSubscribeTo, true);

Cuál es igual que esto en iOS: peripheralDevice.setNotifyValue(true, forCharacteristic characteristicToSubscribeTo)

Ahora, después de llamar a lo anterior en iOS, en el lado periférico, obtendrá una devolución de llamada para decir que la central se ha suscrito con un método similar a: peripheralManager(manager, central subscribedCentral didSubscribeToCharacteristic characteristic) que le da una referencia al dispositivo que se suscribió / Enabled notificaciones ya qué característica.

¿Cuál es el equivalente en Android?

Para mayor claridad señalaré que no necesito suscribirme a una característica de Android, el dispositivo está actuando como el periférico y debe ser notificado cuando otros dispositivos se suscriban a las características.

Lo siento si esto es obvio, pero no puedo encontrarlo en los documentos o en otro lugar.

Justo después de establecer la recompensa tuve una idea, haha ​​debería haber esperado un poco más dar a mi cerebro más tiempo para pensar;)

Parece que iOS ha abstraído un poco cómo funcionan las suscripciones internamente. Bajo la campana ios CoreBluetooth un cierto "Descriptor" de la característica es escrito por el Centro, lo que indica que el centro quiere suscribir el valor de la característica.

Aquí está el código que usted necesita agregar a su subclase de BluetoothGattServerCallback :

  @Override public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) { super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value); Log.i(TAG, "onDescriptorWriteRequest, uuid: " + descriptor.getUuid()); if (descriptor.getUuid().equals(Descriptor.CLIENT_CHARACTERISTIC_CONFIGURATION) && descriptor.getValue().equals(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE)) { Log.i(TAG, "its a subscription!!!!"); for (int i = 0; i < 30; i++) { descriptor.getCharacteristic().setValue(String.format("new value: %d", i)); mGattServer.notifyCharacteristicChanged(device, descriptor.getCharacteristic(), false); } } } 

Sería mejor utilizar https://github.com/movisens/SmartGattLib para el uuid ( Descriptor.CLIENT_CHARACTERISTIC_CONFIGURATION pero el valor bruto es 00002902-0000-1000-8000-00805f9b34fb )

Acepto con @stefreak

y,

 bluetoothGatt.setCharacteristicNotification(characteristicToSubscribeTo, true); 

No hizo nada para el dispositivo remoto, esta API sólo cambió un bit de notificación en la pila local de Bluetooth, es decir, si las notificaciones de envío periférico a local, pila local juzgará si las aplicaciones ya han registrado esta notificación y si sí,

Por lo que, salvo setCharacteristicNotification, también debe escribir writeDescriptor para su notificación registrada (estos son los pasos que indican que las notificaciones de envío de necesidad remota).

  • Android: Administración de varias notificaciones
  • Abrir la aplicación Galería en Android
  • Marcadores del centro API V2 de Google maps
  • Android SDK Java: no encontrado
  • Extraños caracteres de cita alrededor de static java String (en android?)
  • ¿Cómo comprobar si la cadena introducida por el usuario está en formato mm / dd / aaaa en android?
  • Cambio entre la API de Google Maps para Android v2 DEBUG y la clave de API de RELEASE
  • Cómo calcular el tamaño de un archivo en Android
  • Emoticonos en EditText
  • Añadir filtros a un video como Instagram
  • No se puede importar com.google.api.client.json.jackson.JacksonFactory
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.