Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
483 views
in Technique[技术] by (71.8m points)

asynchronous - Android: BLE how to read multiple Characteristics?

Android BLE API methods for reading some characteristics are Asynchronous in nature and when you request some value, your GATT callback method is called.

If you request multiple read characteristics values it just simply discards others until it doesn't entertained the first request.

If someone know which design pattern we should adapt to solve this problem please share.

If you want to read some characteristics then you have to request it.

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

GATT callback

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

Possible Solution # 1

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

Anyone can explain how to use this . I think this will help in this case but I am still looking how to use it.

Possible Solution # 2

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

Possible Solution # 3

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

Possible Solution # 4

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

Possible Solution # 5

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

Update

I have managed to make it work with a Queue preferabley SynchronousQueue but I'll share my final solution after testing. Specify a timeout otherwise it will get stuck or if you request some read of characteristics that don't support read operation.

You can see which characteristics are readable writeable notifiable see this post

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Pseudocode:

  1. Use a FIFO Queue or Priority Queue depends upon your business logic

  2. insert all the characteristics you want to read

  3. call your requestCharacteristics method so that it can start consuming your Queue

  4. from your onCharacteristicsRead call see if the size of the queue is greater than Zero requests one more.. be sure to peek() from here

  5. now on your requestCharacteristics method do the poll() and request BLE GATT for characteristics.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...