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) 设备通知的步骤是啥?

手机默认的 BLE(蓝牙)服务是啥?

将 BLE 服务和特征从 Fragment 传递到 Activity 以使用的最佳解决方案是啥?

使用 bluez 5.43 和 DBus 从 BLE 传感器读取广告数据包的正确方法是啥

WCF 可靠会话的目的是啥?

Elasticsearch7.8.0版本优化——写入速度优化