欢迎光临
我们一直在努力

【Bluetooth-SIG】【CoreV6.2】【从 Core_v6.2 出发的系统学习计划】

蓝牙 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 更关注这些问题:

问题是否属于 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 的主体。

它们解决的是具体业务场景:

Profile全称典型用途常见底层依赖
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,而是两套生态结构不一样:

方向Core 中的完整度原因
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 重点

    方向BR/EDRBLE
    发现 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 数据类型方向用途
    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

    重点命令

    场景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

    重点命令

    场景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

    重点流程

    LL 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 的链路管理协议。

    重点流程

    LMP 流程用途
    Feature Exchange 能力交换
    Version Exchange 版本交换
    Name Request 名称请求
    Authentication 鉴权
    Pairing 配对
    Encryption 加密
    Role Switch 角色切换
    Sniff Mode 低功耗
    Hold Mode 低功耗
    Power Control 功率控制
    AFH 自适应跳频
    QoS 服务质量
    SCO/eSCO Setup 语音链路

    LMP 与 LLCP 对比

    项BR/EDRBLE
    控制协议 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 对比

    项BR/EDRLE
    长期密钥 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

    用途典型 Profile
    模拟串口 HFP、SPP、部分 PBAP/MAP

    学习重点:

    • DLCI;

    • SABM / UA;

    • MSC;

    • Flow Control;

    • RFCOMM Channel;

    • SDP 中的 RFCOMM Server Channel。

    OBEX

    用途典型 Profile
    对象交换 PBAP、MAP、OPP

    学习重点:

    • OBEX Connect;

    • OBEX Get;

    • OBEX Put;

    • Header;

    • Body / End Of Body;

    • Authentication;

    • Session。

    AVDTP

    用途典型 Profile
    音频流分发控制 A2DP

    学习重点:

    • SEP Discovery;

    • Get Capabilities;

    • Set Configuration;

    • Open;

    • Start;

    • Suspend;

    • Close;

    • Abort;

    • Media Transport Channel。

    AVCTP

    用途典型 Profile
    音视频远程控制 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,底层出问题也会懵。
    真正的协议栈工程师,两边都要会,抓包还得看得比老板脸色还准。

    赞(0)
    未经允许不得转载:171主机测评 » 【Bluetooth-SIG】【CoreV6.2】【从 Core_v6.2 出发的系统学习计划】
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址