tecnologia - Android: BLE cómo leer múltiples características?
gatt ble android (3)
Es posible que ya lo haya descubierto usted mismo, pero podría ser útil para otros.
No entendí si eso así que por qué hicieron los métodos Async.
Probablemente lo hicieron porque enviar una solicitud de lectura a otro dispositivo en ejecución sincrónica significaría que no puede hacer nada con su aplicación hasta que se reciba una respuesta. Al hacerlo Async puede hacer otras cosas, pero no otras solicitudes de bluetooth.
Los métodos de la API BLE de Android para leer algunas características son de naturaleza Asíncrona y cuando solicite algún valor, se llamará a su método de devolución de llamada GATT.
Si solicita varios valores de características de lectura, simplemente descarta otros hasta que no entretiene la primera solicitud.
No entendí si eso así que por qué hicieron los métodos Async. Si alguien sabe qué patrón de diseño debemos adaptar para resolver este problema, por favor compártelo.
Si quieres leer algunas características, entonces tienes que solicitarlo.
// new value available will be notified in Callback Object
mBluetoothGatt.readCharacteristic(ch);
Llamada GATT
public void onCharacteristicRead(BluetoothGatt gatt, android.bluetooth.BluetoothGattCharacteristic characteristic, int status)
Posible solución n. ° 1
https://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained
Cualquiera puede explicar cómo usar esto. Creo que esto ayudará en este caso, pero todavía estoy buscando cómo usarlo.
Posible solución n. ° 2
Posible solución n. ° 3
http://tutorials.jenkov.com/java-util-concurrent/synchronousqueue.html
Posible solución n. ° 4
Posible solución n. ° 5
https://stackoverflow.com/a/15816566/185022
Actualizar
Me las he arreglado para hacer que funcione con una Queue Preferiblemente SynchronousQueue pero compartiré mi solución final después de la prueba. Especifique un tiempo de espera de lo contrario se bloqueará o si solicita alguna lectura de características que no admiten la operación de lectura.
Puede ver qué características son legibles y escribibles de declaración obligatoria ver esta publicación
Posible solución n. ° 6: prueba la función de tarea proporcionada por https://github.com/BoltsFramework/Bolts-Android :-)
Pseudo código:
1) Usar una Cola FIFO o Cola Prioritaria depende de su lógica comercial
2) inserte todas las características que desea leer
3) llame a su método RequestCharacteristics para que pueda comenzar a consumir su cola
4) desde su llamada onCharacteristicsRead
vea si el tamaño de la cola es mayor a cero Solicite uno más ... asegúrese de peek()
desde aquí
5) ahora en su solicitud. Método de características haga el poll()
y solicite BLE GATT para la característica.