为什么onCharacteristicRead读取设置为readCharacteristic的不同特性



我是Java和OOP的新手。但是,我正在使用notify读取一个特征,然后在回调中使用read读取多个特征。

我想知道,为什么我只能从一个单一的特征(附加到通知的特征)获得值,而使用readCharacteristic(我的特征)。蓝牙gatt回调声明如下:

public boolean readCharacteristic

(BluetoothGattCharacteristic特点)从关联的远程设备读取请求的特性。

这是一个异步操作。读取操作的结果由BluetoothGattCallback#onCharacteristicRead callback.">

报告。我依次为每个特征调用readCharacteristic,并且总是在请求oncrahcharacteristicread回调执行之前等待下一个特征。但是在oncrahcharacteristicread中,最终被读取的特性每次都是相同的(不一定是我在readCharacteristic上请求的那个)。

我在某处读到我应该为特征设置优先队列。为什么会这样?为什么在readCharacteristic中首先有一个被请求的特征输入,gatt引用是如何声明这一点的。

感谢编辑

经过进一步的测试,我现在认为发生这种情况是因为某种原因

onCharacteristicRead ()

回调在读取第一个请求(读取)特征后卡住,但通知特征继续触发,导致

onCharacteristicChanged回调为重启->第一个特征再次被读取并卡住->新的通知等等

我在onCharacteristicChanged回调期间禁用了通知,这会导致程序在第一次读取

后卡住

onCharacteristicRead ()

程序永远不会离开onCharacteristicRead()回调。我尝试了优先级队列,最终读取(读)特征一次,但再次卡住,永远不会离开onCharacteristicRead回调。令人沮丧。什么好主意吗?

我的简单方法是使用CountDownLatch。我调用一个值为1的倒数锁存器(一个倒数)。然后我称之为读特性。然后等待倒计时锁(await()方法)。在BluetoothGattCallback中onCharacteristicRead执行倒计时,await函数将返回。然后你可以阅读结果。

依次做这个特性。我发现我必须等待回调信号,然后再尝试另一次读取。

像这样:

countDownLatch = new CountDownLatch(1)
BluetoothGatt.readCharacteristic(your characteristic)
if (countDownLatch.await(3, TimeUnit.SECONDS))  this blocks for at least 3 seconds
// if true no timeout
the characteristic value now has the read value.

在回调

onCharacteristicRead()
countDownLatch.count(); // Counts down 1 - this will cause the await method to return.

那只是我记忆中的草图。显然,两个线程之间必须知道CountDownLatch对象。你需要在'await()'方法上处理一个Interrupted异常。

最新更新