蓝牙数据包从底层到应用层协议一层套一层

2026-11-04 13:31:38 秘境攻略

下面给你最简短、最清晰、最准确的蓝牙协议栈按层说明 ------ 从硬件 → 内核 → 用户空间 → 应用程序 ,附带每一层的协议格式 + 层层封装关系。

bash

复制代码

sudo btmon 命令结果:

> ACL Data RX: Handle 3 flags 0x02 dlen 9 #4 [hci0] 37.417566

ATT: Write Request (0x12) len 4

Handle: 0x0029

Data[2]: 0000

bluetoothd[2062]: < ACL Data TX: Handl.. flags 0x00 dlen 5 #5 [hci0] 37.417793

ATT: Write Response (0x13) len 0

> HCI Event: Number of Completed Packets (0x13) plen 5 #6 [hci0] 37.476344

Num handles: 1

Handle: 3

Count: 1

> ACL Data RX: Handle 3 flags 0x02 dlen 9 #7 [hci0] 59.713568

ATT: Write Request (0x12) len 4

Handle: 0x0029

Data[2]: 0100

bluetoothd[2062]: < ACL Data TX: Handl.. flags 0x00 dlen 5 #8 [hci0] 59.713810

ATT: Write Response (0x13) len 0

> HCI Event: Number of Completed Packets (0x13) plen 5 #9 [hci0] 59.772533

Num handles: 1

Handle: 3

Count: 1

> ACL Data RX: Handle 3 flags 0x02 dlen 9 #10 [hci0] 74.297554

ATT: Write Request (0x12) len 4

Handle: 0x0029

Data[2]: 0100

bluetoothd[2062]: < ACL Data TX: Hand.. flags 0x00 dlen 5 #11 [hci0] 74.297732

ATT: Write Response (0x13) len 0

> HCI Event: Number of Completed Packets (0x13) plen 5 #12 [hci0] 74.356721

Num handles: 1

Handle: 3

Count: 1

> ACL Data RX: Handle 3 flags 0x02 dlen 9 #13 [hci0] 99.144558

ATT: Write Request (0x12) len 4

Handle: 0x0029

Data[2]: 0100

bluetoothd[2062]: < ACL Data TX: Hand.. flags 0x00 dlen 5 #14 [hci0] 99.144798

ATT: Write Response (0x13) len 0

> HCI Event: Number of Completed Packets (0x13) plen 5 #15 [hci0] 99.202976

Num handles: 1

Handle: 3

Count: 1

> ACL Data RX: Handle 3 flags 0x02 dlen 9 #16 [hci0] 99.894540

ATT: Write Request (0x12) len 4

Handle: 0x002c

Data[2]: 0100

bluetoothd[2062]: < ACL Data TX: Hand.. flags 0x00 dlen 5 #17 [hci0] 99.894754

ATT: Write Response (0x13) len 0

> HCI Event: Number of Completed Packets (0x13) plen 5 #18 [hci0] 99.953187

Num handles: 1

Handle: 3

Count: 1

> ACL Data RX: Handle 3 flags 0x02 dlen 7 #19 [hci0] 102.145559

ATT: Read Request (0x0a) len 2

Handle: 0x0028

bluetoothd[2062]: < ACL Data TX: Ha.. flags 0x00 dlen 15 #20 [hci0] 102.147473

ATT: Read Response (0x0b) len 10

Value[10]: 696e69742076616c7565

> HCI Event: Number of Completed Packets (0x13) plen 5 #21 [hci0] 102.203859

Num handles: 1

Handle: 3

Count: 1

> HCI Event: LE Meta Event (0x3e) plen 6 #22 [hci0] 121.049424

LE PHY Update Complete (0x0c)

Status: Success (0x00)

Handle: 3

TX PHY: LE 1M (0x01)

RX PHY: LE 2M (0x02)

> HCI Event: LE Meta Event (0x3e) plen 6 #23 [hci0] 122.699915

LE PHY Update Complete (0x0c)

Status: Success (0x00)

Handle: 3

TX PHY: LE 2M (0x02)

RX PHY: LE 2M (0x02)

✅ 1. Bluetooth Controller(硬件)

位置:蓝牙芯片(Nordic / Broadcom / CSR / Intel)

软件层不存在,这里只有 Link Layer + Radio PHY:

协议格式:LL PDU(链路层 PDU)

复制代码

┌──────────────┐

│ Link Layer │ (Connection, Advertising)

└──────────────┘

┌──────────────┐

│ PHY (RF) │ (1M, 2M, Coded PHY)

└──────────────┘

硬件执行:

发射/接收 BLE 无线电帧(LL PDU)

加密/解密

信道跳频

广播、扫描、连接管理

✅ 2. 内核 (Kernel) -- HCI 层

位置:Linux 内核 BlueZ 内核模块

硬件 → 内核之间通过 HCI 协议(主机控制接口) 通信。

协议格式:HCI Packet

复制代码

┌──────────────────────────────┐

│ HCI Command (Host → Controller) │

│ HCI Event (Controller → Host) │

│ HCI ACL Data │

└──────────────────────────────┘

例:

复制代码

HCI Command: LE Set Advertising Enable

HCI Event: LE Connection Complete

这三个是 蓝牙协议栈 HCI 层里最核心的三类数据通道,它们的作用完全不同:

🔹1. HCI Command(主机 → 控制器)

方向:从 Host(操作系统/协议栈)发给 Controller(蓝牙芯片)。

