2016-03-24 17 views
7

Provenendo da uno sfondo di iOS dev, quando si utilizza Bluetooth LE come periferica è possibile registrare una richiamata quando un dispositivo BLE "centrale" abbona (abilita le notifiche) per una caratteristica.Come sapere quando un dispositivo BLE si abbona a una caratteristica su Android?

Non riesco a vedere come si ottiene su Android. Se si lavora con Bluetooth LE che funge da centrale, posso vedere come ci si abbona: bluetoothGatt.setCharacteristicNotification(characteristicToSubscribeTo, true);

Che è lo stesso di questo su iOS: peripheralDevice.setNotifyValue(true, forCharacteristic characteristicToSubscribeTo)

Ora, dopo aver chiamato il sopra su iOS, sul lato periferico, si ottiene una richiamata per indicare che la centrale è stata sottoscritta con un metodo simile a: peripheralManager(manager, central subscribedCentral didSubscribeToCharacteristic characteristic) che fornisce un riferimento al dispositivo che ha registrato/abilitato le notifiche e a quale caratteristica.

Qual è l'equivalente su Android?

Per maggiore chiarezza, farò notare che non è necessario sottoscrivere una caratteristica su Android, il dispositivo funge da periferica e deve essere avvisato quando altri dispositivi si abbonano alle caratteristiche.

Scusa se questo è ovvio ma non riesco a trovarlo nei documenti o altrove.

+0

Hai bisogno di qualcosa come la richiamata? Non sei sicuro di quale sia il problema? –

+1

Scusa se non lo era, ma pensavo di essere abbastanza chiaro che ho bisogno di sapere come si è iscritto un dispositivo. Se è attraverso una richiamata allora è grandioso, ma ho solo bisogno di sapere come ottenere quell'informazione. È un callback su iOS, quindi questo è l'unico riferimento che ho come esempio. –

+0

@kanecheshire hai trovato qualcosa? ho bisogno dello stesso – stefreak

risposta

6

Proprio dopo aver impostato la bontà ho avuto un'idea, haha ​​dovrebbe aver aspettato un po 'più di dare il mio cervello più tempo per pensare;)

Sembra che iOS ha sottratto via un po' come le sottoscrizioni lavorano internamente. Sotto il cappuccio del CoreBluetooth ios un certo "Descrittore" della caratteristica è scritto dal Centro, che indica che il centro vuole sottoscrivere il valore della caratteristica.

Ecco il codice che è necessario aggiungere al vostro BluetoothGattServerCallback sottoclasse:

@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); 
      } 
     } 
    } 

sarebbe meglio usare https://github.com/movisens/SmartGattLib per l'UUID (Descriptor.CLIENT_CHARACTERISTIC_CONFIGURATION ma il valore grezzo è 00002902-0000-1000-8000-00805f9b34fb)

+0

Ah questo sembra buono. Ci proverò! Ci scusiamo per aver impiegato così tanto tempo a rispondere, stranamente non sono stato su SO per un po ':/ –

+0

np felice se aiuta ancora dopo tutti questi mesi – stefreak

+1

Anche se non ho ancora avuto la possibilità di provarlo, questo post sembra per correlare ciò che hai postato sopra: http://nilhcem.com/android-things/bluetooth-low-energy –

3

D'accordo con @ stefreak

e,

bluetoothGatt.setCharacteristicNotification(characteristicToSubscribeTo, true); 

non ha fatto nulla per il dispositivo remoto, questa API ha cambiato solo un bit di notifica nello stack Bluetooth locale, cioè se le periferiche invia notifiche a locale, lo stack locale giudicherà se le app hanno già registrato questa notifica e se sì, trasferirlo ad app altrimenti, ignorare esso.

quindi, ad eccezione di setCharacteristicNotification, è inoltre necessario disporre di writeDescriptor per la notifica registrata (questa è la procedura che indica che è necessario inviare notifiche remote).

+0

Ho anche notato che è necessario aggiungere la caratteristica sul lato server perché funzioni correttamente: 'BluetoothGattDescriptor descriptor = new BluetoothGattDescriptor (UUID.fromString ("00002902-0000-1000-8000-00805f9b34fb"), BluetoothGattDescriptor.PERMISSION_READ | BluetoothGattDescriptor.PERMISSION_WRITE); beaconCharacteristic.addDescriptor (descrittore); service.addCharacteristic (beaconCharacteristic); ' – stefreak

+0

corretto. Anche il server Gatt deve giudicare il valore dei descrittori per decidere se inviare la notifica o meno. Comunque penso che la denominazione dell'API di Android a volte non abbia senso ... –

Problemi correlati