Android: BLE come leggere più caratteristiche?

I metodi dell’API Android BLE per la lettura di alcune caratteristiche sono di natura asincrona e quando si richiede un valore, viene chiamato il metodo di callback GATT.

Se si richiedono più valori di caratteristiche di lettura, semplicemente si scarta gli altri fino a quando non intrattiene la prima richiesta.

Non ho capito se fosse così perché hanno reso i metodi Async. Se qualcuno conosce quale modello di progettazione dovremmo adattare per risolvere questo problema, per favore condividi.

Se vuoi leggere alcune caratteristiche, devi richiederlo.

// new value available will be notified in Callback Object mBluetoothGatt.readCharacteristic(ch); 

Callback GATT

 public void onCharacteristicRead(BluetoothGatt gatt, android.bluetooth.BluetoothGattCharacteristic characteristic, int status) 

Possibile soluzione n. 1

https://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained

Chiunque può spiegare come usarlo. Penso che questo aiuterà in questo caso ma sto ancora cercando come usarlo.

Possibile soluzione n. 2

https://code.google.com/p/mobility-rpc/source/browse/mobility-rpc/trunk/src/main/java/com/googlecode/mobilityrpc/session/impl/MobilitySessionImpl.java#395

Possibile soluzione n. 3

http://tutorials.jenkov.com/java-util-concurrent/synchronousqueue.html

Possibile soluzione n

http://examples.javacodegeeks.com/core-java/util/concurrent/synchronous-queue-example-to-execute-commands/

Possibile soluzione # 5

https://stackoverflow.com/a/15816566/185022

Aggiornare

Sono riuscito a farlo funzionare con una coda preferibile SynchronousQueue ma condividerò la mia soluzione finale dopo il test. Specificare un timeout altrimenti si bloccherà o se si richiede una lettura delle caratteristiche che non supportano l’operazione di lettura.

Puoi vedere quali caratteristiche sono leggibili scrivibili notificabili vedi questo post

Pseudo codice:

1) Utilizzare una coda FIFO o una coda prioritaria dipende dalla logica aziendale

2) inserisci tutte le caratteristiche che vuoi leggere

3) chiama il tuo metodo di richiestaCaratteristiche in modo che possa iniziare a consumare la tua coda

4) dalla tua chiamata onCharacteristicsRead vedi se la dimensione della coda è maggiore di zero ne richiedi un’altra .. assicurati di peek() da qui

5) ora su richiesta. Metodo delle caratteristiche eseguire il poll() e richiedere BLE GATT per le caratteristiche.

Potresti averlo già scoperto da solo, ma potrebbe essere utile per gli altri.

Non ho capito se fosse così perché hanno reso i metodi Async.

Probabilmente l’hanno fatto perché inviare una richiesta di lettura a un altro dispositivo in esecuzione sincrona significherebbe che non puoi fare nulla con la tua app fino a quando non ricevi una risposta. Rendendolo Async puoi fare altre cose, ma senza altre richieste bluetooth.

Possibile soluzione n. 6: prova la funzione Task fornita da https://github.com/BoltsFramework/Bolts-Android 🙂