news 2026/2/4 9:06:09

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
蓝牙数据包从底层到应用层协议一层套一层

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


sudobtmon 命令结果:>ACL Data RX: Handle3flags 0x02 dlen9#4 [hci0] 37.417566ATT: Write Request(0x12)len4Handle: 0x0029 Data[2]: 0000 bluetoothd[2062]:<ACL Data TX: Handl..flags 0x00 dlen5#5 [hci0] 37.417793ATT: Write Response(0x13)len0>HCI Event: Number of Completed Packets(0x13)plen5#6 [hci0] 37.476344Num handles:1Handle:3Count:1>ACL Data RX: Handle3flags 0x02 dlen9#7 [hci0] 59.713568ATT: Write Request(0x12)len4Handle: 0x0029 Data[2]: 0100 bluetoothd[2062]:<ACL Data TX: Handl..flags 0x00 dlen5#8 [hci0] 59.713810ATT: Write Response(0x13)len0>HCI Event: Number of Completed Packets(0x13)plen5#9 [hci0] 59.772533Num handles:1Handle:3Count:1>ACL Data RX: Handle3flags 0x02 dlen9#10 [hci0] 74.297554ATT: Write Request(0x12)len4Handle: 0x0029 Data[2]: 0100 bluetoothd[2062]:<ACL Data TX: Hand..flags 0x00 dlen5#11 [hci0] 74.297732ATT: Write Response(0x13)len0>HCI Event: Number of Completed Packets(0x13)plen5#12 [hci0] 74.356721Num handles:1Handle:3Count:1>ACL Data RX: Handle3flags 0x02 dlen9#13 [hci0] 99.144558ATT: Write Request(0x12)len4Handle: 0x0029 Data[2]: 0100 bluetoothd[2062]:<ACL Data TX: Hand..flags 0x00 dlen5#14 [hci0] 99.144798ATT: Write Response(0x13)len0>HCI Event: Number of Completed Packets(0x13)plen5#15 [hci0] 99.202976Num handles:1Handle:3Count:1>ACL Data RX: Handle3flags 0x02 dlen9#16 [hci0] 99.894540ATT: Write Request(0x12)len4Handle: 0x002c Data[2]: 0100 bluetoothd[2062]:<ACL Data TX: Hand..flags 0x00 dlen5#17 [hci0] 99.894754ATT: Write Response(0x13)len0>HCI Event: Number of Completed Packets(0x13)plen5#18 [hci0] 99.953187Num handles:1Handle:3Count:1>ACL Data RX: Handle3flags 0x02 dlen7#19 [hci0] 102.145559ATT: Read Request(0x0a)len2Handle: 0x0028 bluetoothd[2062]:<ACL Data TX: Ha..flags 0x00 dlen15#20 [hci0] 102.147473ATT: Read Response(0x0b)len10Value[10]: 696e69742076616c7565>HCI Event: Number of Completed Packets(0x13)plen5#21 [hci0] 102.203859Num handles:1Handle:3Count:1>HCI Event: LE Meta Event(0x3e)plen6#22 [hci0] 121.049424LE PHY Update Complete(0x0c)Status: Success(0x00)Handle:3TX PHY: LE 1M(0x01)RX PHY: LE 2M(0x02)>HCI Event: LE Meta Event(0x3e)plen6#23 [hci0] 122.699915LE PHY Update Complete(0x0c)Status: Success(0x00)Handle:3TX 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 实现函数)

要哪个?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/29 14:33:37

当AI学会“拍电影“:SkyReels V1如何让你的RTX 4090变身好莱坞工作站

"给我一张照片,我能让它动起来;给我一句话,我能把它拍成电影。"这不是科幻小说的情节,而是SkyReels V1正在做的事情。更酷的是,你不需要A100集群,一张RTX 4090就能让这个魔法在你的桌面上发生。 一、开场白&#xff1a;视频生成的"三座大山"与破局之道 1.…

作者头像 李华
网站建设 2026/2/4 4:37:53

从零入门CANN:揭秘华为昇腾AI计算的核心引擎

# 从零入门CANN&#xff1a;揭秘华为昇腾AI计算的核心引擎> &#x1f4cc; **关键词**&#xff1a;CANN、昇腾AI、Ascend、国产芯片、MindSpore、异构计算 > &#x1f4a1; **适合人群**&#xff1a;AI初学者、高校学生、转行开发者、信创从业者 > ⏱️ **阅读时间…

作者头像 李华
网站建设 2026/2/4 3:58:29

Vue 开发者必看:3 步搞定 dart-sass 替换 node-sass(告别编译慢 +

Vue 开发者必看&#xff1a;3 步搞定 dart-sass 替换 node-sass&#xff08;告别编译慢 Vue 开发者必看&#xff1a;3 步搞定 dart-sass 替换 node-sass&#xff08;告别编译慢 兼容坑&#xff09;引言&#xff1a;为什么我们要和 node-sass 说拜拜技术背景速览&#xff1a;s…

作者头像 李华
网站建设 2026/2/3 19:59:14

.NET进阶——深入理解委托(3)事件入门

为什么我要把事件放在委托这个专题里呢&#xff1f;主要的原因是事件是委托的高级封装。 换句话说&#xff0c;先有委托才有事件&#xff0c;委托是事件的基础&#xff0c;事件是委托的封装。 我们先看一个不用委托的例子&#xff0c;这个代码要求实现这样的功能&#xff1a;小…

作者头像 李华
网站建设 2026/2/2 6:15:14

springboot基于vue的仓库进销存管理系统的可视化分析系统 97lgaf55

目录已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华
网站建设 2026/2/4 7:23:04

springboot基于vue的共享自习室座位选座系统_8m2lz8s1

目录已开发项目效果实现截图开发技术系统开发工具&#xff1a;核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&…

作者头像 李华