我有一个用于发送消息缓冲区的消息线程。每条消息都会排队等待发送一次,一旦onCharacteristicWrite
成功,该特征就会写入下一条消息。特性也设置为WRITE_TYPE_NO_RESPONSE
,因此特性写入调用之间的消息缓冲队列非常快(大约 0-7 毫秒)。
主要问题:“堵塞”特征
在大多数情况下,这效果很好。当存在大量消息时,似乎会出现此问题(可能会在消息较少时发生,但在发送大量消息时更明显)。发生的情况是writeCharacteristic
will 被调用,并且该特性似乎锁定,因为onCharacteristicChanged
不再读取任何新数据,并且无法访问onCharacteristicWrite
.
我注意到的其他事情:
每次添加 5-10ms 的睡眠延迟characteristicWrite
似乎有帮助,但我不明白为什么蓝牙 GATT 对象在成功返回时需要延迟onCharacteristicWrite
。
onConnectionStateChange
有时我会收到状态 8、设备超出范围的回调。但这并不总是发生。
有时characteristicWrite
返回 false;然而,它也可以在进入上述“堵塞特征”状态之前返回 true
消息线程代码:
private boolean stopMessageThread = false;
private boolean characteristicWriteSuccessful = true;
private ArrayList<byte[]> messageQueue = new ArrayList<byte[]>();
private Thread messageThread = new Thread( new Runnable() {
private long lastTime = 0;
private int count = 0;
@Override
public void run() {
while (!Thread.currentThread().isInterrupted() && !stopMessageThread) {
if(messageQueue.size() != 0 && characteristicWriteSuccessful) {
Log.i(TAG, ""+(System.currentTimeMillis()-lastTime));
Log.i(TAG, "Queue count: "+messageQueue.size());
characteristicWriteSuccessful = false;
byte[] message = messageQueue.remove(0);
customCharacteristic.setValue(message);
boolean status = bluetoothGatt.writeCharacteristic(customCharacteristic);
Log.i(TAG, "write characteristic status "+status);
lastTime = System.currentTimeMillis();
//sleep(10); // this kinda helps but can still throw the error
}
}
}
});
呼唤远方
相关分类