蓝牙 Core Specification 与 Profile 的边界:从 Core_v6.2 出发的系统学习计划
前言
很多刚开始系统阅读 Bluetooth Core Specification 的同学,尤其是做蓝牙协议栈开发的工程师,都会遇到一个疑问:
为什么 Core 文档里有很多 BLE、ATT、GATT、SMP、LE Link Layer 的内容,却没有详细讲 HFP、A2DP、PBAP 这些经典蓝牙常见协议?
这个问题非常关键。因为如果这个边界没搞清楚,后面读文档很容易出现一种错觉:
-
Core 里面 BLE 好像讲得很细;
-
BR/EDR 只讲了 Radio、Baseband、LMP、SDP、L2CAP;
-
但是实际产品里经典蓝牙最常见的 HFP、A2DP、AVRCP、PBAP 又不在 Core 里;
-
于是怀疑自己是不是读错文档了。
答案是:没有读错,只是 Core Specification 和 Profile Specification 分工不同。
简单说:
Core Specification 负责蓝牙系统的“地基、管道、道路和交通规则”;
HFP、A2DP、PBAP 这些 Profile 负责“具体业务怎么跑”。
Core 不是所有蓝牙协议的大杂烩,而是蓝牙系统的核心基础规范。HFP、A2DP、PBAP、AVRCP、MAP、HID 等属于独立的 Profile 规范,需要在掌握 Core 的基础上另行学习。
本文围绕这个问题,给出一份适合蓝牙协议栈软件开发工程师的完整学习计划。
一、先搞清楚:Core Specification 到底讲什么?
Bluetooth Core Specification 主要描述蓝牙系统的核心协议栈能力,包括:
-
无线物理层;
-
链路层;
-
连接建立;
-
设备发现;
-
链路管理;
-
Host 与 Controller 的接口;
-
L2CAP;
-
SDP;
-
ATT;
-
GATT;
-
SMP;
-
安全机制;
-
HCI;
-
BR/EDR Controller;
-
LE Controller;
-
共存机制;
-
测试模式;
-
错误码;
-
版本演进;
-
Core Configuration。
也就是说,Core 更关注这些问题:
| BLE 如何广播、扫描、连接 | 是 |
| LE Link Layer PDU 如何定义 | 是 |
| BR/EDR 如何 Inquiry / Page / 建 ACL | 是 |
| BR/EDR Baseband 包格式是什么 | 是 |
| LMP 如何做 Feature Exchange / Authentication / Encryption | 是 |
| HCI Command / Event / ACL Data 如何定义 | 是 |
| L2CAP 如何分片、复用、建 Channel | 是 |
| SDP 如何描述服务 | 是 |
| ATT/GATT 如何描述属性、服务和特征值 | 是 |
| SMP 如何配对、分发密钥 | 是 |
| HFP 的 AT Command 如何交互 | 否 |
| A2DP 的 Codec Capability 如何协商 | 否 |
| AVRCP 如何控制播放暂停和音量 | 否 |
| PBAP 如何通过 OBEX 获取电话本 | 否 |
所以 Core 是蓝牙协议栈的底座,不是所有应用 Profile 的合集。
二、为什么 Core 里没有详细讲 HFP、A2DP、PBAP?
因为 HFP、A2DP、PBAP 属于 Profile Specification,不是 Core Specification 的主体。
它们解决的是具体业务场景:
| HFP | Hands-Free Profile | 蓝牙通话、免提、耳机电话控制 | BR/EDR、RFCOMM、SCO/eSCO、SDP |
| A2DP | Advanced Audio Distribution Profile | 经典蓝牙音乐播放 | BR/EDR、L2CAP、AVDTP、SDP |
| AVRCP | Audio/Video Remote Control Profile | 播放控制、音量、歌曲信息 | BR/EDR、AVCTP、SDP |
| PBAP | Phone Book Access Profile | 电话本同步 | BR/EDR、OBEX、SDP |
| MAP | Message Access Profile | 短信/消息访问 | BR/EDR、OBEX、SDP |
| HID | Human Interface Device Profile | 鼠标、键盘、手柄 | BR/EDR 或 LE、L2CAP/GATT |
| SPP | Serial Port Profile | 串口透传 | BR/EDR、RFCOMM、SDP |
Core 只提供这些 Profile 运行所需的底层能力。
比如 HFP 要用 RFCOMM 传 AT Command,要用 SCO/eSCO 传语音,要通过 SDP 发现服务。Core 会讲 SDP、L2CAP、HCI、SCO/eSCO、Baseband、LMP,但不会详细讲:
-
AT+BRSF
-
AT+CIND
-
AT+CMER
-
AT+CLIP
-
AT+VGS
-
AT+VGM
-
HFP Audio Connection 状态机
-
Wide Band Speech 的业务协商流程
这些属于 HFP Profile 规范。
再比如 A2DP,Core 会讲 L2CAP 和 BR/EDR ACL 传输,但不会详细讲:
-
SEP Discovery;
-
Codec Capability;
-
SBC 参数协商;
-
AVDTP Signaling;
-
Stream Start / Suspend / Reconfigure;
-
Media Packet 格式。
这些属于 A2DP 和 AVDTP 相关规范。
PBAP 也是类似。Core 会讲 SDP、L2CAP、BR/EDR 链路,但不会详细讲:
-
OBEX Connect;
-
PullPhoneBook;
-
PullvCardListing;
-
vCard 格式;
-
Phonebook path;
-
Repository;
-
PBAP Client / Server 行为。
这些属于 PBAP、OBEX、vCard 相关规范。
三、为什么感觉 BLE 在 Core 里面更详细?
这个感觉是有原因的。
BLE 的主流应用模型是 GATT-based Profile,而 ATT/GATT/SMP/GAP 都属于 Core 规范的一部分。因此你在 Core 里面能看到相对完整的 BLE 应用基础层:
#mermaid-svg-7ZPPLx0YjFKdXSnX{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-7ZPPLx0YjFKdXSnX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-7ZPPLx0YjFKdXSnX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-7ZPPLx0YjFKdXSnX .error-icon{fill:#552222;}#mermaid-svg-7ZPPLx0YjFKdXSnX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7ZPPLx0YjFKdXSnX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-7ZPPLx0YjFKdXSnX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7ZPPLx0YjFKdXSnX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7ZPPLx0YjFKdXSnX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-7ZPPLx0YjFKdXSnX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7ZPPLx0YjFKdXSnX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7ZPPLx0YjFKdXSnX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7ZPPLx0YjFKdXSnX .marker.cross{stroke:#333333;}#mermaid-svg-7ZPPLx0YjFKdXSnX svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7ZPPLx0YjFKdXSnX p{margin:0;}#mermaid-svg-7ZPPLx0YjFKdXSnX .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-7ZPPLx0YjFKdXSnX .cluster-label text{fill:#333;}#mermaid-svg-7ZPPLx0YjFKdXSnX .cluster-label span{color:#333;}#mermaid-svg-7ZPPLx0YjFKdXSnX .cluster-label span p{background-color:transparent;}#mermaid-svg-7ZPPLx0YjFKdXSnX .label text,#mermaid-svg-7ZPPLx0YjFKdXSnX span{fill:#333;color:#333;}#mermaid-svg-7ZPPLx0YjFKdXSnX .node rect,#mermaid-svg-7ZPPLx0YjFKdXSnX .node circle,#mermaid-svg-7ZPPLx0YjFKdXSnX .node ellipse,#mermaid-svg-7ZPPLx0YjFKdXSnX .node polygon,#mermaid-svg-7ZPPLx0YjFKdXSnX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7ZPPLx0YjFKdXSnX .rough-node .label text,#mermaid-svg-7ZPPLx0YjFKdXSnX .node .label text,#mermaid-svg-7ZPPLx0YjFKdXSnX .image-shape .label,#mermaid-svg-7ZPPLx0YjFKdXSnX .icon-shape .label{text-anchor:middle;}#mermaid-svg-7ZPPLx0YjFKdXSnX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-7ZPPLx0YjFKdXSnX .rough-node .label,#mermaid-svg-7ZPPLx0YjFKdXSnX .node .label,#mermaid-svg-7ZPPLx0YjFKdXSnX .image-shape .label,#mermaid-svg-7ZPPLx0YjFKdXSnX .icon-shape .label{text-align:center;}#mermaid-svg-7ZPPLx0YjFKdXSnX .node.clickable{cursor:pointer;}#mermaid-svg-7ZPPLx0YjFKdXSnX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-7ZPPLx0YjFKdXSnX .arrowheadPath{fill:#333333;}#mermaid-svg-7ZPPLx0YjFKdXSnX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7ZPPLx0YjFKdXSnX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7ZPPLx0YjFKdXSnX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7ZPPLx0YjFKdXSnX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-7ZPPLx0YjFKdXSnX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7ZPPLx0YjFKdXSnX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-7ZPPLx0YjFKdXSnX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7ZPPLx0YjFKdXSnX .cluster text{fill:#333;}#mermaid-svg-7ZPPLx0YjFKdXSnX .cluster span{color:#333;}#mermaid-svg-7ZPPLx0YjFKdXSnX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7ZPPLx0YjFKdXSnX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-7ZPPLx0YjFKdXSnX rect.text{fill:none;stroke-width:0;}#mermaid-svg-7ZPPLx0YjFKdXSnX .icon-shape,#mermaid-svg-7ZPPLx0YjFKdXSnX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-7ZPPLx0YjFKdXSnX .icon-shape p,#mermaid-svg-7ZPPLx0YjFKdXSnX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-7ZPPLx0YjFKdXSnX .icon-shape .label rect,#mermaid-svg-7ZPPLx0YjFKdXSnX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-7ZPPLx0YjFKdXSnX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-7ZPPLx0YjFKdXSnX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-7ZPPLx0YjFKdXSnX :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
应用 / Profile
GATT
ATT
L2CAP
HCI
LE Link Layer
LE PHY
BLE 常见的数据访问流程,例如:
-
发现服务;
-
发现特征值;
-
Read Characteristic;
-
Write Characteristic;
-
Notification;
-
Indication;
-
Pairing;
-
Bonding;
-
Privacy;
-
RPA 地址解析;
很多都可以在 Core 中找到基础定义。
而 BR/EDR 的应用协议体系历史更早、更分散:
#mermaid-svg-gY2AxVlsAjQNXZi5{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gY2AxVlsAjQNXZi5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gY2AxVlsAjQNXZi5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gY2AxVlsAjQNXZi5 .error-icon{fill:#552222;}#mermaid-svg-gY2AxVlsAjQNXZi5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gY2AxVlsAjQNXZi5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gY2AxVlsAjQNXZi5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gY2AxVlsAjQNXZi5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gY2AxVlsAjQNXZi5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gY2AxVlsAjQNXZi5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gY2AxVlsAjQNXZi5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gY2AxVlsAjQNXZi5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gY2AxVlsAjQNXZi5 .marker.cross{stroke:#333333;}#mermaid-svg-gY2AxVlsAjQNXZi5 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gY2AxVlsAjQNXZi5 p{margin:0;}#mermaid-svg-gY2AxVlsAjQNXZi5 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-gY2AxVlsAjQNXZi5 .cluster-label text{fill:#333;}#mermaid-svg-gY2AxVlsAjQNXZi5 .cluster-label span{color:#333;}#mermaid-svg-gY2AxVlsAjQNXZi5 .cluster-label span p{background-color:transparent;}#mermaid-svg-gY2AxVlsAjQNXZi5 .label text,#mermaid-svg-gY2AxVlsAjQNXZi5 span{fill:#333;color:#333;}#mermaid-svg-gY2AxVlsAjQNXZi5 .node rect,#mermaid-svg-gY2AxVlsAjQNXZi5 .node circle,#mermaid-svg-gY2AxVlsAjQNXZi5 .node ellipse,#mermaid-svg-gY2AxVlsAjQNXZi5 .node polygon,#mermaid-svg-gY2AxVlsAjQNXZi5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gY2AxVlsAjQNXZi5 .rough-node .label text,#mermaid-svg-gY2AxVlsAjQNXZi5 .node .label text,#mermaid-svg-gY2AxVlsAjQNXZi5 .image-shape .label,#mermaid-svg-gY2AxVlsAjQNXZi5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-gY2AxVlsAjQNXZi5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-gY2AxVlsAjQNXZi5 .rough-node .label,#mermaid-svg-gY2AxVlsAjQNXZi5 .node .label,#mermaid-svg-gY2AxVlsAjQNXZi5 .image-shape .label,#mermaid-svg-gY2AxVlsAjQNXZi5 .icon-shape .label{text-align:center;}#mermaid-svg-gY2AxVlsAjQNXZi5 .node.clickable{cursor:pointer;}#mermaid-svg-gY2AxVlsAjQNXZi5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-gY2AxVlsAjQNXZi5 .arrowheadPath{fill:#333333;}#mermaid-svg-gY2AxVlsAjQNXZi5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gY2AxVlsAjQNXZi5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gY2AxVlsAjQNXZi5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gY2AxVlsAjQNXZi5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-gY2AxVlsAjQNXZi5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gY2AxVlsAjQNXZi5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-gY2AxVlsAjQNXZi5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gY2AxVlsAjQNXZi5 .cluster text{fill:#333;}#mermaid-svg-gY2AxVlsAjQNXZi5 .cluster span{color:#333;}#mermaid-svg-gY2AxVlsAjQNXZi5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gY2AxVlsAjQNXZi5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-gY2AxVlsAjQNXZi5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-gY2AxVlsAjQNXZi5 .icon-shape,#mermaid-svg-gY2AxVlsAjQNXZi5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gY2AxVlsAjQNXZi5 .icon-shape p,#mermaid-svg-gY2AxVlsAjQNXZi5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-gY2AxVlsAjQNXZi5 .icon-shape .label rect,#mermaid-svg-gY2AxVlsAjQNXZi5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gY2AxVlsAjQNXZi5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-gY2AxVlsAjQNXZi5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-gY2AxVlsAjQNXZi5 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Core Specification
L2CAP
SDP
HCI
BR/EDR Baseband / LMP / Radio
SCO / eSCO
HFP Profile
A2DP Profile
AVRCP Profile
PBAP Profile
RFCOMM
AVDTP
AVCTP
OBEX
所以不是 Core 偏心 BLE,而是两套生态结构不一样:
| BLE | 看起来更完整 | ATT/GATT/SMP 是 Core 的一部分,BLE 服务发现强依赖 GATT |
| BR/EDR | 底层很完整,上层 Profile 分散 | HFP/A2DP/PBAP/AVRCP 是独立 Profile 规范 |
一句话总结:
BLE 的“通用应用模型”就在 Core 里;
BR/EDR 的“具体业务协议”大多在独立 Profile 里。
四、Core 与 Profile 的关系
可以用一张图理解:
#mermaid-svg-Tn3GBfumr6maHoVY{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Tn3GBfumr6maHoVY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Tn3GBfumr6maHoVY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Tn3GBfumr6maHoVY .error-icon{fill:#552222;}#mermaid-svg-Tn3GBfumr6maHoVY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Tn3GBfumr6maHoVY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Tn3GBfumr6maHoVY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Tn3GBfumr6maHoVY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Tn3GBfumr6maHoVY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Tn3GBfumr6maHoVY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Tn3GBfumr6maHoVY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Tn3GBfumr6maHoVY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Tn3GBfumr6maHoVY .marker.cross{stroke:#333333;}#mermaid-svg-Tn3GBfumr6maHoVY svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Tn3GBfumr6maHoVY p{margin:0;}#mermaid-svg-Tn3GBfumr6maHoVY .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Tn3GBfumr6maHoVY .cluster-label text{fill:#333;}#mermaid-svg-Tn3GBfumr6maHoVY .cluster-label span{color:#333;}#mermaid-svg-Tn3GBfumr6maHoVY .cluster-label span p{background-color:transparent;}#mermaid-svg-Tn3GBfumr6maHoVY .label text,#mermaid-svg-Tn3GBfumr6maHoVY span{fill:#333;color:#333;}#mermaid-svg-Tn3GBfumr6maHoVY .node rect,#mermaid-svg-Tn3GBfumr6maHoVY .node circle,#mermaid-svg-Tn3GBfumr6maHoVY .node ellipse,#mermaid-svg-Tn3GBfumr6maHoVY .node polygon,#mermaid-svg-Tn3GBfumr6maHoVY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Tn3GBfumr6maHoVY .rough-node .label text,#mermaid-svg-Tn3GBfumr6maHoVY .node .label text,#mermaid-svg-Tn3GBfumr6maHoVY .image-shape .label,#mermaid-svg-Tn3GBfumr6maHoVY .icon-shape .label{text-anchor:middle;}#mermaid-svg-Tn3GBfumr6maHoVY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Tn3GBfumr6maHoVY .rough-node .label,#mermaid-svg-Tn3GBfumr6maHoVY .node .label,#mermaid-svg-Tn3GBfumr6maHoVY .image-shape .label,#mermaid-svg-Tn3GBfumr6maHoVY .icon-shape .label{text-align:center;}#mermaid-svg-Tn3GBfumr6maHoVY .node.clickable{cursor:pointer;}#mermaid-svg-Tn3GBfumr6maHoVY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Tn3GBfumr6maHoVY .arrowheadPath{fill:#333333;}#mermaid-svg-Tn3GBfumr6maHoVY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Tn3GBfumr6maHoVY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Tn3GBfumr6maHoVY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Tn3GBfumr6maHoVY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Tn3GBfumr6maHoVY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Tn3GBfumr6maHoVY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Tn3GBfumr6maHoVY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Tn3GBfumr6maHoVY .cluster text{fill:#333;}#mermaid-svg-Tn3GBfumr6maHoVY .cluster span{color:#333;}#mermaid-svg-Tn3GBfumr6maHoVY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Tn3GBfumr6maHoVY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Tn3GBfumr6maHoVY rect.text{fill:none;stroke-width:0;}#mermaid-svg-Tn3GBfumr6maHoVY .icon-shape,#mermaid-svg-Tn3GBfumr6maHoVY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Tn3GBfumr6maHoVY .icon-shape p,#mermaid-svg-Tn3GBfumr6maHoVY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Tn3GBfumr6maHoVY .icon-shape .label rect,#mermaid-svg-Tn3GBfumr6maHoVY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Tn3GBfumr6maHoVY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Tn3GBfumr6maHoVY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Tn3GBfumr6maHoVY :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Bluetooth Core Specification地基、管道、链路、接口、安全基础
BR/EDR ControllerRadio / Baseband / LMP / Security
LE ControllerPHY / Link Layer / LE Security
HostL2CAP / SDP / GAP / ATT / GATT / SMP
HCIHost Controller Interface
HFP通话
A2DP音乐
AVRCP播放控制
PBAP电话本
Battery ServiceBLE 电池服务
Heart Rate ServiceBLE 心率服务
Core 是底座,Profile 是业务。
如果把蓝牙协议栈比喻成城市:
| 地基、道路、红绿灯、交通规则 | Core Specification |
| 出租车调度规则 | HFP |
| 音乐运输车规则 | A2DP |
| 遥控器操作规则 | AVRCP |
| 电话本快递规则 | PBAP |
| 门牌编号系统 | Assigned Numbers |
| 具体小区服务设计 | GATT Service Specification |
五、面向协议栈工程师的总体学习路线
对于蓝牙协议栈软件开发工程师,不能只学 BLE,也不能只学 BR/EDR Profile。比较合理的路线是:
#mermaid-svg-wuiLkNQKYPdYN5lh{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wuiLkNQKYPdYN5lh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wuiLkNQKYPdYN5lh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wuiLkNQKYPdYN5lh .error-icon{fill:#552222;}#mermaid-svg-wuiLkNQKYPdYN5lh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wuiLkNQKYPdYN5lh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wuiLkNQKYPdYN5lh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wuiLkNQKYPdYN5lh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wuiLkNQKYPdYN5lh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wuiLkNQKYPdYN5lh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wuiLkNQKYPdYN5lh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wuiLkNQKYPdYN5lh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wuiLkNQKYPdYN5lh .marker.cross{stroke:#333333;}#mermaid-svg-wuiLkNQKYPdYN5lh svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wuiLkNQKYPdYN5lh p{margin:0;}#mermaid-svg-wuiLkNQKYPdYN5lh .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-wuiLkNQKYPdYN5lh .cluster-label text{fill:#333;}#mermaid-svg-wuiLkNQKYPdYN5lh .cluster-label span{color:#333;}#mermaid-svg-wuiLkNQKYPdYN5lh .cluster-label span p{background-color:transparent;}#mermaid-svg-wuiLkNQKYPdYN5lh .label text,#mermaid-svg-wuiLkNQKYPdYN5lh span{fill:#333;color:#333;}#mermaid-svg-wuiLkNQKYPdYN5lh .node rect,#mermaid-svg-wuiLkNQKYPdYN5lh .node circle,#mermaid-svg-wuiLkNQKYPdYN5lh .node ellipse,#mermaid-svg-wuiLkNQKYPdYN5lh .node polygon,#mermaid-svg-wuiLkNQKYPdYN5lh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wuiLkNQKYPdYN5lh .rough-node .label text,#mermaid-svg-wuiLkNQKYPdYN5lh .node .label text,#mermaid-svg-wuiLkNQKYPdYN5lh .image-shape .label,#mermaid-svg-wuiLkNQKYPdYN5lh .icon-shape .label{text-anchor:middle;}#mermaid-svg-wuiLkNQKYPdYN5lh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wuiLkNQKYPdYN5lh .rough-node .label,#mermaid-svg-wuiLkNQKYPdYN5lh .node .label,#mermaid-svg-wuiLkNQKYPdYN5lh .image-shape .label,#mermaid-svg-wuiLkNQKYPdYN5lh .icon-shape .label{text-align:center;}#mermaid-svg-wuiLkNQKYPdYN5lh .node.clickable{cursor:pointer;}#mermaid-svg-wuiLkNQKYPdYN5lh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wuiLkNQKYPdYN5lh .arrowheadPath{fill:#333333;}#mermaid-svg-wuiLkNQKYPdYN5lh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wuiLkNQKYPdYN5lh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wuiLkNQKYPdYN5lh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wuiLkNQKYPdYN5lh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wuiLkNQKYPdYN5lh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wuiLkNQKYPdYN5lh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wuiLkNQKYPdYN5lh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wuiLkNQKYPdYN5lh .cluster text{fill:#333;}#mermaid-svg-wuiLkNQKYPdYN5lh .cluster span{color:#333;}#mermaid-svg-wuiLkNQKYPdYN5lh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wuiLkNQKYPdYN5lh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wuiLkNQKYPdYN5lh rect.text{fill:none;stroke-width:0;}#mermaid-svg-wuiLkNQKYPdYN5lh .icon-shape,#mermaid-svg-wuiLkNQKYPdYN5lh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wuiLkNQKYPdYN5lh .icon-shape p,#mermaid-svg-wuiLkNQKYPdYN5lh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wuiLkNQKYPdYN5lh .icon-shape .label rect,#mermaid-svg-wuiLkNQKYPdYN5lh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wuiLkNQKYPdYN5lh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wuiLkNQKYPdYN5lh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wuiLkNQKYPdYN5lh :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
阶段 0理解 Core 与 Profile 边界
阶段 1Core 总体架构
阶段 2Host 公共协议
阶段 3HCI
阶段 4BLE Controller
阶段 5BR/EDR Controller
阶段 6BR/EDR Profile 依赖协议
阶段 7HFP / A2DP / AVRCP / PBAP
阶段 8抓包、调试、互操作、性能优化
完整学习目标不是“看完 Core_v6.2”,而是建立下面这套能力:
| 看懂 Core | 明白蓝牙底层、Host、Controller、HCI 的分工 |
| 看懂 BLE | 能分析广播、扫描、连接、GATT、SMP、安全、隐私 |
| 看懂 BR/EDR | 能分析 Inquiry、Page、ACL、SCO/eSCO、LMP、安全 |
| 看懂 HCI log | 能从 HCI Command/Event/ACL/SCO/ISO 定位问题 |
| 看懂 Profile | 能分析 HFP/A2DP/AVRCP/PBAP 的业务流程 |
| 能调试互操作 | 能判断问题发生在 Core、Profile、平台还是对端设备 |
| 能做性能优化 | 能分析吞吐、延迟、功耗、音频卡顿、断连等问题 |
六、完整学习计划
下面给出一个 24 周学习计划,适合有一定嵌入式、协议栈或蓝牙开发基础的工程师。
如果每天投入 1.5 到 2 小时,基本可以在 6 个月内建立比较完整的蓝牙协议栈知识体系。
第一阶段:理解 Core 与 Profile 的边界
第 1 周:蓝牙规范体系总览
学习目标
搞清楚下面几个问题:
Core Specification 是什么?
Profile Specification 是什么?
Assigned Numbers 是什么?
HFP/A2DP/PBAP 为什么不在 Core 里?
BLE 为什么看起来在 Core 里更完整?
BR/EDR 和 BLE 的协议栈分层有什么不同?
阅读内容
| Core Vol 0 | 总目录、版本历史、Core Configuration |
| Core Vol 1 Part A | Architecture、Bluetooth application architecture |
| Bluetooth Profile 规范目录 | HFP、A2DP、AVRCP、PBAP、MAP、HID 等 |
| Assigned Numbers | UUID、PSM、Company ID、AD Type |
输出物
写一张规范关系图:
#mermaid-svg-NtzHjS0wU4WqBvNz{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NtzHjS0wU4WqBvNz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NtzHjS0wU4WqBvNz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NtzHjS0wU4WqBvNz .error-icon{fill:#552222;}#mermaid-svg-NtzHjS0wU4WqBvNz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NtzHjS0wU4WqBvNz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NtzHjS0wU4WqBvNz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NtzHjS0wU4WqBvNz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NtzHjS0wU4WqBvNz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NtzHjS0wU4WqBvNz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NtzHjS0wU4WqBvNz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NtzHjS0wU4WqBvNz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NtzHjS0wU4WqBvNz .marker.cross{stroke:#333333;}#mermaid-svg-NtzHjS0wU4WqBvNz svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NtzHjS0wU4WqBvNz p{margin:0;}#mermaid-svg-NtzHjS0wU4WqBvNz .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-NtzHjS0wU4WqBvNz .cluster-label text{fill:#333;}#mermaid-svg-NtzHjS0wU4WqBvNz .cluster-label span{color:#333;}#mermaid-svg-NtzHjS0wU4WqBvNz .cluster-label span p{background-color:transparent;}#mermaid-svg-NtzHjS0wU4WqBvNz .label text,#mermaid-svg-NtzHjS0wU4WqBvNz span{fill:#333;color:#333;}#mermaid-svg-NtzHjS0wU4WqBvNz .node rect,#mermaid-svg-NtzHjS0wU4WqBvNz .node circle,#mermaid-svg-NtzHjS0wU4WqBvNz .node ellipse,#mermaid-svg-NtzHjS0wU4WqBvNz .node polygon,#mermaid-svg-NtzHjS0wU4WqBvNz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NtzHjS0wU4WqBvNz .rough-node .label text,#mermaid-svg-NtzHjS0wU4WqBvNz .node .label text,#mermaid-svg-NtzHjS0wU4WqBvNz .image-shape .label,#mermaid-svg-NtzHjS0wU4WqBvNz .icon-shape .label{text-anchor:middle;}#mermaid-svg-NtzHjS0wU4WqBvNz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NtzHjS0wU4WqBvNz .rough-node .label,#mermaid-svg-NtzHjS0wU4WqBvNz .node .label,#mermaid-svg-NtzHjS0wU4WqBvNz .image-shape .label,#mermaid-svg-NtzHjS0wU4WqBvNz .icon-shape .label{text-align:center;}#mermaid-svg-NtzHjS0wU4WqBvNz .node.clickable{cursor:pointer;}#mermaid-svg-NtzHjS0wU4WqBvNz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NtzHjS0wU4WqBvNz .arrowheadPath{fill:#333333;}#mermaid-svg-NtzHjS0wU4WqBvNz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NtzHjS0wU4WqBvNz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NtzHjS0wU4WqBvNz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NtzHjS0wU4WqBvNz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NtzHjS0wU4WqBvNz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NtzHjS0wU4WqBvNz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NtzHjS0wU4WqBvNz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NtzHjS0wU4WqBvNz .cluster text{fill:#333;}#mermaid-svg-NtzHjS0wU4WqBvNz .cluster span{color:#333;}#mermaid-svg-NtzHjS0wU4WqBvNz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NtzHjS0wU4WqBvNz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NtzHjS0wU4WqBvNz rect.text{fill:none;stroke-width:0;}#mermaid-svg-NtzHjS0wU4WqBvNz .icon-shape,#mermaid-svg-NtzHjS0wU4WqBvNz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NtzHjS0wU4WqBvNz .icon-shape p,#mermaid-svg-NtzHjS0wU4WqBvNz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NtzHjS0wU4WqBvNz .icon-shape .label rect,#mermaid-svg-NtzHjS0wU4WqBvNz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NtzHjS0wU4WqBvNz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NtzHjS0wU4WqBvNz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NtzHjS0wU4WqBvNz :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Bluetooth SIG Specifications
Core Specification
Profile Specifications
Service Specifications
Assigned Numbers
HFP
A2DP
AVRCP
PBAP
Battery Service
Heart Rate Service
Device Information Service
验收标准
能够用一句话说明:
Core 负责蓝牙通用底层和 Host/Controller 基础协议;Profile 负责具体应用场景的互操作规则。
第二阶段:Core 总体架构
第 2 周:Vol 1 Architecture
学习目标
建立蓝牙协议栈全局地图。
阅读内容
| Vol 1 Part A General description | BR/EDR 与 LE 总览 |
| Core system architecture | Host / Controller 分层 |
| Transport architecture | Physical channel、Physical link、Logical link |
| Communication topology | Piconet、LE topology |
| Security overview | BR/EDR Security 与 LE Security |
| Bluetooth application architecture | GAP、Profile hierarchy、GATT architecture |
重点概念
| Host | L2CAP、SDP、GAP、ATT、GATT、SMP 等 |
| Controller | Radio、Baseband、LMP、LL、PHY 等 |
| HCI | Host 与 Controller 之间的标准接口 |
| BR/EDR | 经典蓝牙,偏音频和传统 Profile |
| LE | 低功耗蓝牙,偏 GATT、低功耗和新特性 |
| GAP | 所有蓝牙设备都依赖的通用访问框架 |
| Profile | 应用互操作规则 |
输出物
#mermaid-svg-RQXvvYja1Qh1lFcj{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RQXvvYja1Qh1lFcj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RQXvvYja1Qh1lFcj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RQXvvYja1Qh1lFcj .error-icon{fill:#552222;}#mermaid-svg-RQXvvYja1Qh1lFcj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RQXvvYja1Qh1lFcj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RQXvvYja1Qh1lFcj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RQXvvYja1Qh1lFcj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RQXvvYja1Qh1lFcj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RQXvvYja1Qh1lFcj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RQXvvYja1Qh1lFcj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RQXvvYja1Qh1lFcj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RQXvvYja1Qh1lFcj .marker.cross{stroke:#333333;}#mermaid-svg-RQXvvYja1Qh1lFcj svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RQXvvYja1Qh1lFcj p{margin:0;}#mermaid-svg-RQXvvYja1Qh1lFcj .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-RQXvvYja1Qh1lFcj .cluster-label text{fill:#333;}#mermaid-svg-RQXvvYja1Qh1lFcj .cluster-label span{color:#333;}#mermaid-svg-RQXvvYja1Qh1lFcj .cluster-label span p{background-color:transparent;}#mermaid-svg-RQXvvYja1Qh1lFcj .label text,#mermaid-svg-RQXvvYja1Qh1lFcj span{fill:#333;color:#333;}#mermaid-svg-RQXvvYja1Qh1lFcj .node rect,#mermaid-svg-RQXvvYja1Qh1lFcj .node circle,#mermaid-svg-RQXvvYja1Qh1lFcj .node ellipse,#mermaid-svg-RQXvvYja1Qh1lFcj .node polygon,#mermaid-svg-RQXvvYja1Qh1lFcj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RQXvvYja1Qh1lFcj .rough-node .label text,#mermaid-svg-RQXvvYja1Qh1lFcj .node .label text,#mermaid-svg-RQXvvYja1Qh1lFcj .image-shape .label,#mermaid-svg-RQXvvYja1Qh1lFcj .icon-shape .label{text-anchor:middle;}#mermaid-svg-RQXvvYja1Qh1lFcj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RQXvvYja1Qh1lFcj .rough-node .label,#mermaid-svg-RQXvvYja1Qh1lFcj .node .label,#mermaid-svg-RQXvvYja1Qh1lFcj .image-shape .label,#mermaid-svg-RQXvvYja1Qh1lFcj .icon-shape .label{text-align:center;}#mermaid-svg-RQXvvYja1Qh1lFcj .node.clickable{cursor:pointer;}#mermaid-svg-RQXvvYja1Qh1lFcj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RQXvvYja1Qh1lFcj .arrowheadPath{fill:#333333;}#mermaid-svg-RQXvvYja1Qh1lFcj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RQXvvYja1Qh1lFcj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RQXvvYja1Qh1lFcj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RQXvvYja1Qh1lFcj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RQXvvYja1Qh1lFcj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RQXvvYja1Qh1lFcj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RQXvvYja1Qh1lFcj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RQXvvYja1Qh1lFcj .cluster text{fill:#333;}#mermaid-svg-RQXvvYja1Qh1lFcj .cluster span{color:#333;}#mermaid-svg-RQXvvYja1Qh1lFcj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RQXvvYja1Qh1lFcj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RQXvvYja1Qh1lFcj rect.text{fill:none;stroke-width:0;}#mermaid-svg-RQXvvYja1Qh1lFcj .icon-shape,#mermaid-svg-RQXvvYja1Qh1lFcj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RQXvvYja1Qh1lFcj .icon-shape p,#mermaid-svg-RQXvvYja1Qh1lFcj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RQXvvYja1Qh1lFcj .icon-shape .label rect,#mermaid-svg-RQXvvYja1Qh1lFcj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RQXvvYja1Qh1lFcj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RQXvvYja1Qh1lFcj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RQXvvYja1Qh1lFcj :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Controller
Host
Application / Profile
GAP
SDP
GATT
ATT
SMP
L2CAP
HCI
BR/EDRRadio / Baseband / LMP
LEPHY / Link Layer
验收标准
能够解释:
-
ATT/GATT 为什么属于 Host;
-
LMP 为什么属于 BR/EDR Controller;
-
LL 为什么属于 LE Controller;
-
SMP 为什么是 LE Host 侧安全协议;
-
HCI 为什么是协议栈调试的关键观察点。
第三阶段:Host 公共协议
第 3 周:L2CAP
学习目标
掌握 BR/EDR 和 BLE 都绕不开的 Host 传输层。
阅读内容
| L2CAP Channel | CID、PSM、Fixed Channel、Dynamic Channel |
| Basic L2CAP Mode | 基础数据传输 |
| Enhanced Retransmission Mode | BR/EDR 场景常见 |
| Streaming Mode | 流式传输 |
| LE Credit Based Flow Control | BLE 动态通道 |
| Enhanced Credit Based Flow Control | EATT 等新能力 |
| Segmentation and Reassembly | 分片与重组 |
| Flow Control | 信用流控和缓冲区管理 |
重点问题
| L2CAP SDU 和 PDU 有什么区别? | SDU 是上层数据单元,PDU 是 L2CAP 实际传输单元 |
| CID 和 PSM 有什么区别? | CID 是通道实例,PSM 是协议/服务入口 |
| ATT 为什么走固定 CID? | BLE 中 ATT 有固定承载 |
| SDP 为什么依赖 L2CAP? | SDP 是 BR/EDR 服务发现协议,需要 L2CAP 承载 |
| A2DP 为什么依赖 L2CAP? | AVDTP 信令和媒体流都要用 L2CAP 通道 |
实践任务
用 Wireshark 或 btmon 分析一段 ACL 数据,拆出:
HCI ACL Data
└── L2CAP
└── ATT / SMP / SDP / AVDTP / AVCTP / RFCOMM
第 4 周:SDP 与 GAP
SDP 学习目标
SDP 是理解 BR/EDR Profile 的入口。很多经典蓝牙 Profile 都需要先通过 SDP 查询服务记录。
SDP 重点
| Service Record | 服务记录 |
| ServiceClassIDList | 服务类型 |
| ProtocolDescriptorList | 服务使用哪些底层协议 |
| ProfileDescriptorList | Profile 版本信息 |
| Attribute ID | SDP 属性编号 |
| PSM / RFCOMM Channel | 后续连接入口 |
GAP 学习目标
GAP 是所有蓝牙设备的通用访问框架。
GAP 重点
| 发现 | Inquiry | Advertising / Scanning |
| 连接 | Page / Page Scan | Initiating / Connectable Advertising |
| 名称 | Remote Name Request | Advertising Data / GAP Characteristic |
| 安全 | Pairing / Link Key | Pairing / Bonding / LTK / IRK |
| 角色 | Central / Peripheral | Central / Peripheral |
输出物
画出 BR/EDR 典型发现和连接流程:
远端设备本地设备远端设备本地设备#mermaid-svg-WzSsgqAos4gUrVR2{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WzSsgqAos4gUrVR2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WzSsgqAos4gUrVR2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WzSsgqAos4gUrVR2 .error-icon{fill:#552222;}#mermaid-svg-WzSsgqAos4gUrVR2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WzSsgqAos4gUrVR2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WzSsgqAos4gUrVR2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WzSsgqAos4gUrVR2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WzSsgqAos4gUrVR2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WzSsgqAos4gUrVR2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WzSsgqAos4gUrVR2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WzSsgqAos4gUrVR2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WzSsgqAos4gUrVR2 .marker.cross{stroke:#333333;}#mermaid-svg-WzSsgqAos4gUrVR2 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WzSsgqAos4gUrVR2 p{margin:0;}#mermaid-svg-WzSsgqAos4gUrVR2 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-WzSsgqAos4gUrVR2 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-WzSsgqAos4gUrVR2 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-WzSsgqAos4gUrVR2 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-WzSsgqAos4gUrVR2 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-WzSsgqAos4gUrVR2 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-WzSsgqAos4gUrVR2 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-WzSsgqAos4gUrVR2 .sequenceNumber{fill:white;}#mermaid-svg-WzSsgqAos4gUrVR2 #sequencenumber{fill:#333;}#mermaid-svg-WzSsgqAos4gUrVR2 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-WzSsgqAos4gUrVR2 .messageText{fill:#333;stroke:none;}#mermaid-svg-WzSsgqAos4gUrVR2 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-WzSsgqAos4gUrVR2 .labelText,#mermaid-svg-WzSsgqAos4gUrVR2 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-WzSsgqAos4gUrVR2 .loopText,#mermaid-svg-WzSsgqAos4gUrVR2 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-WzSsgqAos4gUrVR2 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-WzSsgqAos4gUrVR2 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-WzSsgqAos4gUrVR2 .noteText,#mermaid-svg-WzSsgqAos4gUrVR2 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-WzSsgqAos4gUrVR2 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WzSsgqAos4gUrVR2 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WzSsgqAos4gUrVR2 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-WzSsgqAos4gUrVR2 .actorPopupMenu{position:absolute;}#mermaid-svg-WzSsgqAos4gUrVR2 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-WzSsgqAos4gUrVR2 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-WzSsgqAos4gUrVR2 .actor-man circle,#mermaid-svg-WzSsgqAos4gUrVR2 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-WzSsgqAos4gUrVR2 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}InquiryInquiry ResponseRemote Name RequestRemote Name ResponsePage / ACL ConnectionConnection CompleteSDP Service SearchSDP Service Record
第 5 周:ATT / GATT
学习目标
掌握 BLE 应用数据模型,也理解 GATT over BR/EDR 的可能性。
阅读重点
| ATT Opcode | Request、Response、Command、Notification、Indication |
| Attribute | Handle、Type、Value、Permission |
| GATT Service | Primary Service、Secondary Service |
| Characteristic | Declaration、Value、Properties |
| Descriptor | CCCD、User Description 等 |
| GATT Procedure | Discover、Read、Write、Notify、Indicate |
| EATT | 多 ATT bearer、并发事务 |
重点图
#mermaid-svg-TRPNVMMwUeYH4cqw{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TRPNVMMwUeYH4cqw .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TRPNVMMwUeYH4cqw .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TRPNVMMwUeYH4cqw .error-icon{fill:#552222;}#mermaid-svg-TRPNVMMwUeYH4cqw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TRPNVMMwUeYH4cqw .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TRPNVMMwUeYH4cqw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TRPNVMMwUeYH4cqw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TRPNVMMwUeYH4cqw .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TRPNVMMwUeYH4cqw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TRPNVMMwUeYH4cqw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TRPNVMMwUeYH4cqw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TRPNVMMwUeYH4cqw .marker.cross{stroke:#333333;}#mermaid-svg-TRPNVMMwUeYH4cqw svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TRPNVMMwUeYH4cqw p{margin:0;}#mermaid-svg-TRPNVMMwUeYH4cqw .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-TRPNVMMwUeYH4cqw .cluster-label text{fill:#333;}#mermaid-svg-TRPNVMMwUeYH4cqw .cluster-label span{color:#333;}#mermaid-svg-TRPNVMMwUeYH4cqw .cluster-label span p{background-color:transparent;}#mermaid-svg-TRPNVMMwUeYH4cqw .label text,#mermaid-svg-TRPNVMMwUeYH4cqw span{fill:#333;color:#333;}#mermaid-svg-TRPNVMMwUeYH4cqw .node rect,#mermaid-svg-TRPNVMMwUeYH4cqw .node circle,#mermaid-svg-TRPNVMMwUeYH4cqw .node ellipse,#mermaid-svg-TRPNVMMwUeYH4cqw .node polygon,#mermaid-svg-TRPNVMMwUeYH4cqw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TRPNVMMwUeYH4cqw .rough-node .label text,#mermaid-svg-TRPNVMMwUeYH4cqw .node .label text,#mermaid-svg-TRPNVMMwUeYH4cqw .image-shape .label,#mermaid-svg-TRPNVMMwUeYH4cqw .icon-shape .label{text-anchor:middle;}#mermaid-svg-TRPNVMMwUeYH4cqw .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TRPNVMMwUeYH4cqw .rough-node .label,#mermaid-svg-TRPNVMMwUeYH4cqw .node .label,#mermaid-svg-TRPNVMMwUeYH4cqw .image-shape .label,#mermaid-svg-TRPNVMMwUeYH4cqw .icon-shape .label{text-align:center;}#mermaid-svg-TRPNVMMwUeYH4cqw .node.clickable{cursor:pointer;}#mermaid-svg-TRPNVMMwUeYH4cqw .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TRPNVMMwUeYH4cqw .arrowheadPath{fill:#333333;}#mermaid-svg-TRPNVMMwUeYH4cqw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TRPNVMMwUeYH4cqw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TRPNVMMwUeYH4cqw .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TRPNVMMwUeYH4cqw .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TRPNVMMwUeYH4cqw .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TRPNVMMwUeYH4cqw .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TRPNVMMwUeYH4cqw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TRPNVMMwUeYH4cqw .cluster text{fill:#333;}#mermaid-svg-TRPNVMMwUeYH4cqw .cluster span{color:#333;}#mermaid-svg-TRPNVMMwUeYH4cqw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TRPNVMMwUeYH4cqw .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TRPNVMMwUeYH4cqw rect.text{fill:none;stroke-width:0;}#mermaid-svg-TRPNVMMwUeYH4cqw .icon-shape,#mermaid-svg-TRPNVMMwUeYH4cqw .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TRPNVMMwUeYH4cqw .icon-shape p,#mermaid-svg-TRPNVMMwUeYH4cqw .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TRPNVMMwUeYH4cqw .icon-shape .label rect,#mermaid-svg-TRPNVMMwUeYH4cqw .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TRPNVMMwUeYH4cqw .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TRPNVMMwUeYH4cqw .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TRPNVMMwUeYH4cqw :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Profile
Service
Characteristic
Characteristic Value
Client Characteristic Configuration Descriptor
Other Descriptor
工程重点
| ATT_MTU 如何影响吞吐 | OTA、日志传输、传感器数据上报 |
| Notify 和 Indicate 区别 | 是否需要确认 |
| CCCD 作用 | Client 是否允许 Server 主动上报 |
| Service Changed 作用 | GATT 数据库变化后的缓存一致性 |
| EATT 价值 | 避免传统 ATT 串行阻塞 |
第 6 周:SMP 与 LE 安全
学习目标
掌握 LE 配对、绑定、加密、隐私地址。
阅读重点
| Pairing Request / Response | 配对能力协商 |
| IO Capability | 输入输出能力 |
| Association Model | Just Works、Passkey、Numeric Comparison、OOB |
| LE Legacy Pairing | STK |
| LE Secure Connections | ECDH |
| Key Distribution | LTK、IRK、CSRK |
| Privacy | RPA、IRK、Resolving List |
| Reconnection | 使用已保存密钥重新加密 |
流程图
ResponderInitiatorResponderInitiator#mermaid-svg-EDjofFnR7RpdwY8d{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EDjofFnR7RpdwY8d .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EDjofFnR7RpdwY8d .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EDjofFnR7RpdwY8d .error-icon{fill:#552222;}#mermaid-svg-EDjofFnR7RpdwY8d .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EDjofFnR7RpdwY8d .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EDjofFnR7RpdwY8d .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EDjofFnR7RpdwY8d .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EDjofFnR7RpdwY8d .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EDjofFnR7RpdwY8d .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EDjofFnR7RpdwY8d .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EDjofFnR7RpdwY8d .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EDjofFnR7RpdwY8d .marker.cross{stroke:#333333;}#mermaid-svg-EDjofFnR7RpdwY8d svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EDjofFnR7RpdwY8d p{margin:0;}#mermaid-svg-EDjofFnR7RpdwY8d .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-EDjofFnR7RpdwY8d text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-EDjofFnR7RpdwY8d .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-EDjofFnR7RpdwY8d .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-EDjofFnR7RpdwY8d .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-EDjofFnR7RpdwY8d .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-EDjofFnR7RpdwY8d #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-EDjofFnR7RpdwY8d .sequenceNumber{fill:white;}#mermaid-svg-EDjofFnR7RpdwY8d #sequencenumber{fill:#333;}#mermaid-svg-EDjofFnR7RpdwY8d #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-EDjofFnR7RpdwY8d .messageText{fill:#333;stroke:none;}#mermaid-svg-EDjofFnR7RpdwY8d .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-EDjofFnR7RpdwY8d .labelText,#mermaid-svg-EDjofFnR7RpdwY8d .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-EDjofFnR7RpdwY8d .loopText,#mermaid-svg-EDjofFnR7RpdwY8d .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-EDjofFnR7RpdwY8d .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-EDjofFnR7RpdwY8d .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-EDjofFnR7RpdwY8d .noteText,#mermaid-svg-EDjofFnR7RpdwY8d .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-EDjofFnR7RpdwY8d .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-EDjofFnR7RpdwY8d .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-EDjofFnR7RpdwY8d .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-EDjofFnR7RpdwY8d .actorPopupMenu{position:absolute;}#mermaid-svg-EDjofFnR7RpdwY8d .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-EDjofFnR7RpdwY8d .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-EDjofFnR7RpdwY8d .actor-man circle,#mermaid-svg-EDjofFnR7RpdwY8d line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-EDjofFnR7RpdwY8d :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}ECDH 生成共享密钥分发 LTK / IRK / CSRKPairing RequestPairing ResponsePublic KeyPublic KeyConfirm / RandomConfirm / RandomDHKey CheckDHKey Check
验收标准
能够解释:
-
Pairing 和 Bonding 的区别;
-
LTK、IRK、CSRK 各自用途;
-
Just Works 为什么不能防 MITM;
-
Numeric Comparison 为什么可以防 MITM;
-
RPA 为什么可以保护隐私;
-
重连时如何使用历史密钥加密。
第四阶段:HCI
第 7 周:HCI 基础
学习目标
掌握 Host 与 Controller 交互的标准接口。
重点内容
| HCI Command | Host → Controller | 控制 Controller |
| HCI Event | Controller → Host | 上报状态 |
| HCI ACL Data | 双向 | 传输 L2CAP 数据 |
| HCI SCO Data | 双向 | 经典蓝牙语音 |
| HCI ISO Data | 双向 | LE Isochronous 数据 |
必须掌握
| OGF / OCF | HCI Opcode 的组成 |
| Command Complete | 命令已完成 |
| Command Status | 命令已接收,后续通过事件完成 |
| Connection Handle | 连接标识 |
| PB Flag | ACL 分片标记 |
| Number Of Completed Packets | Controller buffer 回收 |
| HCI Error Code | 定位失败原因 |
HCI 数据路径
#mermaid-svg-vNWgDIlq2QHLBdeB{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vNWgDIlq2QHLBdeB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vNWgDIlq2QHLBdeB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vNWgDIlq2QHLBdeB .error-icon{fill:#552222;}#mermaid-svg-vNWgDIlq2QHLBdeB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vNWgDIlq2QHLBdeB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vNWgDIlq2QHLBdeB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vNWgDIlq2QHLBdeB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vNWgDIlq2QHLBdeB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vNWgDIlq2QHLBdeB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vNWgDIlq2QHLBdeB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vNWgDIlq2QHLBdeB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vNWgDIlq2QHLBdeB .marker.cross{stroke:#333333;}#mermaid-svg-vNWgDIlq2QHLBdeB svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vNWgDIlq2QHLBdeB p{margin:0;}#mermaid-svg-vNWgDIlq2QHLBdeB .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-vNWgDIlq2QHLBdeB .cluster-label text{fill:#333;}#mermaid-svg-vNWgDIlq2QHLBdeB .cluster-label span{color:#333;}#mermaid-svg-vNWgDIlq2QHLBdeB .cluster-label span p{background-color:transparent;}#mermaid-svg-vNWgDIlq2QHLBdeB .label text,#mermaid-svg-vNWgDIlq2QHLBdeB span{fill:#333;color:#333;}#mermaid-svg-vNWgDIlq2QHLBdeB .node rect,#mermaid-svg-vNWgDIlq2QHLBdeB .node circle,#mermaid-svg-vNWgDIlq2QHLBdeB .node ellipse,#mermaid-svg-vNWgDIlq2QHLBdeB .node polygon,#mermaid-svg-vNWgDIlq2QHLBdeB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vNWgDIlq2QHLBdeB .rough-node .label text,#mermaid-svg-vNWgDIlq2QHLBdeB .node .label text,#mermaid-svg-vNWgDIlq2QHLBdeB .image-shape .label,#mermaid-svg-vNWgDIlq2QHLBdeB .icon-shape .label{text-anchor:middle;}#mermaid-svg-vNWgDIlq2QHLBdeB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vNWgDIlq2QHLBdeB .rough-node .label,#mermaid-svg-vNWgDIlq2QHLBdeB .node .label,#mermaid-svg-vNWgDIlq2QHLBdeB .image-shape .label,#mermaid-svg-vNWgDIlq2QHLBdeB .icon-shape .label{text-align:center;}#mermaid-svg-vNWgDIlq2QHLBdeB .node.clickable{cursor:pointer;}#mermaid-svg-vNWgDIlq2QHLBdeB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vNWgDIlq2QHLBdeB .arrowheadPath{fill:#333333;}#mermaid-svg-vNWgDIlq2QHLBdeB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vNWgDIlq2QHLBdeB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vNWgDIlq2QHLBdeB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vNWgDIlq2QHLBdeB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vNWgDIlq2QHLBdeB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vNWgDIlq2QHLBdeB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vNWgDIlq2QHLBdeB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vNWgDIlq2QHLBdeB .cluster text{fill:#333;}#mermaid-svg-vNWgDIlq2QHLBdeB .cluster span{color:#333;}#mermaid-svg-vNWgDIlq2QHLBdeB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vNWgDIlq2QHLBdeB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vNWgDIlq2QHLBdeB rect.text{fill:none;stroke-width:0;}#mermaid-svg-vNWgDIlq2QHLBdeB .icon-shape,#mermaid-svg-vNWgDIlq2QHLBdeB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vNWgDIlq2QHLBdeB .icon-shape p,#mermaid-svg-vNWgDIlq2QHLBdeB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vNWgDIlq2QHLBdeB .icon-shape .label rect,#mermaid-svg-vNWgDIlq2QHLBdeB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vNWgDIlq2QHLBdeB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vNWgDIlq2QHLBdeB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vNWgDIlq2QHLBdeB :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
ATT PDU
L2CAP PDU
HCI ACL Data
LE LL Data PDU / BR ACL
Air Packet
第 8 周:BR/EDR HCI
重点命令
| 设备发现 | Inquiry、Inquiry Result |
| 连接建立 | Create Connection、Connection Complete |
| 断开连接 | Disconnect、Disconnection Complete |
| 认证 | Authentication Requested、Authentication Complete |
| 加密 | Set Connection Encryption、Encryption Change |
| 远端信息 | Read Remote Supported Features、Remote Name Request |
| 角色切换 | Switch Role、Role Change |
| Sniff | Sniff Mode、Exit Sniff Mode |
| SCO/eSCO | Setup Synchronous Connection |
典型流程
Remote DeviceControllerHostRemote DeviceControllerHost#mermaid-svg-lOf5yi8lJcTfm9px{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lOf5yi8lJcTfm9px .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lOf5yi8lJcTfm9px .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lOf5yi8lJcTfm9px .error-icon{fill:#552222;}#mermaid-svg-lOf5yi8lJcTfm9px .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lOf5yi8lJcTfm9px .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lOf5yi8lJcTfm9px .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lOf5yi8lJcTfm9px .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lOf5yi8lJcTfm9px .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lOf5yi8lJcTfm9px .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lOf5yi8lJcTfm9px .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lOf5yi8lJcTfm9px .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lOf5yi8lJcTfm9px .marker.cross{stroke:#333333;}#mermaid-svg-lOf5yi8lJcTfm9px svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lOf5yi8lJcTfm9px p{margin:0;}#mermaid-svg-lOf5yi8lJcTfm9px .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-lOf5yi8lJcTfm9px text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-lOf5yi8lJcTfm9px .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-lOf5yi8lJcTfm9px .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-lOf5yi8lJcTfm9px .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-lOf5yi8lJcTfm9px .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-lOf5yi8lJcTfm9px #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-lOf5yi8lJcTfm9px .sequenceNumber{fill:white;}#mermaid-svg-lOf5yi8lJcTfm9px #sequencenumber{fill:#333;}#mermaid-svg-lOf5yi8lJcTfm9px #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-lOf5yi8lJcTfm9px .messageText{fill:#333;stroke:none;}#mermaid-svg-lOf5yi8lJcTfm9px .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-lOf5yi8lJcTfm9px .labelText,#mermaid-svg-lOf5yi8lJcTfm9px .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-lOf5yi8lJcTfm9px .loopText,#mermaid-svg-lOf5yi8lJcTfm9px .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-lOf5yi8lJcTfm9px .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-lOf5yi8lJcTfm9px .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-lOf5yi8lJcTfm9px .noteText,#mermaid-svg-lOf5yi8lJcTfm9px .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-lOf5yi8lJcTfm9px .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-lOf5yi8lJcTfm9px .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-lOf5yi8lJcTfm9px .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-lOf5yi8lJcTfm9px .actorPopupMenu{position:absolute;}#mermaid-svg-lOf5yi8lJcTfm9px .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-lOf5yi8lJcTfm9px .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-lOf5yi8lJcTfm9px .actor-man circle,#mermaid-svg-lOf5yi8lJcTfm9px line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-lOf5yi8lJcTfm9px :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}HCI_InquiryInquiry ResultHCI_Create_ConnectionPageConnection CompleteHCI_Authentication_RequestedAuthentication CompleteHCI_Set_Connection_EncryptionEncryption Change
第 9 周:LE HCI
重点命令
| 广播 | LE Set Advertising Parameters / Enable |
| 扩展广播 | LE Set Extended Advertising Parameters / Enable |
| 扫描 | LE Set Scan Parameters / Enable |
| 建链 | LE Create Connection |
| 连接完成 | LE Connection Complete |
| 连接参数更新 | LE Connection Update |
| DLE | LE Set Data Length |
| PHY 切换 | LE Set PHY |
| 加密 | LE Start Encryption / LTK Request |
| 隐私 | Resolving List 相关命令 |
| ISO | CIS / BIS / BIG 相关命令 |
| Channel Sounding | CS 相关命令 |
实践任务
抓一段 BLE 连接 HCI log,按下面路径分析:
HCI_Reset
HCI_LE_Set_Advertising_Parameters
HCI_LE_Set_Advertising_Enable
HCI_LE_Connection_Complete
HCI_LE_Read_Remote_Features
HCI_LE_Data_Length_Change
ATT_Exchange_MTU
GATT_Service_Discovery
SMP_Pairing
Encryption_Change
第五阶段:BLE Controller
第 10 周:LE PHY
学习目标
理解 BLE 空口基础。
重点内容
| 40 个信道 | 3 个广播信道 + 37 个数据信道 |
| 1M PHY | 基础速率 |
| 2M PHY | 高吞吐 |
| Coded PHY | 远距离 |
| GFSK | 调制方式 |
| TX/RX 特性 | 发射、接收、灵敏度、干扰 |
| DTM | Direct Test Mode |
工程问题
| 为什么 2M PHY 不等于应用层 2 Mbps | 协议开销、连接事件、ACK、空口间隔 |
| Coded PHY 为什么远但慢 | 编码冗余换抗干扰 |
| 广播信道为什么是 37/38/39 | 提高发现概率、避开常见 Wi-Fi 干扰 |
| PHY Update 失败怎么查 | HCI、LLCP、Feature、对端能力 |
第 11 周:LE Link Layer 状态机
重点状态
| Standby | 空闲 |
| Advertising | 广播 |
| Scanning | 扫描 |
| Initiating | 发起连接 |
| Connection | 已连接 |
| Synchronization | 周期广播同步 |
| Isochronous Broadcasting | 等时广播 |
状态图
#mermaid-svg-H4YL9GWY9XAVFgPy{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-H4YL9GWY9XAVFgPy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-H4YL9GWY9XAVFgPy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-H4YL9GWY9XAVFgPy .error-icon{fill:#552222;}#mermaid-svg-H4YL9GWY9XAVFgPy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-H4YL9GWY9XAVFgPy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-H4YL9GWY9XAVFgPy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-H4YL9GWY9XAVFgPy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-H4YL9GWY9XAVFgPy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-H4YL9GWY9XAVFgPy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-H4YL9GWY9XAVFgPy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-H4YL9GWY9XAVFgPy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-H4YL9GWY9XAVFgPy .marker.cross{stroke:#333333;}#mermaid-svg-H4YL9GWY9XAVFgPy svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-H4YL9GWY9XAVFgPy p{margin:0;}#mermaid-svg-H4YL9GWY9XAVFgPy defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-H4YL9GWY9XAVFgPy g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-H4YL9GWY9XAVFgPy g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-H4YL9GWY9XAVFgPy g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-H4YL9GWY9XAVFgPy g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-H4YL9GWY9XAVFgPy g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-H4YL9GWY9XAVFgPy .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-H4YL9GWY9XAVFgPy .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-H4YL9GWY9XAVFgPy .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-H4YL9GWY9XAVFgPy .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-H4YL9GWY9XAVFgPy .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-H4YL9GWY9XAVFgPy .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-H4YL9GWY9XAVFgPy .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-H4YL9GWY9XAVFgPy .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-H4YL9GWY9XAVFgPy .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-H4YL9GWY9XAVFgPy .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-H4YL9GWY9XAVFgPy .edgeLabel .label text{fill:#333;}#mermaid-svg-H4YL9GWY9XAVFgPy .label div .edgeLabel{color:#333;}#mermaid-svg-H4YL9GWY9XAVFgPy .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-H4YL9GWY9XAVFgPy .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-H4YL9GWY9XAVFgPy .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-H4YL9GWY9XAVFgPy .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-H4YL9GWY9XAVFgPy .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-H4YL9GWY9XAVFgPy .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-H4YL9GWY9XAVFgPy .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-H4YL9GWY9XAVFgPy #statediagram-barbEnd{fill:#333333;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-H4YL9GWY9XAVFgPy .cluster-label,#mermaid-svg-H4YL9GWY9XAVFgPy .nodeLabel{color:#131300;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-H4YL9GWY9XAVFgPy .note-edge{stroke-dasharray:5;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-note text{fill:black;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram-note .nodeLabel{color:black;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagram .edgeLabel{color:red;}#mermaid-svg-H4YL9GWY9XAVFgPy #dependencyStart,#mermaid-svg-H4YL9GWY9XAVFgPy #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-H4YL9GWY9XAVFgPy .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-H4YL9GWY9XAVFgPy :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Standby
Advertising
Scanning
Initiating
Connection
学习重点
-
Legacy Advertising;
-
Extended Advertising;
-
Periodic Advertising;
-
Scan Request / Scan Response;
-
Connectable / Scannable / Directed Advertising;
-
Filter Accept List;
-
Resolving List;
-
Advertising Report;
-
Scan Response Data。
第 12 周:BLE Connection
学习目标
掌握 BLE 连接建立和连接事件。
重点参数
| Access Address | 连接标识 |
| CRC Init | CRC 初始化值 |
| Channel Map | 数据通道映射 |
| Hop Increment | 跳频参数 |
| Connection Interval | 连接间隔 |
| Peripheral Latency | 从设备延迟 |
| Supervision Timeout | 监督超时 |
| Window Size / Offset | 建链接收窗口 |
| Event Counter | 连接事件计数 |
工程问题
| interval 越小越好吗 | 延迟低,但功耗高 |
| latency 越大越好吗 | 省电,但响应慢 |
| supervision timeout 怎么设置 | 太小易误断,太大断链发现慢 |
| channel map 如何影响稳定性 | 避开坏信道 |
| connection event 内能发几个包 | 影响吞吐 |
第 13 周:LL Control Procedure
重点流程
| Feature Exchange | 特性交换 |
| Version Exchange | 版本交换 |
| Connection Update | 连接参数更新 |
| Channel Map Update | 信道图更新 |
| PHY Update | PHY 切换 |
| Data Length Update | 数据长度扩展 |
| Encryption Start | 启动加密 |
| Termination | 断开连接 |
| CIS / BIS Control | 等时通道 |
| Channel Sounding Procedure | 测距 |
LLCP 状态机
#mermaid-svg-9sPiQabULLDBcYoA{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9sPiQabULLDBcYoA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9sPiQabULLDBcYoA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9sPiQabULLDBcYoA .error-icon{fill:#552222;}#mermaid-svg-9sPiQabULLDBcYoA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9sPiQabULLDBcYoA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9sPiQabULLDBcYoA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9sPiQabULLDBcYoA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9sPiQabULLDBcYoA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9sPiQabULLDBcYoA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9sPiQabULLDBcYoA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9sPiQabULLDBcYoA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9sPiQabULLDBcYoA .marker.cross{stroke:#333333;}#mermaid-svg-9sPiQabULLDBcYoA svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9sPiQabULLDBcYoA p{margin:0;}#mermaid-svg-9sPiQabULLDBcYoA defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-9sPiQabULLDBcYoA g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-9sPiQabULLDBcYoA g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-9sPiQabULLDBcYoA g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-9sPiQabULLDBcYoA g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-9sPiQabULLDBcYoA g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-9sPiQabULLDBcYoA .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-9sPiQabULLDBcYoA .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-9sPiQabULLDBcYoA .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-9sPiQabULLDBcYoA .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-9sPiQabULLDBcYoA .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-9sPiQabULLDBcYoA .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-9sPiQabULLDBcYoA .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-9sPiQabULLDBcYoA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9sPiQabULLDBcYoA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9sPiQabULLDBcYoA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9sPiQabULLDBcYoA .edgeLabel .label text{fill:#333;}#mermaid-svg-9sPiQabULLDBcYoA .label div .edgeLabel{color:#333;}#mermaid-svg-9sPiQabULLDBcYoA .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-9sPiQabULLDBcYoA .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-9sPiQabULLDBcYoA .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-9sPiQabULLDBcYoA .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-9sPiQabULLDBcYoA .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-9sPiQabULLDBcYoA .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9sPiQabULLDBcYoA .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9sPiQabULLDBcYoA #statediagram-barbEnd{fill:#333333;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9sPiQabULLDBcYoA .cluster-label,#mermaid-svg-9sPiQabULLDBcYoA .nodeLabel{color:#131300;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-9sPiQabULLDBcYoA .note-edge{stroke-dasharray:5;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-note text{fill:black;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram-note .nodeLabel{color:black;}#mermaid-svg-9sPiQabULLDBcYoA .statediagram .edgeLabel{color:red;}#mermaid-svg-9sPiQabULLDBcYoA #dependencyStart,#mermaid-svg-9sPiQabULLDBcYoA #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-9sPiQabULLDBcYoA .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9sPiQabULLDBcYoA :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Idle
ProcedureStarted
WaitingResponse
Completed
Timeout
InstantPending
ErrorHandling
工程坑
| Procedure Collision | 双方同时发起控制流程 |
| Instant Passed | 生效点错过 |
| Feature 不匹配 | 本地发了对端不支持的过程 |
| LLCP 超时 | 对端不响应或调度异常 |
| 加密过程中插入其他流程 | 容易互操作出问题 |
第 14 周:LE ISO、Channel Sounding、新特性
ISO 重点
| CIS | Connected Isochronous Stream |
| CIG | Connected Isochronous Group |
| BIS | Broadcast Isochronous Stream |
| BIG | Broadcast Isochronous Group |
| ISOAL | Isochronous Adaptation Layer |
| Framed / Unframed | 等时数据适配模式 |
Channel Sounding 重点
| Channel Sounding | BLE 测距能力 |
| Phase-based Ranging | 基于相位的距离估计 |
| RTT-based Ranging | 基于往返时间的距离估计 |
| Attack Resilience | 抗攻击增强 |
| CS HCI Commands | Host 配置测距 |
| CS LL Procedure | Controller 执行测距过程 |
学习目标
能够说明:
-
LE Audio 为什么需要 ISO;
-
CIS 和 BIS 区别;
-
Channel Sounding 和 AoA/AoD 区别;
-
v6.x 新特性主要增强了哪些方向。
第六阶段:BR/EDR Controller
第 15 周:BR/EDR Radio
学习目标
理解经典蓝牙物理层。
重点内容
| Basic Rate | 基础速率 |
| EDR | Enhanced Data Rate |
| GFSK | Basic Rate 调制 |
| π/4-DQPSK | EDR 调制 |
| 8DPSK | EDR 调制 |
| 79 个信道 | 经典蓝牙跳频 |
| Power Class | 发射功率等级 |
| RX Sensitivity | 接收灵敏度 |
第 16 周:BR/EDR Baseband
学习目标
掌握经典蓝牙链路底层。
重点内容
| Bluetooth Clock | 时钟 |
| BD_ADDR | 蓝牙设备地址 |
| Access Code | 访问码 |
| Inquiry | 发现设备 |
| Page | 建立连接 |
| Piconet | 微微网 |
| Central / Peripheral | 主从角色 |
| Time Slot | 625 μs 时隙 |
| Hop Selection | 跳频选择 |
| Packet Header | LT_ADDR、TYPE、FLOW、ARQN、SEQN、HEC |
| ARQ | 自动重传 |
| FEC | 前向纠错 |
| Whitening | 白化 |
| Sniff / Hold | 低功耗模式 |
状态图
#mermaid-svg-HBJ878VMAmpJS2qr{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HBJ878VMAmpJS2qr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HBJ878VMAmpJS2qr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HBJ878VMAmpJS2qr .error-icon{fill:#552222;}#mermaid-svg-HBJ878VMAmpJS2qr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HBJ878VMAmpJS2qr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HBJ878VMAmpJS2qr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HBJ878VMAmpJS2qr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HBJ878VMAmpJS2qr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HBJ878VMAmpJS2qr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HBJ878VMAmpJS2qr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HBJ878VMAmpJS2qr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HBJ878VMAmpJS2qr .marker.cross{stroke:#333333;}#mermaid-svg-HBJ878VMAmpJS2qr svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HBJ878VMAmpJS2qr p{margin:0;}#mermaid-svg-HBJ878VMAmpJS2qr defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-HBJ878VMAmpJS2qr g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-HBJ878VMAmpJS2qr g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-HBJ878VMAmpJS2qr g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-HBJ878VMAmpJS2qr g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-HBJ878VMAmpJS2qr g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-HBJ878VMAmpJS2qr .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-HBJ878VMAmpJS2qr .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-HBJ878VMAmpJS2qr .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-HBJ878VMAmpJS2qr .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-HBJ878VMAmpJS2qr .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-HBJ878VMAmpJS2qr .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-HBJ878VMAmpJS2qr .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-HBJ878VMAmpJS2qr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HBJ878VMAmpJS2qr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HBJ878VMAmpJS2qr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HBJ878VMAmpJS2qr .edgeLabel .label text{fill:#333;}#mermaid-svg-HBJ878VMAmpJS2qr .label div .edgeLabel{color:#333;}#mermaid-svg-HBJ878VMAmpJS2qr .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-HBJ878VMAmpJS2qr .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-HBJ878VMAmpJS2qr .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-HBJ878VMAmpJS2qr .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-HBJ878VMAmpJS2qr .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-HBJ878VMAmpJS2qr .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HBJ878VMAmpJS2qr .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HBJ878VMAmpJS2qr #statediagram-barbEnd{fill:#333333;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HBJ878VMAmpJS2qr .cluster-label,#mermaid-svg-HBJ878VMAmpJS2qr .nodeLabel{color:#131300;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-HBJ878VMAmpJS2qr .note-edge{stroke-dasharray:5;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-note text{fill:black;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram-note .nodeLabel{color:black;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagram .edgeLabel{color:red;}#mermaid-svg-HBJ878VMAmpJS2qr #dependencyStart,#mermaid-svg-HBJ878VMAmpJS2qr #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-HBJ878VMAmpJS2qr .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HBJ878VMAmpJS2qr :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Standby
Inquiry
InquiryScan
Page
PageScan
Connection
Sniff
Hold
第 17 周:BR/EDR Packet、ACL、SCO/eSCO
重点包类型
| ID | Inquiry / Page 早期阶段 |
| NULL | 空包,常用于 ACK |
| POLL | 轮询 |
| FHS | Frequency Hop Synchronization |
| DM1/DH1/DH3/DH5 | ACL 数据 |
| 2-DH / 3-DH | EDR ACL 数据 |
| HV | SCO |
| EV | eSCO |
学习目标
能够分析:
-
ACL 数据如何承载 L2CAP;
-
SCO/eSCO 如何承载语音;
-
ARQN/SEQN 如何实现确认和重传;
-
Packet Type 如何影响吞吐;
-
Sniff 模式如何影响延迟和功耗。
第 18 周:LMP
学习目标
理解 BR/EDR 的链路管理协议。
重点流程
| Feature Exchange | 能力交换 |
| Version Exchange | 版本交换 |
| Name Request | 名称请求 |
| Authentication | 鉴权 |
| Pairing | 配对 |
| Encryption | 加密 |
| Role Switch | 角色切换 |
| Sniff Mode | 低功耗 |
| Hold Mode | 低功耗 |
| Power Control | 功率控制 |
| AFH | 自适应跳频 |
| QoS | 服务质量 |
| SCO/eSCO Setup | 语音链路 |
LMP 与 LLCP 对比
| 控制协议 | LMP | LL Control Procedure |
| 能力交换 | LMP_features_req/res | LL_FEATURE_REQ/RSP |
| 版本交换 | LMP_version_req/res | LL_VERSION_IND |
| 加密控制 | LMP Security | LL Encryption |
| PHY/速率控制 | Packet Type / EDR | PHY Update |
| 低功耗 | Sniff / Hold | Connection Parameter / Subrate |
第 19 周:BR/EDR Security
学习目标
掌握经典蓝牙配对、鉴权、加密。
重点内容
| Link Key | BR/EDR 长期密钥 |
| Authentication | 挑战应答 |
| Legacy Pairing | 旧配对 |
| Secure Simple Pairing | SSP |
| Numeric Comparison | 数字比较 |
| Passkey Entry | 密码输入 |
| Out of Band | 外部通道 |
| Just Works | 简单配对 |
| E0 Encryption | 经典加密 |
| AES-CCM for BR/EDR | 新式加密 |
| Encryption Key Size | 密钥长度协商 |
与 LE Security 对比
| 长期密钥 | Link Key | LTK |
| 隐私密钥 | 无 LE RPA 模型 | IRK |
| 签名密钥 | 非核心常用模型 | CSRK |
| 控制位置 | LMP / Controller | SMP / Host + LL / Controller |
| 配对方式 | SSP | LE Legacy / LE Secure Connections |
第七阶段:BR/EDR Profile 依赖协议
第 20 周:RFCOMM、OBEX、AVDTP、AVCTP
Core 学完后,要补上经典蓝牙 Profile 常用的中间协议。
RFCOMM
| 模拟串口 | HFP、SPP、部分 PBAP/MAP |
学习重点:
-
DLCI;
-
SABM / UA;
-
MSC;
-
Flow Control;
-
RFCOMM Channel;
-
SDP 中的 RFCOMM Server Channel。
OBEX
| 对象交换 | PBAP、MAP、OPP |
学习重点:
-
OBEX Connect;
-
OBEX Get;
-
OBEX Put;
-
Header;
-
Body / End Of Body;
-
Authentication;
-
Session。
AVDTP
| 音频流分发控制 | A2DP |
学习重点:
-
SEP Discovery;
-
Get Capabilities;
-
Set Configuration;
-
Open;
-
Start;
-
Suspend;
-
Close;
-
Abort;
-
Media Transport Channel。
AVCTP
| 音视频远程控制 | AVRCP |
学习重点:
-
Command / Response;
-
Transaction Label;
-
Pass Through;
-
Vendor Dependent;
-
Browsing Channel。
第八阶段:具体 Profile 学习
第 21 周:HFP
学习目标
掌握经典蓝牙通话控制。
学习路径
#mermaid-svg-H5ZqHHN3EuIOUlUM{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-H5ZqHHN3EuIOUlUM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-H5ZqHHN3EuIOUlUM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-H5ZqHHN3EuIOUlUM .error-icon{fill:#552222;}#mermaid-svg-H5ZqHHN3EuIOUlUM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-H5ZqHHN3EuIOUlUM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-H5ZqHHN3EuIOUlUM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-H5ZqHHN3EuIOUlUM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-H5ZqHHN3EuIOUlUM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-H5ZqHHN3EuIOUlUM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-H5ZqHHN3EuIOUlUM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-H5ZqHHN3EuIOUlUM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-H5ZqHHN3EuIOUlUM .marker.cross{stroke:#333333;}#mermaid-svg-H5ZqHHN3EuIOUlUM svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-H5ZqHHN3EuIOUlUM p{margin:0;}#mermaid-svg-H5ZqHHN3EuIOUlUM .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-H5ZqHHN3EuIOUlUM .cluster-label text{fill:#333;}#mermaid-svg-H5ZqHHN3EuIOUlUM .cluster-label span{color:#333;}#mermaid-svg-H5ZqHHN3EuIOUlUM .cluster-label span p{background-color:transparent;}#mermaid-svg-H5ZqHHN3EuIOUlUM .label text,#mermaid-svg-H5ZqHHN3EuIOUlUM span{fill:#333;color:#333;}#mermaid-svg-H5ZqHHN3EuIOUlUM .node rect,#mermaid-svg-H5ZqHHN3EuIOUlUM .node circle,#mermaid-svg-H5ZqHHN3EuIOUlUM .node ellipse,#mermaid-svg-H5ZqHHN3EuIOUlUM .node polygon,#mermaid-svg-H5ZqHHN3EuIOUlUM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-H5ZqHHN3EuIOUlUM .rough-node .label text,#mermaid-svg-H5ZqHHN3EuIOUlUM .node .label text,#mermaid-svg-H5ZqHHN3EuIOUlUM .image-shape .label,#mermaid-svg-H5ZqHHN3EuIOUlUM .icon-shape .label{text-anchor:middle;}#mermaid-svg-H5ZqHHN3EuIOUlUM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-H5ZqHHN3EuIOUlUM .rough-node .label,#mermaid-svg-H5ZqHHN3EuIOUlUM .node .label,#mermaid-svg-H5ZqHHN3EuIOUlUM .image-shape .label,#mermaid-svg-H5ZqHHN3EuIOUlUM .icon-shape .label{text-align:center;}#mermaid-svg-H5ZqHHN3EuIOUlUM .node.clickable{cursor:pointer;}#mermaid-svg-H5ZqHHN3EuIOUlUM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-H5ZqHHN3EuIOUlUM .arrowheadPath{fill:#333333;}#mermaid-svg-H5ZqHHN3EuIOUlUM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-H5ZqHHN3EuIOUlUM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-H5ZqHHN3EuIOUlUM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-H5ZqHHN3EuIOUlUM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-H5ZqHHN3EuIOUlUM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-H5ZqHHN3EuIOUlUM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-H5ZqHHN3EuIOUlUM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-H5ZqHHN3EuIOUlUM .cluster text{fill:#333;}#mermaid-svg-H5ZqHHN3EuIOUlUM .cluster span{color:#333;}#mermaid-svg-H5ZqHHN3EuIOUlUM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-H5ZqHHN3EuIOUlUM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-H5ZqHHN3EuIOUlUM rect.text{fill:none;stroke-width:0;}#mermaid-svg-H5ZqHHN3EuIOUlUM .icon-shape,#mermaid-svg-H5ZqHHN3EuIOUlUM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-H5ZqHHN3EuIOUlUM .icon-shape p,#mermaid-svg-H5ZqHHN3EuIOUlUM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-H5ZqHHN3EuIOUlUM .icon-shape .label rect,#mermaid-svg-H5ZqHHN3EuIOUlUM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-H5ZqHHN3EuIOUlUM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-H5ZqHHN3EuIOUlUM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-H5ZqHHN3EuIOUlUM :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
SDP 发现 HFP 服务
RFCOMM 控制通道
AT Command
SCO/eSCO 音频链路
通话状态机
重点内容
| HF / AG | Hands-Free / Audio Gateway |
| SDP Record | 服务发现 |
| RFCOMM Channel | 控制通道 |
| AT+BRSF | 功能交换 |
| AT+CIND | 指示器 |
| AT+CMER | 开启状态上报 |
| AT+CLIP | 来电号码 |
| AT+VGS / AT+VGM | 音量 |
| SCO/eSCO | 语音承载 |
| CVSD / mSBC | 窄带/宽带语音 |
抓包重点
-
HCI ACL 中的 RFCOMM;
-
RFCOMM 中的 AT Command;
-
HCI Synchronous Connection Complete;
-
SCO/eSCO 数据;
-
音频连接建立失败原因。
第 22 周:A2DP + AVRCP
A2DP 学习目标
掌握经典蓝牙音乐播放。
A2DP 路径
#mermaid-svg-4cwvdZnLUKm9UP2l{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4cwvdZnLUKm9UP2l .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4cwvdZnLUKm9UP2l .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4cwvdZnLUKm9UP2l .error-icon{fill:#552222;}#mermaid-svg-4cwvdZnLUKm9UP2l .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4cwvdZnLUKm9UP2l .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4cwvdZnLUKm9UP2l .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4cwvdZnLUKm9UP2l .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4cwvdZnLUKm9UP2l .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4cwvdZnLUKm9UP2l .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4cwvdZnLUKm9UP2l .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4cwvdZnLUKm9UP2l .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4cwvdZnLUKm9UP2l .marker.cross{stroke:#333333;}#mermaid-svg-4cwvdZnLUKm9UP2l svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4cwvdZnLUKm9UP2l p{margin:0;}#mermaid-svg-4cwvdZnLUKm9UP2l .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-4cwvdZnLUKm9UP2l .cluster-label text{fill:#333;}#mermaid-svg-4cwvdZnLUKm9UP2l .cluster-label span{color:#333;}#mermaid-svg-4cwvdZnLUKm9UP2l .cluster-label span p{background-color:transparent;}#mermaid-svg-4cwvdZnLUKm9UP2l .label text,#mermaid-svg-4cwvdZnLUKm9UP2l span{fill:#333;color:#333;}#mermaid-svg-4cwvdZnLUKm9UP2l .node rect,#mermaid-svg-4cwvdZnLUKm9UP2l .node circle,#mermaid-svg-4cwvdZnLUKm9UP2l .node ellipse,#mermaid-svg-4cwvdZnLUKm9UP2l .node polygon,#mermaid-svg-4cwvdZnLUKm9UP2l .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4cwvdZnLUKm9UP2l .rough-node .label text,#mermaid-svg-4cwvdZnLUKm9UP2l .node .label text,#mermaid-svg-4cwvdZnLUKm9UP2l .image-shape .label,#mermaid-svg-4cwvdZnLUKm9UP2l .icon-shape .label{text-anchor:middle;}#mermaid-svg-4cwvdZnLUKm9UP2l .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4cwvdZnLUKm9UP2l .rough-node .label,#mermaid-svg-4cwvdZnLUKm9UP2l .node .label,#mermaid-svg-4cwvdZnLUKm9UP2l .image-shape .label,#mermaid-svg-4cwvdZnLUKm9UP2l .icon-shape .label{text-align:center;}#mermaid-svg-4cwvdZnLUKm9UP2l .node.clickable{cursor:pointer;}#mermaid-svg-4cwvdZnLUKm9UP2l .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4cwvdZnLUKm9UP2l .arrowheadPath{fill:#333333;}#mermaid-svg-4cwvdZnLUKm9UP2l .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4cwvdZnLUKm9UP2l .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4cwvdZnLUKm9UP2l .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4cwvdZnLUKm9UP2l .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4cwvdZnLUKm9UP2l .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4cwvdZnLUKm9UP2l .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4cwvdZnLUKm9UP2l .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4cwvdZnLUKm9UP2l .cluster text{fill:#333;}#mermaid-svg-4cwvdZnLUKm9UP2l .cluster span{color:#333;}#mermaid-svg-4cwvdZnLUKm9UP2l div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4cwvdZnLUKm9UP2l .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4cwvdZnLUKm9UP2l rect.text{fill:none;stroke-width:0;}#mermaid-svg-4cwvdZnLUKm9UP2l .icon-shape,#mermaid-svg-4cwvdZnLUKm9UP2l .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4cwvdZnLUKm9UP2l .icon-shape p,#mermaid-svg-4cwvdZnLUKm9UP2l .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4cwvdZnLUKm9UP2l .icon-shape .label rect,#mermaid-svg-4cwvdZnLUKm9UP2l .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4cwvdZnLUKm9UP2l .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4cwvdZnLUKm9UP2l .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4cwvdZnLUKm9UP2l :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
SDP
L2CAP
AVDTP
Codec Capability
Media Streaming
A2DP 重点
| Source / Sink | 音频源 / 音频接收端 |
| SEP | Stream Endpoint |
| Discover | 发现 SEP |
| Get Capabilities | 获取 Codec 能力 |
| Set Configuration | 配置 Codec |
| Open / Start | 打开并启动流 |
| Suspend / Close | 暂停和关闭 |
| SBC | 必选 Codec |
| AAC / aptX / LDAC | 可选或厂商 Codec |
AVRCP 重点
| Controller / Target | 控制端 / 被控端 |
| Pass Through | 播放、暂停、下一曲 |
| Absolute Volume | 绝对音量 |
| Metadata | 歌曲信息 |
| Browsing | 媒体浏览 |
第 23 周:PBAP + MAP
PBAP 学习目标
掌握电话本同步流程。
PBAP 路径
#mermaid-svg-bUiTKmPVJyGxwSt3{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bUiTKmPVJyGxwSt3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bUiTKmPVJyGxwSt3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bUiTKmPVJyGxwSt3 .error-icon{fill:#552222;}#mermaid-svg-bUiTKmPVJyGxwSt3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bUiTKmPVJyGxwSt3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bUiTKmPVJyGxwSt3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bUiTKmPVJyGxwSt3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bUiTKmPVJyGxwSt3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bUiTKmPVJyGxwSt3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bUiTKmPVJyGxwSt3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bUiTKmPVJyGxwSt3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bUiTKmPVJyGxwSt3 .marker.cross{stroke:#333333;}#mermaid-svg-bUiTKmPVJyGxwSt3 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bUiTKmPVJyGxwSt3 p{margin:0;}#mermaid-svg-bUiTKmPVJyGxwSt3 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-bUiTKmPVJyGxwSt3 .cluster-label text{fill:#333;}#mermaid-svg-bUiTKmPVJyGxwSt3 .cluster-label span{color:#333;}#mermaid-svg-bUiTKmPVJyGxwSt3 .cluster-label span p{background-color:transparent;}#mermaid-svg-bUiTKmPVJyGxwSt3 .label text,#mermaid-svg-bUiTKmPVJyGxwSt3 span{fill:#333;color:#333;}#mermaid-svg-bUiTKmPVJyGxwSt3 .node rect,#mermaid-svg-bUiTKmPVJyGxwSt3 .node circle,#mermaid-svg-bUiTKmPVJyGxwSt3 .node ellipse,#mermaid-svg-bUiTKmPVJyGxwSt3 .node polygon,#mermaid-svg-bUiTKmPVJyGxwSt3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bUiTKmPVJyGxwSt3 .rough-node .label text,#mermaid-svg-bUiTKmPVJyGxwSt3 .node .label text,#mermaid-svg-bUiTKmPVJyGxwSt3 .image-shape .label,#mermaid-svg-bUiTKmPVJyGxwSt3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-bUiTKmPVJyGxwSt3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bUiTKmPVJyGxwSt3 .rough-node .label,#mermaid-svg-bUiTKmPVJyGxwSt3 .node .label,#mermaid-svg-bUiTKmPVJyGxwSt3 .image-shape .label,#mermaid-svg-bUiTKmPVJyGxwSt3 .icon-shape .label{text-align:center;}#mermaid-svg-bUiTKmPVJyGxwSt3 .node.clickable{cursor:pointer;}#mermaid-svg-bUiTKmPVJyGxwSt3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bUiTKmPVJyGxwSt3 .arrowheadPath{fill:#333333;}#mermaid-svg-bUiTKmPVJyGxwSt3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bUiTKmPVJyGxwSt3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bUiTKmPVJyGxwSt3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bUiTKmPVJyGxwSt3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bUiTKmPVJyGxwSt3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bUiTKmPVJyGxwSt3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bUiTKmPVJyGxwSt3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bUiTKmPVJyGxwSt3 .cluster text{fill:#333;}#mermaid-svg-bUiTKmPVJyGxwSt3 .cluster span{color:#333;}#mermaid-svg-bUiTKmPVJyGxwSt3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bUiTKmPVJyGxwSt3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bUiTKmPVJyGxwSt3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-bUiTKmPVJyGxwSt3 .icon-shape,#mermaid-svg-bUiTKmPVJyGxwSt3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bUiTKmPVJyGxwSt3 .icon-shape p,#mermaid-svg-bUiTKmPVJyGxwSt3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bUiTKmPVJyGxwSt3 .icon-shape .label rect,#mermaid-svg-bUiTKmPVJyGxwSt3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bUiTKmPVJyGxwSt3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bUiTKmPVJyGxwSt3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bUiTKmPVJyGxwSt3 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
SDP
RFCOMM 或 L2CAP
OBEX
vCard
PBAP
PBAP 重点
| PCE / PSE | Client / Server |
| OBEX Connect | 建立 OBEX 会话 |
| SetPath | 切换电话本路径 |
| PullPhoneBook | 拉取电话本 |
| PullvCardListing | 拉取 vCard 列表 |
| PullvCardEntry | 拉取单个联系人 |
| vCard | 联系人数据格式 |
| Repository | 本机、SIM、收藏夹等 |
MAP 重点
| MCE / MSE | Message Client / Server |
| Message Listing | 消息列表 |
| Message Get | 获取消息 |
| Notification | 消息通知 |
| OBEX | 对象传输基础 |
第九阶段:双模融合与互操作
第 24 周:综合实战
实战 1:BLE GATT 连接完整流程
要求能从 HCI log 中分析:
Advertising
Scanning
Connection Complete
Feature Exchange
Data Length Update
PHY Update
Exchange MTU
Service Discovery
Characteristic Discovery
CCCD Write
Notification
Pairing
Encryption
Disconnection
实战 2:BR/EDR HFP 通话完整流程
要求能分析:
Inquiry
Page
ACL Connection
SDP Search
RFCOMM Connection
AT+BRSF
AT+CIND
AT+CMER
SCO/eSCO Setup
Audio Connected
Call Active
Audio Disconnected
RFCOMM Disconnect
ACL Disconnect
实战 3:A2DP 播放完整流程
要求能分析:
ACL Connection
SDP Search
L2CAP AVDTP Signaling Channel
AVDTP Discover
Get Capabilities
Set Configuration
Open
Start
Media Streaming
Suspend
Close
实战 4:PBAP 电话本同步完整流程
要求能分析:
ACL Connection
SDP Search
RFCOMM / L2CAP Channel
OBEX Connect
SetPath
PullPhoneBook
PullvCardListing
PullvCardEntry
OBEX Disconnect
七、不同方向的学习优先级
1. 做 BLE 协议栈
优先级:
Vol 1 Architecture;
Vol 3 L2CAP;
Vol 3 ATT;
Vol 3 GATT;
Vol 3 SMP;
Vol 4 HCI;
Vol 6 LE PHY;
Vol 6 LE Link Layer;
Vol 6 LE Security;
LE ISO / Channel Sounding / Privacy。
2. 做 BR/EDR Controller
优先级:
Vol 1 Architecture;
Vol 2 Radio;
Vol 2 Baseband;
Vol 2 LMP;
Vol 2 Security;
Vol 4 HCI;
Vol 2 MSC;
Vol 2 Sample Data;
SCO/eSCO;
AFH / Sniff / Role Switch。
3. 做 BR/EDR Profile
优先级:
Vol 1 Architecture;
Vol 3 L2CAP;
Vol 3 SDP;
Vol 4 HCI;
BR/EDR ACL/SCO/eSCO;
RFCOMM;
OBEX;
AVDTP;
AVCTP;
HFP/A2DP/AVRCP/PBAP/MAP。
4. 做双模协议栈
优先级:
Core 架构;
HCI;
L2CAP;
SDP/GAP;
BLE ATT/GATT/SMP;
BLE LL;
BR/EDR Baseband/LMP;
BR/EDR Security;
HFP/A2DP/AVRCP/PBAP;
CTKD、Privacy、Coexistence。
八、每周学习模板
建议每周固定产出下面这些内容。
# 本周主题
## 1. 阅读章节
– 文档:
– Volume:
– Part:
– Section:
## 2. 核心概念
| 概念 | 解释 | 工程意义 |
|—|—|—|
| | | |
## 3. 协议流程图
```mermaid
sequenceDiagram
participant A
participant B
A->>B: Message
```
`
## 4. 关键字段
|字段|长度|含义|注意事项|
|—|–:|—|—|
|||||
## 5. HCI / 空口抓包对应
|抓包项|说明|
|—|—|
|HCI Command||
|HCI Event||
|ACL Data||
|L2CAP||
|Upper Protocol||
## 6. 常见错误
|错误|可能原因|定位方法|
|—|—|—|
||||
## 7. 本周遗留问题
– 问题 1
– 问题 2
九、调试视角:如何判断问题属于 Core 还是 Profile?
这是协议栈工程师必须掌握的能力。
| BLE 扫不到设备 | LE Advertising / Scanning / Filter / Privacy |
| BLE 连不上 | LE Initiating / Connection Parameters / Address Type |
| BLE GATT 读写失败 | ATT/GATT/L2CAP/Security |
| BLE 配对失败 | SMP / IO Capability / Key Size / AuthReq |
| BR/EDR 搜不到设备 | Inquiry / Inquiry Scan / Class of Device |
| BR/EDR 连不上 | Page / Page Scan / ACL / Authentication |
| HFP AT 命令异常 | HFP Profile / RFCOMM |
| HFP 没声音 | SCO/eSCO / Codec / Audio Path |
| A2DP 播放失败 | AVDTP / Codec / L2CAP / ACL |
| AVRCP 音量不同步 | AVRCP / Absolute Volume |
| PBAP 拉不到联系人 | PBAP / OBEX / 权限 / 电话本路径 |
| 音频卡顿 | Coexistence / Buffer / Retransmission / Scheduling |
| 随机断链 | Supervision Timeout / RSSI / MIC Failure / Remote Terminate |
十、最终学习目标
完成这套学习后,应该具备下面能力:
| 读懂 Core | 能说明每个 Volume 负责什么 |
| 读懂 HCI log | 能从 Reset 到 Disconnection 复盘流程 |
| 分析 BLE | 能看懂 Advertising、Connection、GATT、SMP |
| 分析 BR/EDR | 能看懂 Inquiry、Page、ACL、LMP、安全 |
| 分析 HFP | 能看懂 RFCOMM 和 AT Command |
| 分析 A2DP | 能看懂 AVDTP 和 Media Streaming |
| 分析 AVRCP | 能看懂播放控制和音量控制 |
| 分析 PBAP | 能看懂 OBEX 和 vCard 拉取 |
| 定位问题 | 能判断问题属于 Controller、Host、Profile、App 还是对端 |
| 做性能优化 | 能分析吞吐、功耗、延迟、音频稳定性 |
十一、总结
Core_v6.2 不是 HFP、A2DP、PBAP 的详细说明书。
它主要讲的是:
蓝牙系统如何发现设备、建立连接、管理链路、承载数据、进行加密、暴露 Host/Controller 接口,以及如何保证 BR/EDR 和 LE 设备的基础互操作。
HFP、A2DP、AVRCP、PBAP 这些属于 Core 之上的应用 Profile。它们依赖 Core 提供的能力,但具体业务状态机和数据格式不放在 Core 中。
所以正确学习路线应该是:
#mermaid-svg-xrj649ZMzrzqA9wb{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xrj649ZMzrzqA9wb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xrj649ZMzrzqA9wb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xrj649ZMzrzqA9wb .error-icon{fill:#552222;}#mermaid-svg-xrj649ZMzrzqA9wb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xrj649ZMzrzqA9wb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xrj649ZMzrzqA9wb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xrj649ZMzrzqA9wb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xrj649ZMzrzqA9wb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xrj649ZMzrzqA9wb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xrj649ZMzrzqA9wb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xrj649ZMzrzqA9wb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xrj649ZMzrzqA9wb .marker.cross{stroke:#333333;}#mermaid-svg-xrj649ZMzrzqA9wb svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xrj649ZMzrzqA9wb p{margin:0;}#mermaid-svg-xrj649ZMzrzqA9wb .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-xrj649ZMzrzqA9wb .cluster-label text{fill:#333;}#mermaid-svg-xrj649ZMzrzqA9wb .cluster-label span{color:#333;}#mermaid-svg-xrj649ZMzrzqA9wb .cluster-label span p{background-color:transparent;}#mermaid-svg-xrj649ZMzrzqA9wb .label text,#mermaid-svg-xrj649ZMzrzqA9wb span{fill:#333;color:#333;}#mermaid-svg-xrj649ZMzrzqA9wb .node rect,#mermaid-svg-xrj649ZMzrzqA9wb .node circle,#mermaid-svg-xrj649ZMzrzqA9wb .node ellipse,#mermaid-svg-xrj649ZMzrzqA9wb .node polygon,#mermaid-svg-xrj649ZMzrzqA9wb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xrj649ZMzrzqA9wb .rough-node .label text,#mermaid-svg-xrj649ZMzrzqA9wb .node .label text,#mermaid-svg-xrj649ZMzrzqA9wb .image-shape .label,#mermaid-svg-xrj649ZMzrzqA9wb .icon-shape .label{text-anchor:middle;}#mermaid-svg-xrj649ZMzrzqA9wb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xrj649ZMzrzqA9wb .rough-node .label,#mermaid-svg-xrj649ZMzrzqA9wb .node .label,#mermaid-svg-xrj649ZMzrzqA9wb .image-shape .label,#mermaid-svg-xrj649ZMzrzqA9wb .icon-shape .label{text-align:center;}#mermaid-svg-xrj649ZMzrzqA9wb .node.clickable{cursor:pointer;}#mermaid-svg-xrj649ZMzrzqA9wb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xrj649ZMzrzqA9wb .arrowheadPath{fill:#333333;}#mermaid-svg-xrj649ZMzrzqA9wb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xrj649ZMzrzqA9wb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xrj649ZMzrzqA9wb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xrj649ZMzrzqA9wb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xrj649ZMzrzqA9wb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xrj649ZMzrzqA9wb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xrj649ZMzrzqA9wb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xrj649ZMzrzqA9wb .cluster text{fill:#333;}#mermaid-svg-xrj649ZMzrzqA9wb .cluster span{color:#333;}#mermaid-svg-xrj649ZMzrzqA9wb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xrj649ZMzrzqA9wb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xrj649ZMzrzqA9wb rect.text{fill:none;stroke-width:0;}#mermaid-svg-xrj649ZMzrzqA9wb .icon-shape,#mermaid-svg-xrj649ZMzrzqA9wb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xrj649ZMzrzqA9wb .icon-shape p,#mermaid-svg-xrj649ZMzrzqA9wb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xrj649ZMzrzqA9wb .icon-shape .label rect,#mermaid-svg-xrj649ZMzrzqA9wb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xrj649ZMzrzqA9wb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xrj649ZMzrzqA9wb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xrj649ZMzrzqA9wb :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
先学 Core地基和通用协议
重点掌握 HCI调试入口
学习 BLEATT/GATT/SMP/LL
学习 BR/EDRBaseband/LMP/SCO/eSCO
学习 ProfileHFP/A2DP/AVRCP/PBAP
结合抓包和问题定位
用一句比较接地气的话总结:
Core 是蓝牙的“操作系统内核 + 交通规则”;
HFP/A2DP/PBAP 是跑在上面的“具体 App”。
只学 Core,看业务会懵;只学 Profile,底层出问题也会懵。
真正的协议栈工程师,两边都要会,抓包还得看得比老板脸色还准。