作用:下达控制指令,配置和管理蓝牙硬件。

典型用途 :

打开/关闭适配器

设置扫描参数

发起连接请求

配对、加密、功耗模式切换

特点:命令是"控制面"的操作,不承载用户数据。

🔹2. HCI Event(控制器 → 主机)

方向:从 Controller 返回给 Host。

作用:反馈命令执行结果,报告状态或异步事件。

典型用途 :

命令完成/失败通知

发现新设备(Inquiry Result)

连接建立/断开事件

错误码、状态更新

特点:事件是"通知面",告诉主机硬件发生了什么。

🔹3. HCI ACL Data(异步连接链路数据)

方向:双向(Host ↔ Controller)。

作用:传输实际的用户数据包(L2CAP 层数据)。

典型用途 :

音频流(A2DP)

文件传输(OBEX)

HID 键盘鼠标数据

特点:这是"数据面",真正承载应用层的蓝牙数据。

🔹整体关系

Command:主机下达指令 → 控制器执行。

Event:控制器反馈结果 → 主机获知状态。

ACL Data:双方传输实际数据 → 用户应用得以工作。

可以把它类比成网络协议里的三层:

Command = 控制报文(像 TCP 的 SYN/ACK 控制)

Event = 状态反馈(像 ICMP 或 ACK)

ACL Data = 用户数据(像 TCP/UDP payload)

✅ 总结:

Command:主机发指令控制硬件。

Event:硬件返回状态和通知。

ACL Data:双方传输实际业务数据。

内核负责:

控制蓝牙芯片

收发 ACL(数据) 和 SCO(音频) 包

向 bluetoothd 暴露 "hci0" 设备

✅ 3. 内核 (Kernel) -- L2CAP 层

位置:仍然在内核 BlueZ 驱动里

协议格式:L2CAP PDU

复制代码

┌──────────────────────────┐

│ L2CAP Header (CID, Len) │

│ Payload (ATT / SMP / etc)│

└──────────────────────────┘

用途:

多路复用 ACL Data

GATT、SMP 全都通过 L2CAP 传输

✅ 4. 用户空间 -- bluetoothd(BlueZ 守护进程)

位置:用户空间进程 /usr/lib/bluetooth/bluetoothd

它负责:

GATT(ATT 解释器)

配对(SMP)

Profile(HID/A2DP/GATT Server)

与内核通信(通过 MGMT socket)

提供 DBus API 给应用程序

协议格式:ATT / GATT

复制代码

┌──────────────────┐

│ ATT PDU │ (Read, Write, Notify)

└──────────────────┘

┌──────────────────┐

│ GATT Attribute │ (Service, Characteristic)

└──────────────────┘

例:

复制代码

ATT: Read By Type Request

ATT: Write Request

✅ 5. 用户空间 -- BlueZ MGMT(管理协议)

协议格式:MGMT Command / Event(Linux 专用)

复制代码

MGMT Event: Device Connected

MGMT Command: Set Advertising

用于:

bluetoothd ←→ 内核通信

设置控制器状态(开关机、配对、广告参数等)

✅ 6. 用户应用层 -- App(Python/C++/ROS/etc)

通过 DBus API 或 GATT 直接操作:

gatttool(旧)

bluetoothctl

C/C++ BlueZ API

Python BlueZ / Bleak / PyBluez

Android/iOS 应用

应用不直接接触 HCI,只操作 GATT 服务。

协议格式取决于使用的 API:

应用层数据格式:

复制代码

GATT Characteristics Value(字节流)

GATT Notifications

DBus messages (properties, methods)

📌 蓝牙协议封装关系(从上到下)

✔ 应用发送一个"写入 GATT 特征值"

实际流程如下:

复制代码

App (GATT Write Value)

↓

bluetoothd 生成 ATT Packet

↓

ATT PDU

↓

封装进 L2CAP PDU

↓

封装进 HCI ACL Data

↓

封装成 LL Data PDU(由硬件发送)

↓

无线电发送

逐层封装结构(最关键!)

复制代码

LL PDU

└─来自 HCI ACL Data

└─来自 L2CAP PDU

└─来自 ATT PDU

└─来自 应用程序的 GATT 请求

📌 蓝牙协议拆解关系(从下到上)

设备接收到 BLE 数据:

复制代码

Radio PHY → LL PDU

→ HCI ACL Data (Kernel)

→ L2CAP

→ ATT

→ GATT 事件

→ DBus 回调到 App

📌 终极简化总结(最短版本)💡

蓝牙层顺序(从硬件到应用)

复制代码

PHY(物理层)

LL(链路层)

HCI(主机控制接口) ← 内核

L2CAP(逻辑链路) ← 内核

ATT/GATT(属性层) ← bluetoothd

Application(App) ← 用户空间

数据封装顺序:

复制代码

App → GATT → ATT → L2CAP → HCI → LL → AIR

数据接收顺序:

复制代码

AIR → LL → HCI → L2CAP → ATT → GATT → App

如果你愿意,我可以继续画:

📌 蓝牙完整数据报文结构图(LL/HCI/L2CAP/ATT 全层解剖)

📌 btmon 日志逐层对应关系(你看到的每条日志来自哪一层)

📌 BlueZ 源码位置(kernel, bluetoothd, GATT 实现函数)

要哪个?

沙特阿拉伯世界盃2026賽程
2026年多宝鱼选购指南:如何挑选性价比最高的海捕速冻鱼?