问题描述
我注意到,如果我快速且连续地写入特征值,则 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
这是什么意思?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)