文章目录
- 经典蓝牙(BR/EDR)物理层核心机制详解
-
- 1、设备地址(BD_ADDR)
-
- [1.1、BD_ADDR 结构](#1.1、BD_ADDR 结构)
- [1.2、BD_ADDR 在蓝牙协议中的核心作用](#1.2、BD_ADDR 在蓝牙协议中的核心作用)
- 2、时钟同步
- [3、查询(Inquiry)与 寻呼(Page)流程](#3、查询(Inquiry)与 寻呼(Page)流程)
-
- 3.1、设备状态机概览
- [3.2、查询流程(Inquiry)--- 设备发现](#3.2、查询流程(Inquiry)— 设备发现)
- [3.3、寻呼流程(Page)--- 连接建立](#3.3、寻呼流程(Page)— 连接建立)
- [3.4、Inquiry + Page 完整流程总结](#3.4、Inquiry + Page 完整流程总结)
- [4、链路类型(SCO / eSCO / ACL)](#4、链路类型(SCO / eSCO / ACL))
-
- [4.1、ACL(Asynchronous Connection-Oriented)链路](#4.1、ACL(Asynchronous Connection-Oriented)链路)
-
- [4.1.1、ACL 核心特性](#4.1.1、ACL 核心特性)
- [4.1.2、ACL 包类型与速率](#4.1.2、ACL 包类型与速率)
- [4.1.3、ACL 重传机制(ARQ)](#4.1.3、ACL 重传机制(ARQ))
- [4.2、SCO(Synchronous Connection-Oriented)链路](#4.2、SCO(Synchronous Connection-Oriented)链路)
-
- [4.2.1、SCO 核心特性](#4.2.1、SCO 核心特性)
- [4.2.2、SCO 时隙预留机制](#4.2.2、SCO 时隙预留机制)
- [4.2.3、SCO 包类型](#4.2.3、SCO 包类型)
- [4.3、eSCO(Extended SCO)链路](#4.3、eSCO(Extended SCO)链路)
-
- [4.3.1、eSCO 核心改进](#4.3.1、eSCO 核心改进)
- [4.3.2、eSCO 时隙结构](#4.3.2、eSCO 时隙结构)
- [4.3.3、eSCO 包类型](#4.3.3、eSCO 包类型)
- 4.4、三种链路类型对比总结
- 4.5、链路类型与蓝牙Profile的关系
- 小结
经典蓝牙(BR/EDR)物理层核心机制详解
1、设备地址(BD_ADDR)
蓝牙设备地址(Bluetooth Device Address, BD_ADDR)是每个蓝牙设备的唯一身份标识,类似于以太网的MAC地址。它是蓝牙网络中设备识别、跳频序列生成和安全加密的基础。
1.1、BD_ADDR 结构
BD_ADDR 是一个 48位(6字节) 地址,遵循 IEEE 802 标准格式:
┌─────────────────────────────────────────────────────────────┐
│ BD_ADDR 格式 (48 bit) │
├──────────────┬──────────────┬───────────────────────────────┤
│ NAP │ UAP │ LAP │
│ (16 bit) │ (8 bit) │ (24 bit) │
├──────────────┼──────────────┼───────────────────────────────┤
│ 公司识别码 │ 公司识别码 │ 设备唯一编号 │
│ (OUI高16位) │ (OUI低8位) │ (厂商内部分配) │
└──────────────┴──────────────┴───────────────────────────────┘
│ │ │
▼ ▼ ▼
0x0000_5E 0x00_00_00 0x00_00_00
─────────────────────────────────────────
示例: 00:11:22:33:44:55
| 字段 | 位数 | 含义 | 示例 |
|---|---|---|---|
| NAP(Non-significant Address Part) | 16 bit | 非有效地址部分,OUI高16位 | 00:11 |
| UAP(Upper Address Part) | 8 bit | 有效地址高位,OUI低8位 | 0x22 |
| LAP(Lower Address Part) | 24 bit | 有效地址低位,设备唯一标识 | 0x33:44:55 |
地址获取方式:
- 每个蓝牙芯片出厂时由厂商烧录唯一的 BD_ADDR
- IEEE 向厂商分配 OUI(Organizationally Unique Identifier),前24位(NAP+UAP)标识厂商
- 厂商自行分配后24位(LAP),确保全球唯一性
1.2、BD_ADDR 在蓝牙协议中的核心作用
┌─────────────────────────────────────────────────────────────┐
│ BD_ADDR 的多重功能 │
│ │
│ 1. 设备身份识别 │
│ └── 设备发现、配对、连接时唯一标识目标设备 │
│ │
│ 2. 跳频序列生成种子 │
│ └── LAP + UAP + CLK → 伪随机跳频序列 │
│ └── 不同设备 → 不同序列 → 多微微网共存 │
│ │
│ 3. 接入码(Access Code)生成 │
│ └── 信道接入码(CAC)= f(LAP, UAP) │
│ └── 设备接入码(DAC)= f(LAP) │
│ └── 查询接入码(IAC)= 固定值(GIAC/DIAC) │
│ │
│ 4. 安全密钥生成 │
│ └── 链路密钥、加密密钥的派生输入 │
└─────────────────────────────────────────────────────────────┘
接入码(Access Code)详解:
| 接入码类型 | 生成依据 | 用途 |
|---|---|---|
| CAC(Channel Access Code) | 主设备LAP + UAP | 标识一个微微网,所有包的前导 |
| DAC(Device Access Code) | 目标设备LAP | Page流程中寻呼特定设备 |
| IAC(Inquiry Access Code) | 固定值(0x9E8B33) | Inquiry流程中通用查询 |
2、时钟同步
蓝牙是一种时隙化的跳频系统 ,所有设备必须在微秒级精度上保持时钟同步,才能正确收发数据。时钟同步是微微网正常运作的生命线。
2.1、蓝牙时钟体系
每个蓝牙设备内部维护一个自由运行的本地时钟(Native Clock, CLKN):
┌─────────────────────────────────────────────────────────────┐
│ 蓝牙 Native Clock (CLKN) │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 28 位计数器,以 3.2 kHz 频率递增(周期 312.5 μs) │ │
│ │ │ │
│ │ 位域划分: │ │
│ │ ┌────┬────┬────┬────┬────┬────┬────┬────────────┐ │ │
│ │ │CLK0│CLK1│... │CLK4│CLK5│... │CLK15│... │CLK27 │ │ │
│ │ └────┴────┴────┴────┴────┴────┴────┴────────────┘ │ │
│ │ 1.25ms │ 时隙选择 │ 时钟高位(用于跳频序列) │ │
│ │ 单位 │ (625μs) │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 时钟精度要求: ±20 ppm(百万分之二十) │
│ 即: 在1秒内,最大偏差不超过 20 μs │
└─────────────────────────────────────────────────────────────┘
时钟精度与通信的关系:
| 精度 | 1秒累积偏差 | 对蓝牙的影响 |
|---|---|---|
| ±20 ppm | ±20 μs | 规范要求,可正常工作 |
| ±50 ppm | ±50 μs | 可能错过包开头,需频繁重同步 |
| ±100 ppm | ±100 μs | 严重失步,连接频繁断开 |
2.2、主从时钟关系与偏移补偿
微微网建立后,主设备的时钟成为微微网的参考时钟(Master Clock, CLK)。所有从设备必须将自己的本地时钟与主时钟对齐。
┌─────────────────────────────────────────────────────────────┐
│ 时钟偏移(Clock Offset)机制 │
│ │
│ 从设备 Native Clock: CLKN │
│ 主设备 Master Clock: CLK │
│ │
│ 时钟偏移: offset = CLK - CLKN │
│ │
│ 从设备通过保存 offset,可以在任意时刻计算: │
│ CLK = CLKN + offset │
│ │
│ 这个 offset 在连接建立时通过 FHS 包传递 │
└─────────────────────────────────────────────────────────────┘
时钟同步的维护:
| 场景 | 同步机制 |
|---|---|
| 初始同步 | Page/Inquiry 过程中通过 FHS 包交换时钟信息 |
| 连接中维护 | 每个接收到的包都包含主设备时钟信息,从设备持续微调 offset |
| 休眠恢复 | Parked 设备定期监听主设备信标(Beacon)更新 offset |
| 时钟漂移补偿 | 从设备根据接收包的定时误差,动态修正 offset |
2.3、时钟在跳频中的角色
跳频序列的生成直接依赖于时钟值:
跳频索引 f(k) 的计算(简化):
输入:
- CLKₖ: 第k个时隙的时钟值(取CLK6--CLK27)
- LAP: 主设备地址低24位
- UAP: 主设备地址高8位
步骤:
1. 选择阶段: 根据CLK高位选择跳频子集
2. 置换阶段: 使用LAP作为密钥,对子集进行伪随机置换
3. 输出: 0--78 之间的信道编号
关键特性:
- 每 625 μs,CLK增加1 → 跳频索引变化
- 相同 LAP + 相同 CLK → 相同信道
- 不同 LAP → 完全不同的跳频序列
3、查询(Inquiry)与 寻呼(Page)流程
Inquiry 和 Page 是蓝牙设备建立连接的两大核心流程。前者解决"发现谁在那里",后者解决"如何连上它"。
3.1、设备状态机概览
在讲解具体流程前,先了解蓝牙设备的基础状态机:
┌─────────────────────────────────────────────────────────────┐
│ 蓝牙设备基础状态机 │
│ │
│ ┌─────────────┐ │
│ │ STANDBY │ ← 待机,低功耗 │
│ │ (待机) │ │
│ └──────┬──────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ INQUIRY │ │ PAGE │ │ CONNECTION │ │
│ │ (查询) │ │ (寻呼) │ │ (连接态) │ │
│ └────────────┘ └────────────┘ └────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌────────────┐ ┌────────────┐ │
│ │INQUIRY │ │ PAGE │ │
│ │SCAN(查询扫描)│ │SCAN(寻呼扫描)│ │
│ └────────────┘ └────────────┘ │
│ │
│ 子状态: 主设备发起INQUIRY/PAGE,从设备进入对应SCAN状态 │
└─────────────────────────────────────────────────────────────┘
3.2、查询流程(Inquiry)--- 设备发现
目标:主设备(或任何想发现设备的节点)发现周围可发现的蓝牙设备,获取其 BD_ADDR 和时钟信息。
3.2.1、查询流程时序
┌─────────────────────────────────────────────────────────────┐
│ Inquiry 流程时序图 │
│ │
│ 查询设备 (Inquiry Master) 被查询设备 (Inquiry Slave) │
│ │
│ │ │ │
│ │ 1. 进入 INQUIRY 状态 │ │
│ │ 在32个唤醒信道上发送 ID 包 │ │
│ │ ────────────────────────────────► │ │
│ │ [频率 f₁, f₂, ... f₃₂] │ │
│ │ │ │
│ │ │ 2. 进入 INQUIRY │
│ │ │ SCAN 状态 │
│ │ │ 监听唤醒信道 │
│ │ │ │
│ │ 3. 从设备在某一唤醒信道上 │ │
│ │ 接收到 ID 包,随机等待 │ │
│ │ 0--1023 slots 后响应 │ │
│ │ ◄──────────────────────────────── │ │
│ │ FHS 包 (包含 BD_ADDR + CLK) │ │
│ │ │ │
│ │ 4. 主设备接收 FHS,记录设备信息 │ │
│ │ 可选择发送扩展查询响应请求 │ │
│ │ ────────────────────────────────► │ │
│ │ │ │
│ │ 5. 从设备回复扩展查询响应(EIR) │ │
│ │ (设备名称、服务类别等) │ │
│ │ ◄──────────────────────────────── │ │
│ │ │ │
│ │ [重复步骤1-5,遍历所有唤醒信道] │ │
│ │ │ │
└─────────────────────────────────────────────────────────────┘
3.2.2、查询的关键机制
(1)32个唤醒信道(Wake-up Channels)
┌─────────────────────────────────────────────────────────────┐
│ 32个唤醒信道分布(用于Inquiry/Page) │
│ │
│ 79个信道编号: 0, 1, 2, 3, ..., 78 │
│ │
│ A组 (16个): 0, 2, 4, 6, ..., 22, 24, 26, 28, 30 │
│ B组 (16个): 33, 35, 37, ..., 53, 55, 57 │
│ │
│ 查询设备以 A₁→B₁→A₂→B₂→... 的顺序快速跳频 │
│ 跳频速率: 3200 hops/s(每312.5μs跳一次) │
│ │
│ 被查询设备以较慢速率扫描(每隔1.28s切换一次扫描频率) │
│ 确保 eventually 能"撞上"查询设备 │
└─────────────────────────────────────────────────────────────┘
(2)ID 包(Identity Packet)
ID包是蓝牙中最短的包,仅包含 68 bit 的接入码,无包头、无负载:
ID 包结构:
┌────────────────────────┐
│ 接入码 (68 bit) │
│ (GIAC = 0x9E8B33) │
│ 或 DIAC │
└────────────────────────┘
总长度: 68 bit ≈ 68 μs (BR模式)
| 接入码类型 | 值 | 用途 |
|---|---|---|
| GIAC(General IAC) | 0x9E8B33 | 通用查询,发现所有可发现设备 |
| DIAC(Dedicated IAC) | 0x9E8B00--0x9E8B3F | 专用查询,发现特定类别设备 |
(3)FHS 包(Frequency Hopping Synchronization)
FHS包是蓝牙连接建立过程中最关键的控制包,携带了建立同步所需的全部信息:
FHS 包负载结构 (144 bit 信息位):
┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│ BD_ADDR │ CLK │ 设备类 │ 扫描参数 │ 保留 │ CRC │
│ (LAP+UAP)│(26 bit) │(24 bit) │(8 bit) │ │ │
│ (34 bit) │ │ │ │ │ │
└─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘
关键信息:
- LAP + UAP: 设备地址 → 用于生成跳频序列
- CLK (bit2--bit27): 设备时钟 → 用于计算时钟偏移
- Class of Device: 设备类型(手机/耳机/电脑等)
(4)扩展查询响应(EIR, Extended Inquiry Response)
从蓝牙v2.1开始,从设备可在FHS后发送EIR包,提供更多信息:
| EIR 数据类型 | 内容 |
|---|---|
| 0x08/0x09 | 设备本地名称(缩短/完整) |
| 0x02/0x03 | 16-bit Service Class UUID |
| 0x04/0x05 | 32-bit Service Class UUID |
| 0x06/0x07 | 128-bit Service Class UUID |
| 0x0A | 发射功率等级 |
| 0xFF | 厂商自定义数据 |
3.3、寻呼流程(Page)--- 连接建立
目标:主设备在已知目标设备 BD_ADDR 的基础上,建立物理链路,形成微微网。
3.3.1、寻呼流程时序
┌─────────────────────────────────────────────────────────────┐
│ Page 流程时序图 │
│ │
│ 主设备 (Paging Master) 从设备 (Paging Slave) │
│ │
│ 已知: 从设备BD_ADDR + 近似时钟 │
│ │ │ │
│ │ 1. 进入 PAGE 状态 │ │
│ │ 在32个唤醒信道上发送 │ │
│ │ PAGE ID 包 (包含DAC) │ │
│ │ ────────────────────────────────► │ │
│ │ │ │
│ │ │ 2. 进入 PAGE │
│ │ │ SCAN 状态 │
│ │ │ 监听唤醒信道 │
│ │ │ │
│ │ 3. 从设备接收到 PAGE ID │ │
│ │ 计算时钟偏移,回复 PAGE │ │
│ │ RESPONSE (包含自身DAC) │ │
│ │ ◄──────────────────────────────── │ │
│ │ │ │
│ │ 4. 主设备发送 FHS 包 │ │
│ │ (包含主设备BD_ADDR + CLK) │ │
│ │ ────────────────────────────────► │ │
│ │ │ │
│ │ 5. 从设备接收 FHS,计算 offset │ │
│ │ 切换到主设备的跳频序列 │ │
│ │ 回复 PAGE RESPONSE (FHS确认) │ │
│ │ ◄──────────────────────────────── │ │
│ │ │ │
│ │ 6. 主设备发送第一个 POLL 包 │ │
│ │ 验证链路建立成功 │ │
│ │ ────────────────────────────────► │ │
│ │ │ │
│ │ 7. 从设备回复 POLL 响应 │ │
│ │ 连接建立完成! │ │
│ │ ◄──────────────────────────────── │ │
│ │ │ │
│ │ [双方进入 CONNECTION 状态] │ │
│ │ [使用完整的79信道跳频序列] │ │
│ │
└─────────────────────────────────────────────────────────────┘
3.3.2、寻呼的关键机制
(1)时钟估计与跳频预测
主设备发起Page时,需要知道从设备的大致时钟来预测它正在监听哪个唤醒信道:
┌─────────────────────────────────────────────────────────────┐
│ 时钟估计与跳频预测 │
│ │
│ 主设备已知: │
│ - 从设备 BD_ADDR (来自之前的Inquiry或配对记录) │
│ - 从设备时钟的"快照" (来自上次连接或Inquiry时的FHS) │
│ │
│ 问题: 从设备时钟一直在走,主设备保存的时钟已经过时 │
│ │
│ 解决方案: 时钟估计窗口 │
│ - 主设备假设从设备时钟漂移在 ±10ms 范围内 │
│ - 主设备在预测的唤醒信道附近,发送多个PAGE ID包 │
│ - 覆盖可能的时钟偏差,确保从设备能收到 │
│ │
│ 具体实现: │
│ - Train A: 在16个A组信道上快速重复发送 (每10ms一轮) │
│ - Train B: 在16个B组信道上快速重复发送 │
│ - 交替进行A/B训练,直到收到响应或超时 │
└─────────────────────────────────────────────────────────────┘
(2)PAGE 状态中的跳频
| 阶段 | 跳频序列 | 信道数 | 跳频速率 |
|---|---|---|---|
| PAGE | Page Hopping Sequence | 32 | 3200 hops/s |
| PAGE SCAN | 固定频率或慢速跳频 | 1 或 32 | 每隔1.28s切换 |
| 连接建立后 | Channel Hopping Sequence | 79 | 1600 hops/s |
(3)时序参数
| 参数 | 典型值 | 说明 |
|---|---|---|
| pageTO | 5.12 s | Page超时时间,未响应则放弃 |
| page_scan_interval | 1.28 s | 两次Page扫描之间的间隔 |
| page_scan_window | 11.25 ms | 每次扫描持续的时间 |
| srMode | R0/R1/R2 | 扫描重复模式,影响响应延迟 |
3.4、Inquiry + Page 完整流程总结
┌─────────────────────────────────────────────────────────────┐
│ 完整设备发现与连接建立流程 │
│ │
│ 阶段1: 设备发现 (Inquiry) │
│ ├─ 主设备发送 GIAC 在32个唤醒信道上 │
│ ├─ 从设备回复 FHS (BD_ADDR + CLK) │
│ └─ 主设备收集设备列表 (Name, Class, RSSI) │
│ │
│ 阶段2: 用户选择目标设备 │
│ └─ 应用层展示设备列表,用户选择要连接的设备 │
│ │
│ 阶段3: 连接建立 (Page) │
│ ├─ 主设备使用已知BD_ADDR发起Page │
│ ├─ 交换FHS包,同步时钟和跳频序列 │
│ ├─ 交换链路管理信息 (LMP) │
│ │ ├─ LMP_host_connection_req │
│ │ ├─ LMP_setup_complete │
│ │ └─ 协商特性 (加密、QoS、AFH等) │
│ └─ 连接建立,进入CONNECTION状态 │
│ │
│ 阶段4: 服务发现 (SDP) │
│ └─ 查询目标设备支持的服务 (A2DP, HFP等) │
│ │
│ 阶段5: 应用层连接 (Profile) │
│ └─ 根据服务类型建立L2CAP信道,启动Profile │
│ │
└─────────────────────────────────────────────────────────────┘
4、链路类型(SCO / eSCO / ACL)
蓝牙在基带层定义了三种物理链路类型,分别服务于异步数据 和同步语音两种截然不同的传输需求。
4.1、ACL(Asynchronous Connection-Oriented)链路
ACL 是蓝牙数据传输的默认链路类型 ,用于承载所有非实时的分组数据。
4.1.1、ACL 核心特性
| 特性 | 说明 |
|---|---|
| 链路方向 | 点对点,主设备与单个从设备之间 |
| 时隙分配 | 动态分配,无固定预留时隙 |
| 重传机制 | 支持ARQ(自动重传请求),确保可靠传输 |
| 对称/非对称 | 支持非对称速率(上行≠下行) |
| 最大活跃ACL链路 | 主设备可与多个从设备建立ACL,但同一时刻只能与一个从设备传输 |
4.1.2、ACL 包类型与速率
ACL包根据占用时隙数和是否使用EDR调制,分为多种类型:
| 包类型 | 时隙数 | 调制 | 有效负载(字节) | 对称速率(kbps) | 非对称速率(kbps) |
|---|---|---|---|---|---|
| DM1 | 1 | GFSK | 0--17 | 108.8 | 108.8/108.8 |
| DH1 | 1 | GFSK | 0--27 | 172.8 | 172.8/172.8 |
| DM3 | 3 | GFSK | 0--121 | 387.2 | 575.6/86.4 |
| DH3 | 3 | GFSK | 0--183 | 585.6 | 870.4/130.6 |
| DM5 | 5 | GFSK | 0--224 | 477.8 | 721.0/57.6 |
| DH5 | 5 | GFSK | 0--339 | 723.2 | 1088.8/86.4 |
| 2-DH1 | 1 | EDR | 0--54 | 345.6 | 345.6/345.6 |
| 2-DH3 | 3 | EDR | 0--367 | 1174.4 | 1741.0/261.1 |
| 2-DH5 | 5 | EDR | 0--679 | 1445.4 | 2178.1/173.0 |
| 3-DH1 | 1 | EDR | 0--83 | 531.2 | 531.2/531.2 |
| 3-DH3 | 3 | EDR | 0--552 | 1766.4 | 2617.1/392.2 |
| 3-DH5 | 5 | EDR | 0--1021 | 2170.6 | 3264.0/259.2 |
命名规则:
- D = Data(数据)
- M = Medium rate(中速率,2/3 FEC前向纠错)
- H = High rate(高速率,无FEC)
- 前缀 2- / 3- = EDR模式(2 Mbps / 3 Mbps)
4.1.3、ACL 重传机制(ARQ)
┌─────────────────────────────────────────────────────────────┐
│ ACL ARQ 重传机制 │
│ │
│ 每个ACL包包含: │
│ - SEQN 位: 序列号 (1 bit, 交替 0/1) │
│ - ARQN 位: 确认位 (1 bit, ACK/NAK) │
│ │
│ 发送方: │
│ 发送包(SEQN=0) ──► 等待ACK │
│ ◄─────────── ARQN=1 (ACK) │
│ 发送包(SEQN=1) ──► 等待ACK │
│ ◄─────────── ARQN=0 (ACK) │
│ │
│ 如果超时未收到ACK,或收到NAK: │
│ 重传相同SEQN的包 │
│ │
│ 接收方: │
│ 正确接收 → 回复 ACK │
│ CRC错误 → 回复 NAK (或不回复,超时触发重传) │
│ 重复包 → 丢弃,但仍回复ACK (防止死锁) │
└─────────────────────────────────────────────────────────────┘
4.2、SCO(Synchronous Connection-Oriented)链路
SCO 是专为实时语音传输设计的同步链路 ,提供固定带宽、低延迟、无重传的传输服务。
4.2.1、SCO 核心特性
| 特性 | 说明 |
|---|---|
| 应用场景 | 语音通话(HFP)、语音命令(HSP) |
| 时隙分配 | 固定预留,每T_SCO个时隙分配一对时隙 |
| 重传机制 | 不支持ARQ,无重传(保证低延迟) |
| 纠错机制 | 可选1/3 FEC或2/3 FEC |
| 对称性 | 严格对称,上下行速率相同 |
| 最大SCO链路 | 主设备最多可同时支持 3条SCO链路 |
4.2.2、SCO 时隙预留机制
┌─────────────────────────────────────────────────────────────┐
│ SCO 时隙预留示例 (T_SCO = 2) │
│ │
│ 时隙: 0 1 2 3 4 5 6 7 8 9 │
│ │ │ │ │ │ │ │ │ │ │ │
│ Master:███░░░░░███░░░░░███░░░░░███░░░░░███░░░░░███░░░░░ │
│ │ │ │ │ │ │ │ │ │ │ │
│ Slave: ░░░███░░░░░███░░░░░███░░░░░███░░░░░███░░░░░███░░ │
│ │ │ │ │ │ │ │ │ │ │ │
│ 图例: ███ = SCO预留时隙 ░░░ = ACL可用时隙 │
│ │
│ T_SCO = 2: 每2个时隙预留1对SCO时隙 → 64 kbps │
│ T_SCO = 4: 每4个时隙预留1对SCO时隙 → 32 kbps (较少用) │
│ │
│ 预留的SCO时隙具有最高优先级,ACL包不能占用 │
└─────────────────────────────────────────────────────────────┘
4.2.3、SCO 包类型
| 包类型 | 时隙数 | 语音编码 | 有效负载 | 速率 | FEC |
|---|---|---|---|---|---|
| HV1 | 2 | 无压缩 | 10字节 | 64 kbps | 1/3 FEC |
| HV2 | 2 | 无压缩 | 20字节 | 64 kbps | 2/3 FEC |
| HV3 | 2 | 无压缩 | 30字节 | 64 kbps | 无FEC |
| DV | 1 | 混合 | 10字节语音+数据 | 64k语音+数据 | 可选 |
命名规则:
- H = High-quality voice(高质量语音)
- V = Voice(语音)
- HV1/2/3 = 不同FEC保护级别
- DV = Data + Voice(数据和语音混合)
语音编码:
- 蓝牙SCO默认使用 CVSD(Continuously Variable Slope Delta) 编码
- CVSD是一种自适应增量调制,对随机误码不敏感(适合无重传的SCO链路)
- 输出固定 64 kbps,与PCM语音兼容
4.3、eSCO(Extended SCO)链路
eSCO 在蓝牙v1.2中引入 ,是对SCO的扩展,解决了SCO无重传导致语音质量受干扰影响大的问题。
4.3.1、eSCO 核心改进
| 改进项 | SCO | eSCO |
|---|---|---|
| 重传机制 | 无 | 支持有限重传 |
| 时隙灵活性 | 固定T_SCO | 可配置T_eSCO, W_eSCO |
| 包大小 | 固定 | 可配置负载大小 |
| 数据混合 | DV包(有限) | 原生支持数据通道 |
| 语音编码 | CVSD固定64kbps | 支持透明传输(如mSBC) |
4.3.2、eSCO 时隙结构
┌─────────────────────────────────────────────────────────────┐
│ eSCO 时隙结构示例 │
│ │
│ 时隙: 0 1 2 3 4 5 6 7 8 9 │
│ │ │ │ │ │ │ │ │ │ │ │
│ eSCO: ███░░░░░░░░░░░░░░░███░░░░░░░░░░░░░░░███░░░░░░░░░░ │
│ │ │ │ │ │ │ │
│ │ └─重传窗口────┘ └─重传窗口────┘ └─ │
│ │ W_eSCO=4 W_eSCO=4 │
│ │ │
│ T_eSCO = 8: 每8个时隙预留1对eSCO时隙 │
│ W_eSCO = 4: 预留4个时隙作为重传窗口 │
│ │
│ 如果eSCO包在时隙0发送失败: │
│ - 可在时隙2, 4, 6中重传(在W_eSCO窗口内) │
│ - 时隙8是下一个eSCO周期,不能占用 │
│ │
│ 重传窗口内的时隙: │
│ - 优先级低于下一个eSCO周期 │
│ - 优先级高于ACL │
└─────────────────────────────────────────────────────────────┘
4.3.3、eSCO 包类型
| 包类型 | 时隙数 | 语音字节 | 数据字节 | 速率 | 重传窗口 |
|---|---|---|---|---|---|
| EV3 | 1 | 1--30 | 0 | 可变 | 可配置 |
| EV4 | 3 | 1--120 | 0 | 可变 | 可配置 |
| EV5 | 3 | 1--180 | 0 | 可变 | 可配置 |
| EV6 | 1 | 1--60 | 0 | 可变 | 可配置 (EDR) |
| EV7 | 3 | 1--360 | 0 | 可变 | 可配置 (EDR) |
| EV8 | 3 | 1--540 | 0 | 可变 | 可配置 (EDR) |
| 2-EV3 | 1 | 1--60 | 0 | 可变 | 可配置 (EDR) |
| 2-EV5 | 3 | 1--360 | 0 | 可变 | 可配置 (EDR) |
| 3-EV3 | 1 | 1--90 | 0 | 可变 | 可配置 (EDR) |
| 3-EV5 | 3 | 1--540 | 0 | 可变 | 可配置 (EDR) |
命名规则:
- E = Extended(扩展)
- V = Voice(语音)
- 前缀 2- / 3- = EDR模式
4.4、三种链路类型对比总结
| 对比维度 | ACL | SCO | eSCO |
|---|---|---|---|
| 设计目标 | 通用数据传输 | 实时语音(CVSD) | 增强实时语音+数据 |
| 时隙分配 | 动态竞争 | 固定预留 | 固定预留+重传窗口 |
| 重传机制 | ARQ(无限重传) | 无重传 | 有限重传(可配置) |
| 纠错机制 | CRC + ARQ | 1/3 FEC 或 2/3 FEC | CRC + 有限重传 + FEC |
| 延迟特性 | 可变(依赖重传) | 固定低延迟 | 接近固定低延迟 |
| 对称性 | 支持非对称 | 严格对称 | 可配置对称/非对称 |
| 最大链路数 | 与7个从设备各1条 | 主设备最多3条 | 主设备最多3条 |
| 典型应用 | 文件传输、A2DP音频、网络 | HFP窄带语音 | HFP宽带语音(mSBC)、游戏音频 |
| 语音编码 | 不适用 | CVSD 64kbps | CVSD / mSBC / 透明传输 |
| 数据混合 | 纯数据 | DV包(有限) | 原生支持 |
4.5、链路类型与蓝牙Profile的关系
┌─────────────────────────────────────────────────────────────┐
│ Profile 与链路类型的映射 │
│ │
│ A2DP (高级音频分发) │
│ └── L2CAP ──► ACL ──► EDR (2-DH1/3/5, 3-DH1/3/5) │
│ └── 高质量立体声音频,高带宽,可容忍延迟 │
│ │
│ HFP (免提配置) / HSP (耳机配置) │
│ └── SCO ──► HV3 (窄带语音, CVSD 64kbps) │
│ └── eSCO ──► EV3/2-EV3 (宽带语音, mSBC 16kHz) │
│ └── 双向语音通话,低延迟优先 │
│ │
│ OPP (对象推送) / FTP (文件传输) │
│ └── L2CAP ──► ACL ──► DH5 / 3-DH5 │
│ └── 最大化吞吐,容忍延迟 │
│ │
│ DUN (拨号网络) / PAN (个人网络) │
│ └── L2CAP ──► ACL ──► DM1/DH1--DH5 │
│ └── 数据网络,可靠性优先 │
│ │
└─────────────────────────────────────────────────────────────┘
小结
经典蓝牙物理层的核心机制------设备地址、时钟同步、查询/寻呼流程、链路类型------共同构建了一个**从"发现设备"到"建立连接"再到"持续通信"**的完整链路管理体系:
| 机制 | 核心功能 | 关键设计 |
|---|---|---|
| BD_ADDR | 全球唯一身份标识 | 48位地址,LAP驱动跳频序列 |
| 时钟同步 | 微秒级时隙对齐 | 28位时钟,offset补偿,±20 ppm精度 |
| Inquiry | 设备发现 | 32唤醒信道,FHS交换,EIR扩展 |
| Page | 连接建立 | DAC寻址,时钟估计,FHS同步,POLL验证 |
| ACL | 通用数据传输 | 动态时隙,ARQ重传,非对称高速 |
| SCO | 实时语音传输 | 固定预留,无重传,CVSD编码,低延迟 |
| eSCO | 增强语音传输 | 有限重传窗口,可配置参数,支持宽带语音 |
理解这些机制,就能明白为什么蓝牙能够在2.4 GHz的"拥挤频段"中实现稳定的音频流传输 和可靠的设备互联 ------每一个设计细节,从48位地址的分配到625 μs时隙的划分,从FHS包的时钟传递到SCO时隙的固定预留,都是为了在复杂无线环境中平衡效率、可靠性和实时性这三重目标。