我注意到,如果我快速且连续地写入特征值,gatt 服务器将断开连接。我知道我必须等到onCharacteristicWrite
回调,所以我认为这不是问题。
这是我的队列实现,我使用kotlin Channel来同步写入和读取。
private var continuation: CancellableContinuation<BluetoothGattCharacteristic>? = null
private val channel = Channel<WriteOp>(1)
private suspend fun processBluetoothWrite() {
do {
val writeOp = channel.receiveOrNull()
writeOp?.apply {
try {
suspendCancellableCoroutine<BluetoothGattCharacteristic> { cont ->
continuation = cont
characteristic.value = writeOp?.value
Log.d(TAG, "Write to ${characteristic?.uuid} value ${writeOp?.value?.toHexString()}...")
if (gatt?.writeCharacteristic(characteristic) == false) {
cont.resumeWithException(Exception("Write to ${characteristic?.uuid} fails."))
}
}
} catch (ex: Exception) {
Log.e(TAG, ex.message, ex)
}
}
} while (writeOp != null)
}
override fun onCharacteristicWrite(
gatt: BluetoothGatt?,
characteristic: BluetoothGattCharacteristic?,
status: Int
) {
Log.d(TAG, "Write to ${characteristic?.uuid} value ${characteristic?.value?.toHexString()} | ${status}")
characteristic?.apply {
if (status == BluetoothGatt.GATT_SUCCESS) {
continuation?.resume(this)
} else {
continuation?.resumeWithException(Exception("Write to ${characteristic?.uuid} value ${characteristic?.value?.toHexString()} | ${status}"))
}
}
}
我需要在队列处理中添加大约 100ms 的延迟以避免断开连接。
更新
设置writeType
为默认值后,似乎onCharacteristicWrite
更现实(我以前即使设备停止通信也得到 GATT_SUCCESS,所以我猜这是“虚拟”状态),现在当设备停止通信时它没有得到onCharacteristicWrite
回调,虽然一段时间后它会以 status = 133 触发。
characteristic.writeType = BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT
这是什么意思?