如果没有错误发生,是否假定 Android BluetoothGattCallback onCharacteristicWrite 函数成功?

Is success assumed with Android BluetoothGattCallback onCharacteristicWrite function if no error occurs?

正在开发 Android 应用程序以通过 BLE 将数据发送到外围设备。关于 Android BluetoothGATTCallback onCharacteristicWrite 函数的问题 - 它如何知道写入事务成功?是不是只要不出错就认为成功了?或者它是否记录了从写入数据的外围设备特征发送的某种成功响应?

如果 BluetoothGATTCallback 的 onCharacteristicWrite() 的状态参数等于 BluetoothGatt.GATT_SUCCESS 即 0

,您可以假设 BLE 写入事务成功

如果发生错误,状态值会指示错误的类型,例如

/** GATT write operation is not permitted */
public static final int GATT_WRITE_NOT_PERMITTED = 0x3;

这是关于 onCharacteristicWrite() 的文档的摘录:

Params: ... status – The result of the write operation BluetoothGatt.GATT_SUCCESS if the operation succeeds.

我会说 matdev 在他的回答中的评论是不正确的,至少根据我的经验。

假设您使用“Write With Response”(WRITE_TYPE_DEFAULT) 而不是“Write Without Response”(WRITE_TYPE_NO_RESPONSE),则以下适用:

你先打电话给writeCharacteristic。此方法执行一些健全性检查,例如您尝试写入的特性具有“写入”属性,此 BluetoothGatt 对象上没有其他待处理的 GATT 操作,并且该对象不是关闭。如果通过了这些完整性检查,此方法 returns true.

写请求随后通过无线传输到远程设备的 GATT 服务器。这里请求被处理,GATT 服务器 returns 写响应或带有错误代码的错误响应,被发送回 Android 设备。当 Android 收到写入响应时,它将调用 onCharacteristicWrite 并以 GATT_SUCCESS (0) 作为状态。如果 Android 收到错误响应,它将调用 onCharacteristicWrite 并将状态设置为错误响应中包含的代码。如果 GATT 服务器,例如returns 0x80(应用程序错误)或 0x13(不允许的值),这是您将在回调中收到的状态代码。

如果在收到响应之前连接断开,Android 将使用一些当前未记录的非成功状态代码调用回调。

如果您改用“无响应写入”(WRITE_TYPE_NO_RESPONSE),onCharacteristicWrite 的行为会发生变化。现在,此回调改为用于流量控制。当本地蓝牙堆栈的缓冲区准备好接受另一个数据包时,您将收到回调。这甚至可能发生在数据包通过空中发送之前。