Что такое "надежная запись" в BLE?

В 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 документации по проекту Mozillas Boot 2 Gecko. Хотя это и предназначено для JavaScript, описание beginReliableWrite() в частности очень полезно для понимания процесса:

После того как была запущена надежная транзакция записи, все вызовы character.writeValue() отправляются на удаленное устройство для проверки и очереди для атомного исполнения. Обещание, что несет письменное значение возвращается в ответ на каждый character.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).

Первый ответ на StackOverflow, 'надеюсь, что кто-то найдет его полезным.