Android,BLE不断写一个特征值断开gatt服务器

问题描述

我注意到,如果我快速且连续地写入特征值,则 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 (将#修改为@)