Android:BLE如何读取多个特征?

c9qzyr3d  于 2023-05-21  发布在  Android
关注(0)|答案(4)|浏览(200)

用于阅读某些特征的Android BLE API方法本质上是异步的,当您请求某些值时,将调用您的GATT回调方法。
如果您请求多个读取特征值,它只是简单地丢弃其他值,直到它不接受第一个请求。
如果有人知道我们应该采用哪种设计模式来解决这个问题,请分享。
如果你想读取一些特征,那么你必须请求它。

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

关贸总协定回拨

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

可能的解决方案#1

https://code.google.com/p/guava-libraries/wiki/ListenableFutureExplained
任何人都可以解释如何使用它。我认为这将有助于在这种情况下,但我仍然在寻找如何使用它。

可能的解决方案#2

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

可能的解决方案#3

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

可能的解决方案#4

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

可能的解决方案#5

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

更新

我已经设法使它与队列preferabley SynchronousQueue工作,但我会分享我的最终解决方案后,测试。指定一个超时,否则它会卡住,或者如果您请求读取一些不支持读取操作的特性。
您可以查看哪些特征是可读可写可通知see this post

3duebb1j

3duebb1j1#

伪代码:
1.使用FIFO队列或优先级队列取决于您的业务逻辑
1.插入所有你想要读取的特征
1.调用requestCharacteristics方法,以便它可以开始使用Queue
1.从onCharacteristicsRead调用中查看队列的大小是否大于零请求多一个。请务必从此处peek()
1.现在在你的requestCharacteristics方法上执行poll()并请求BLE GATT获取特性。

shyt4zoc

shyt4zoc2#

你可能已经发现了它,但它可能对其他人有用。
我不明白为什么他们要把方法异步化。
他们这样做可能是因为在同步执行中向另一个设备发送读取请求意味着在收到响应之前,您无法对应用程序做任何事情。通过使其异步,你可以做其他的事情,但没有其他蓝牙请求。

hyrbngr7

hyrbngr73#

可能的解决方案#6:尝试https://github.com/BoltsFramework/Bolts-Android提供的任务功能:-)

lfapxunr

lfapxunr4#

对于如何在Android上实现BLE,有一个真正好的,详细的解释,它还包括阅读多个特征的可能性。快看!
https://punchthrough.com/android-ble-guide/
有关更多信息,请查看Github上的这个仓库:
https://github.com/aeonSolutions/aeonlabs-open-software-catalogue

相关问题