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

使用BlueZ发送BLE GATT 0x12写请求而非0x16的技术问询

如何让Gatttool发送0x12 Write Command而非0x16 Prepare Write Request

我明白你在逆向工程无配对BLE设备时遇到的问题:用--char-write-req参数执行写操作时,Gatttool自动发送了0x16预备写请求,但你需要的是0x12的写命令。这其实是参数选择的问题,很容易解决。

修正后的命令

把你原来命令里的--char-write-req替换成--char-write(去掉-req后缀)就行:

sudo gatttool -i hci0 -b 54:6C:0E:21:F5:99 --char-write -a 0x0030 -n 110100701301000110010030721000d68c054688df413aa89fb3cfab3d6457172000053958839fa147ac53c129eafc524829bc9ed7655fe96c9f641745c4e07cf044

背后的原因

这里的关键是Gatttool两个写参数的差异:

  • --char-write-req:这个参数对应ATT层的Write Request,如果要写入的数据长度超过当前BLE连接的MTU值,Gatttool会自动拆分数据,用Prepare Write Request(0x16) + Execute Write Request的组合来完成写入,这就是你在Wireshark里看到0x16包的原因。
  • --char-write:这个参数对应ATT层的Write Command(0x12),这是无响应的写操作,不会触发预备写流程,直接尝试发送完整的写命令(如果数据长度在MTU范围内的话)。

额外的调试技巧

如果你想确认发送的操作码确实是0x12,可以在命令里加上-t参数开启调试输出,这样能看到底层发送的ATT包细节:

sudo gatttool -i hci0 -b 54:6C:0E:21:F5:99 -t --char-write -a 0x0030 -n 110100701301000110010030721000d68c054688df413aa89fb3cfab3d6457172000053958839fa147ac53c129eafc524829bc9ed7655fe96c9f641745c4e07cf044

在输出日志里找类似ATT: Send: 0x12 ...的内容,就能验证操作码正确了。

内容的提问来源于stack exchange,提问作者Lucas Kauffman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:53:12