本文介紹藍牙協議從物理層到應用層的完整通信流程,并詳解了 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 提供的調試工具,提供了命令級的使用方式。
如果你覺得有幫助,歡迎點贊、收藏、轉發!🚀