0

我注意到,如果我快速且连续地写入特征值,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

这是什么意思?

4

0 回答 0