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

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


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 实现函数)

要哪个?

相关推荐
Logic1015 小时前
一份系统化《Python爬虫教程》学习笔记:Python爬虫63个核心案例精讲(含反爬策略与源码剖析)
经验分享·爬虫·python·学习笔记·编程·软件开发
SunnyDays10116 小时前
如何使用 C# 冻结 Excel 行和列
经验分享
qq77788897 小时前
PDF转图片免费工具有哪些?永久无广告PDF批量导出高清JPG PNG格式软件推荐
经验分享
草莓熊Lotso8 小时前
Python 基础语法完全指南:变量、类型、运算符与输入输出(零基础入门)
运维·开发语言·人工智能·经验分享·笔记·python·其他
金海境科技8 小时前
【服务器数据恢复】勒索病毒加密导致金融机构EMC存储核心数据丢失数据恢复案例 - 金海境科技
经验分享
小白跃升坊8 小时前
软件服务类企业基于开源 AI CRM 的实践案例
经验分享·开源·crm·经典案例·客户关系管理系统·ai crm
聆风吟º8 小时前
【顺序表习题|图解|双指针】移除元素 + 删除有序数组中的重复项
c语言·数据结构·c++·经验分享·算法
Surpass余sheng军20 小时前
AI 时代下的网关技术选型
人工智能·经验分享·分布式·后端·学习·架构
louiseailife1 天前
企业智能体架构解析:五大类型与落地技术路线
经验分享