如何实现双通道Bluetooth GATT服务特征写入避免断开连接(状态133)
解决BLE写入第二个特征触发断开(状态码133)的问题
1. 排查设备端特征属性配置
- 用nrf Connect查看第二个特征的属性(Properties),确认是否包含
Write(带响应写入)权限——你当前用的是WRITE_TYPE_DEFAULT,要求设备端必须支持带响应的写入操作。如果设备端仅配置了Write Without Response,用默认写入类型会直接触发错误。 - nrf显示该特征为
unknown_characteristic(2),需确认设备端的GATT服务定义:是否正确设置了该特征的UUID、属性,以及对应的写入处理逻辑(比如是否能正常回复GATT写入响应)。
2. 匹配写入类型与特征属性
- 尝试将第二个特征的写入类型改为
WRITE_TYPE_NO_RESPONSE,和第一个特征一致,测试是否还会断开:// 修改function2的写入类型 mTxCharacteristic2.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE mTxCharacteristic2.value = chunk gatt.writeCharacteristic(mTxCharacteristic2) - 如果此方式能正常工作,说明设备端该特征不支持带响应写入,需统一写入类型,或修改设备端的特征属性配置。
3. 修正可靠写入的使用方式
- 你之前使用可靠写入时错误添加了
setCharacteristicNotification,通知与可靠写入无关,应移除该行代码。正确的可靠写入流程如下:// 开始可靠写入 if (gatt.beginReliableWrite()) { mTxCharacteristic2.value = chunk gatt.writeCharacteristic(mTxCharacteristic2) // 不要直接调用executeReliableWrite,需等onCharacteristicWrite回调确认写入成功后再执行 } - 在
onCharacteristicWrite回调中,判断写入对象为mTxCharacteristic2且状态成功后,再执行提交:override fun onCharacteristicWrite(gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic?, status: Int) { super.onCharacteristicWrite(gatt, characteristic, status) if (characteristic?.uuid == mTxCharacteristic2.uuid && status == BluetoothGatt.GATT_SUCCESS) { gatt?.executeReliableWrite() } else { // 写入失败,取消可靠写入 gatt?.abortReliableWrite() } } - 注意:若设备端不支持可靠写入,此方式也会触发错误,需先确认设备端的支持情况。
4. 清理BLE栈缓存,避免重启设备才能重连
- 断开连接后,不要直接尝试重连,先调用
gatt.close()释放资源,再通过device.connectGatt(context, false, gattCallback)获取新的BluetoothGatt实例,清除安卓BLE栈中缓存的旧服务/特征信息,避免因缓存导致重连失败。
5. 排查并发写入问题
- 确保BLE操作串行执行,不要在一个写入操作的回调未返回前发起另一个写入。可维护一个操作队列,仅当前操作完成后,再执行下一个任务。
内容的提问来源于stack exchange,提问作者Shivam
相关产品推荐
相关产品推荐

