蓝牙协议架构与调试工具详解(含 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 提供的调试工具,提供了命令级的使用方式。
如果你觉得有帮助,欢迎点赞、收藏、转发!🚀
