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

使用hcitool无法设置扫描响应数据的技术问题求助

问题

我尝试用hci工具发送BLE广播数据(AD数据包)和扫描响应数据,参考了Stack Overflow上《Using hcitool to set ad packets》的方法,用OCF 0x0009设置扫描响应数据,但始终无法成功发送扫描响应——要么只能发AD数据,要么完全发不出任何数据。用ESP32可以正常发送相同的AD+扫描响应数据,但树莓派4内置蓝牙不行。

我的完整命令如下(Apple ID为占位符):

hciconfig hci0 up
hciconfig hci0 piscan
hciconfig hci0 leadv 0
hcitool -i hci0 cmd 0x08 0x0008 1F 02 01 06 1B FF 4C 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
hcitool -i hci0 cmd 0x08 0x0009 1F 1E FF 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02

之前用leadv 3只发AD数据一切正常,但扫描响应要求设备可连接,所以改成了leadv 0。运行命令时的btmon日志内容翻译如下:

HCI事件:命令状态(0x0f) plen 4
LE设置广告数据(0x08|0x0008)ncmd 1
状态:成功(0x00)
HCI事件:命令状态(0x0f) plen 4
LE设置扫描响应数据(0x08|0x0009)ncmd 1
状态:成功(0x00)
HCI命令:LE设置广告启用(0x08|0x000a) plen 1
广告启用:禁用(0x00)
HCI事件:命令状态(0x0f) plen 4
LE设置广告启用(0x08|0x000a)ncmd 1
状态:成功(0x00)
HCI命令:LE设置广告参数(0x08|0x0006) plen 15
最小广告间隔:1600(1000 ms)
最大广告间隔:1600(1000 ms)
广告类型:可连接非定向广告(0x00)
自己地址类型:公共地址(0x00)
直接地址类型:公共地址(0x00)
直接地址:00:00:00:00:00:00(OUI 00-00-00)
广告信道映射:37, 38, 39(0x07)
过滤策略:允许任何设备(0x00)
HCI事件:命令状态(0x0f) plen 4
LE设置广告参数(0x08|0x0006)ncmd 1
状态:成功(0x00)
HCI命令:LE设置广告启用(0x08|0x000a) plen 1
广告启用:启用(0x01)
HCI事件:命令状态(0x0f) plen 4
LE设置广告启用(0x08|0x000a)ncmd 1
状态:成功(0x00)

解决方法

1. 调整命令执行顺序

leadv 0会自动重置广告参数并启用广告,导致你之前设置的AD和扫描响应数据被覆盖。正确顺序是先设置数据,再开启广告模式:

# 1. 启动蓝牙设备
hciconfig hci0 up
# 2. 设置可连接可扫描模式
hciconfig hci0 piscan
# 3. 设置AD广播数据
hcitool -i hci0 cmd 0x08 0x0008 1F 02 01 06 1B FF 4C 00 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
# 4. 设置扫描响应数据
hcitool -i hci0 cmd 0x08 0x0009 1E 1E FF 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02
# 5. 开启可连接广告模式
hciconfig hci0 leadv 0

2. 修正扫描响应数据的长度问题

BLE规范要求AD/扫描响应数据包的总长度不能超过31字节。你原来的扫描响应命令第一个字节是1F(表示总长度31字节),但实际内容是1(长度字段)+1(类型字段)+30(数据)=32字节,超出限制导致数据被丢弃。

修正方法:把第一个字节改成1E(30字节),对应后面的数据长度减少1个字节,确保总长度符合规范(如上面修正后的命令)。

3. 验证逻辑

leadv命令本质是调用了LE Set Advertising Parameters和LE Set Advertising Enable两个HCI命令,如果先执行leadv再设置数据,后续的设置不会生效——因为广告已经在运行,蓝牙栈不会主动更新正在广播的内容。必须先配置好所有数据,再启动广告。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:17:04