经典蓝牙(Classic Bluetooth / BR/EDR)--- 核心协议层1 --- 经典蓝牙(BR/EDR)物理层核心机制详解

文章目录

经典蓝牙(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时隙的固定预留,都是为了在复杂无线环境中平衡效率、可靠性和实时性这三重目标。

相关推荐
奔跑吧 android22 天前
【Bluetooth-SIG】【CoreV6.2】【Vol3 Part G】【GATT】【零】【GATT 逐句逐段学习计划 2】
ble·bluetooth·att·gatt·core_v6.2·sig
奔跑吧 android1 个月前
【Bluetooth-SIG】【CoreV6.2】【Vol3 Part F】【十三】【Error Handling——ATT_ERROR_RSP】
ble·bluetooth·att·gatt·蓝牙协议·bt·core_v6.2
一渊之隔3 个月前
uniapp蓝牙搜索连接展示蓝牙设备包含信号显示
前端·网络·uni-app·bluetooth
yanlaifan3 个月前
BLE中PHY 1M和 2M
bluetooth
奔跑吧 android4 个月前
【BT-SIG】【Core_v6.2】【Vol 3 Host】【Part G: GATT】【3.1 Service definition】
ble·bluetooth·gatt·蓝牙协议·bt·core_v6.2·bt-sig
奔跑吧 android4 个月前
【BT-SIG】【Core_v6.2】【Vol 3 Host】【Part G: GATT】【2.Profile overview】
ble·bluetooth·协议解析·gatt·bt-sig解析·core_v6.2
wzfj123455 个月前
bt-l2cap 深入理解重点接口 l2c_link_check_send_pkts
蓝牙·bluetooth·bt
summerkissyou19875 个月前
android -wifi/蓝牙-常见面试题
android·wifi·bluetooth
奔跑吧 android9 个月前
【android bluetooth 协议分析 14】【HFP详解 2】【蓝牙电话绝对音量详解】
android·bluetooth·hfp·bt·ag