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

如何在BlueZ 5.56中通过hcitool合并厂商数据与服务UUID广播?

解决wilc3000模块同时广播厂商数据与服务UUID的冲突问题

问题背景

在搭载Atmel wilc3000 Wi-Fi/蓝牙模块的定制嵌入式Linux 5.15板卡上运行BlueZ 5.56时:

  • BlueZ示例的Python GATT服务器广播功能无法适配wilc3000,需手动通过hcitool启动广播
  • 单独发送厂商数据广播或服务UUID广播均正常,但同时设置时二者冲突,出现仅接收一种数据或空广播的情况
  • 测试工具为Macbook上的LightBlue

解决方案

核心原因

BLE广播包的最大有效长度为31字节,原两个单独广播的数据总长度超过了该限制,导致冲突。需将数据合并到一个广播包(或拆分到广播包+扫描响应包)中。

方案1:去掉本地名称,合并到单个广播包

如果不需要广播设备名称,可直接将厂商数据与服务UUID合并到一个广播包中,总长度控制在31字节内:

# 合并厂商数据与服务UUID的广播命令
hcitool -i hci0 cmd 0x08 0x0008 1B 02 01 06 05 ff fe 01 00 31 11 07 30 44 5a 3e 35 50 0f ab 01 48 fd 25 11 63 a7 f5 00 00 00 00

参数说明:

  • 0x08 0x0008:HCI设置广播数据命令
  • 1B:十六进制,对应十进制27,为后续有效广播数据的总长度
  • 02 01 06:LE通用可发现模式标志位
  • 05 ff fe 01 00 31:厂商特定数据(厂商ID 01FE,自定义数据 00 31)
  • 11 07 30 44 5a 3e 35 50 0f ab 01 48 fd 25 11 63 a7 f5:完整128位服务UUID列表

方案2:保留本地名称,拆分到广播包+扫描响应包

若需保留设备名称,将服务UUID和标志位放在广播包,厂商数据和名称放在扫描响应包:

# 设置广播数据(含服务UUID和标志位)
hcitool -i hci0 cmd 0x08 0x0008 15 02 01 06 11 07 30 44 5a 3e 35 50 0f ab 01 48 fd 25 11 63 a7 f5 00 00 00 00 00 00

# 设置扫描响应数据(含本地名称和厂商数据)
hcitool -i hci0 cmd 0x08 0x0009 0E 07 09 61 62 63 64 65 66 05 ff fe 01 00 31 00 00 00 00 00 00 00 00 00 00

启动广播

执行上述命令后,启动非连接可发现模式广播:

hciconfig hci0 leadv 3

注意事项

  • 严格遵循BLE AD单元格式:每个单元以长度字节开头,长度值为后续AD类型+数据的总字节数
  • 广播数据总长度不可超过31字节,超出部分必须放入扫描响应包
  • 可使用hcitool lescan在另一台Linux设备上验证广播内容,确认数据是否正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:58:12