You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BLE GattCharacteristic WriteValue未触发调用问题排查求助

GATT特征写入异常:手机端仅发送Prepare Write Request无后续Execute步骤

问题背景

使用Raspberry Pi 4 Model B遵循《The Bluetooth Technology for Linux Developers Study Guide》搭建GATT服务器(跳过第5部分),前期流程正常,在「Handling Characteristic Writes」环节出现异常。

现象细节

  1. nRF Connect客户端日志显示数据已发送:
Writing request to characteristic e95d93ee-251d-470a-a062-fa1922dfa9a8
Data written to e95d93ee-251d-470a-a062-fa1922dfa9a8, value: (0x)68-65-6C-6C-6F, "hello"
"hello" sent
  1. sudo btmon日志显示RPi仅收到Prepare Write Request (0x16),回复Prepare Write Response后无后续Execute Write Request:
> ACL Data RX: Handle 64 flags 0x02 dlen 14               #129 [hci0] 82.584227
      ATT: Prepare Write Request (0x16) len 9
        Handle: 0x0019
        Offset: 0x0000
          Data: 68656c6c6f
< ACL Data TX: Handle 64 flags 0x00 dlen 14               #130 [hci0] 82.585053
      ATT: Prepare Write Response (0x17) len 9
        Handle: 0x0019
        Offset: 0x0000
          Data: 68656c6c6f
> HCI Event: Number of Completed Packets (0x13) plen 5    #131 [hci0] 82.814773
        Num handles: 1
        Handle: 64
        Count: 1
  1. 开启-nd参数的bluetoothd日志(tail -f /var/log/syslog)能看到ATT PDU,但sudo dbus-monitor --system无输出,业务程序终端也未收到写入事件。
  2. 旧三星平板测试正常,重装nRF Connect和BlueZ后问题依旧。

原因分析

核心问题出在手机端的蓝牙写入流程:

  • 蓝牙ATT协议中,分段写入需要Prepare Write + Execute Write两步完成,仅发送Prepare Write不会触发GATT服务器的最终写入回调——Prepare只是暂存数据,必须通过Execute确认提交才会触发业务逻辑。
  • 手机端未发送Execute Write Request的可能原因:
    • nRF Connect写入模式配置错误:默认选择了「Queued Write」模式,但未手动点击「Execute」按钮提交队列;或误选了不触发确认的写入类型。
    • 手机蓝牙栈兼容性问题:部分新手机的蓝牙栈对短数据也默认启用分段写入逻辑,但在某些场景下未自动触发Execute步骤。
    • 特征属性与客户端写入类型不匹配:虽然平板测试正常,但仍需确认GATT特征是否同时支持WRITE属性(避免客户端被迫使用分段写入却无法完成流程)。

排查与解决步骤

  • 调整nRF Connect写入设置:
    • 点击特征写入按钮旁的设置图标,确认写入类型选择为Write Request,而非「Queued Write」或「Write Command」。
    • 如果使用Queued Write模式,写入数据后必须点击「Execute」按钮完成提交。
  • 重置手机蓝牙状态:关闭手机蓝牙后重新开启,或删除与RPi的配对信息后重新配对。
  • 检查BlueZ特征配置:确认GATT特征注册时包含GATT_CHRC_WRITE属性(参考教程中的特征初始化代码)。
  • 查看BlueZ详细日志:停止原有bluetoothd服务,用bluetoothd -d -n直接运行,观察是否有关于Execute Write的异常日志。

内容的提问来源于stack exchange,提问作者Yanis Bouger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:06:20