蓝牙协议架构与调试工具详解(含 BLE、HCI 命令、调试命令)
本文介绍蓝牙协议从物理层到应用层的完整通信流程,并详解了 Linux 下主流蓝牙调试工具的使用方法,适用于嵌入式蓝牙驱动开发、BLE调试、通信协议分析等场景。
🔧 1. 蓝牙架构概览
✅ 芯片架构
- 单模芯片:仅支持 BLE 或 Classic 蓝牙中的一种。
- 双模芯片:同时支持 BLE 和 Classic 蓝牙协议栈。
✅ 协议架构(三级分层)
Host层 ←→ 高层协议栈(L2CAP、ATT/GATT、SM)
Transport层 ←→ 传输协议(HCI over UART/USB/SDIO)
Controller层 ←→ 硬件控制器(Link Layer、PHY)
📶 2. 蓝牙物理层(PHY)
-
BLE 总共有 40 个频道:
- 3 个广播通道(37、38、39)
- 37 个数据通道(0~36)
🔗 3. 链路层(Link Layer)
📌 状态机定义
状态 | 描述 |
---|---|
Standby | 待机状态,不发不收 |
Advertising | 广播状态,监听/发送广播包 |
Scanning | 扫描广播包 |
Initiating | 发起连接请求 |
Connection | 建立连接后的通信状态 |
📌 角色定义
- Master:由 Initiating State 进入连接状态的设备
- Slave:由 Advertising State 进入连接状态的设备
📦 空中数据包结构(Air Packet)
Preamble + Access Address + PDU + CRC
🧩 4. HCI 传输层
✅ HCI 接口介绍
- Host 与 Controller 间的通信通过 HCI(Host Controller Interface)
- 可运行于 UART、USB、SDIO 等物理通道
📦 HCI 包类型
包类型 | 描述 |
---|---|
HCI Command Packet | Host → Controller,发送命令 |
HCI Event Packet | Controller → Host,事件响应 |
HCI ACL Data Packet | 双向数据包(异步) |
HCI Sync Data Packet | 双向数据包(同步) |
🛠️ HCI Command Packet 结构
OpCode = OGF(6bit) + OCF(10bit)
Parameter Total Length
Parameters(每个命令不同)
📨 5. L2CAP 层
- 复用机制:支持多个高层协议区分传输
- 分段重组:控制 PDU 长度,利于数据管理
- 流控与差错控制:对每个逻辑信道流量进行控制,并具备差错处理机制
一条 ACL 链路上可以存在多个 L2CAP 信道,便于多协议并存。
🔁 6. 蓝牙通信流程(BLE)
🌟 初始化控制器
HCI_Reset
HCI_Read_Local_Supported_Features
HCI_Set_Event_Mask
HCI_Read_Buffer_Size
HCI_Read_BDADDR
📣 广播状态设置
LE_Set_Advertising_Parameters
LE_Set_Advertising_Data
LE_Set_Scan_Response_Data
LE_Set_Advertising_Enable
🔍 扫描状态设置
LE_Set_Scan_Parameters
LE_Set_Scan_Enable
LE Advertising Report
(扫描结果)
🔗 发起连接
LE_Create_Connection
LE_Connection_Complete
📤 数据交互
- 建立连接后即可通过 L2CAP 层传输数据
❌ 断开连接
HCI_Disconnect
Disconnection Complete
🛠️ 7. 蓝牙调试工具
🔧 hciconfig
- HCI设备配置工具
hciconfig hci0 up # 启动设备
hciconfig hci0 down # 关闭设备
hciconfig hci0 reset # 重置蓝牙设备
hciconfig hci0 name NAME # 设置蓝牙名称
hciconfig hci0 leadv # 开启广播
🔧 hcitool
- HCI命令工具
hcitool dev # 查看HCI设备
hcitool inq # 发现设备
hcitool name <MAC> # 获取设备名称
hcitool lescan # BLE扫描
hcitool lecc <MAC> # 连接BLE设备
hcitool ledc <MAC> # 断开BLE设备
🔍 hcidump
- 蓝牙包嗅探工具
hcidump -i hci0 -Xt -w bt_debug.cfa &
-X
: ASCII + 十六进制-t
: 显示时间戳-w
: 输出到文件
⚙️ hciattach
- 绑定串口蓝牙模块到 HCI
hciattach -n -s 115200 ttyS0 rtk_h5 &
-s
: 波特率-n
: 不脱离控制台ttyS0
: 串口名称
📡 btmon
- 蓝牙日志抓取工具
btmon -i hci0 -w btmon_debug.log &
btmon -r btmon_debug.log # 回放日志
-i
: 指定 HCI 设备-w
: 写入文件-r
: 读取文件回放
🔌 bluetoothd
- BlueZ 后台服务
bluetoothd -C -d -n &
-d
: DEBUG 模式-C
: 支持 legacy 命令-n
: 前台运行,方便调试日志查看
🧭 bluetoothctl
- 蓝牙交互工具
bluetoothctl
> list # 查看控制器
> show # 详细信息
> power on # 打开设备
> scan on # 开始扫描
> pairable on # 设置可配对
> discoverable on # 可发现
> pair <MAC> # 配对设备
> connect <MAC> # 连接设备
> exit # 退出
✅ 结语
本文系统地梳理了蓝牙 BLE 协议从底层到上层的通信机制,涵盖 HCI 结构、通信流程,并结合 Linux 下 BlueZ 提供的调试工具,提供了命令级的使用方式。
如果你觉得有帮助,欢迎点赞、收藏、转发!🚀