BLE 中的“可靠写入”是啥?
Posted
技术标签:
【中文标题】BLE 中的“可靠写入”是啥?【英文标题】:What is "reliable write" in BLE?BLE 中的“可靠写入”是什么? 【发布时间】:2014-06-30 08:08:07 【问题描述】:在 android 的 BLE API (BluetoothGatt) 中有处理可靠写入的方法:
public boolean beginReliableWrite ()
public void abortReliableWrite (BluetoothDevice mDevice)
public boolean executeReliableWrite ()
还有一个回调它(BluetoothGattCallback):
public void onReliableWriteCompleted (BluetoothGatt gatt, int status)
我找不到任何相关文档。它是什么?它与“正常”(不可靠?)写入有何不同?
【问题讨论】:
【参考方案1】:可靠的写入允许检查传输的值和一个或多个传输的消息的原子执行。
可以在BLE part of Mozillas Boot 2 Gecko Project documentation 中找到对可靠写入过程的很好解释。尽管它是针对 javascript 的,但 beginReliableWrite()
的描述尤其有助于理解该过程:
一旦启动了可靠的写入事务,所有对 characteristic.writeValue() 被发送到远程设备 验证并排队等待原子执行。一个承诺 携带写入的值返回以响应每个 characteristic.writeValue() 调用和应用程序负责 用于验证值是否已准确传输。后 所有特征都已排队和验证, executeReliableWrite() 将执行所有写入。如果一个特征 未正确写入,调用 abortReliableWrite() 将取消 当前事务没有在远程 LE 上提交任何值 设备。
您开始可靠的写入,
gatt.beginReliableWrite();
设置特征值并写入。
characteristic.setValue(value);
gatt.writeCharacteristic(characteristic);
writeCharacteristic()
调用将触发其“正常”回调。参数characteristic
包含可以验证的实际写入值:
@Override
public void onCharacteristicWrite(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status)
...
if(characteristic.getValue() != value)
gatt.abortReliableWrite();
else
gatt.executeReliableWrite();
...
执行可靠写入会触发onReliableWriteCompleted(BluetoothGatt gatt, int status)
回调。
【讨论】:
characteristic.getValue() != value 不比较内容,而是比较数组的内存地址,这是错误的。无论如何,由于 getValue() 不返回服务器发送的值,因此目前在 android 中的可靠写入已被破坏,这与文档所说的相反。 我们可以使用.contentEquals()
简单地修改特征值的比较以上是关于BLE 中的“可靠写入”是啥?的主要内容,如果未能解决你的问题,请参考以下文章
将 BLE 服务和特征从 Fragment 传递到 Activity 以使用的最佳解决方案是啥?