【问题标题】: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)

我找不到任何相关文档。它是什么?它与“正常”(不可靠?)写入有何不同?

【问题讨论】:

    标签: android bluetooth-lowenergy android-bluetooth


    【解决方案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()简单地修改特征值的比较
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2015-01-26
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多