BLE OTA(Over-The-Air)完整交互流程详解
目录
- BLE协议栈分层架构
- 物理层与链路层PDU格式
- 广播阶段(Advertising)
- 扫描阶段(Scanning)
- 连接建立(Connection)
- 配对与绑定(Pairing & Bonding)
- 服务发现(GATT Service Discovery)
- 数据交互(Data Exchange)
- 断连(Disconnection)
1. BLE协议栈分层架构
┌─────────────────────────────────────────────────────────────────┐ │ Application Layer │ ├─────────────────────────────────────────────────────────────────┤ │ GATT Layer │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │ │ │ GATT Client │ │ GATT Server │ │ Service/Profile │ │ │ └──────────────┘ └──────────────┘ └──────────────────────┘ │ ├─────────────────────────────────────────────────────────────────┤ │ ATT Layer │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │ │ │ ATT Request │ │ ATT Response│ │ ATT Notification │ │ │ └──────────────┘ └──────────────┘ └──────────────────────┘ │ ├─────────────────────────────────────────────────────────────────┤ │ L2CAP Layer │ │ ┌────────────────────────────────────────────────────────────┐ │ │ │ L2CAP Channel (CID=0x0004 for ATT) │ │ │ │ - LE Credit Based Flow Control (LE-CFC) │ │ │ │ - Fixed Channel for ATT, SM, LE signaling │ │ │ └────────────────────────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────────────────────┤ │ HCI Layer │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │ │ │ HCI Command │ │ HCI Event │ │ ACL Data Packet │ │ │ └──────────────┘ └──────────────┘ └──────────────────────┘ │ ├─────────────────────────────────────────────────────────────────┤ │ Link Layer (LL) │ │ ┌────────────────────────────────────────────────────────────┐ │ │ │ - LL Data PDU │ │ │ │ - LL Control PDU │ │ │ │ - Advertising PDU (ADV_IND, SCAN_REQ, CONNECT_IND, etc.) │ │ │ └────────────────────────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────────────────────┤ │ Physical Layer (PHY) │ │ ┌────────────────────────────────────────────────────────────┐ │ │ │ - 2.4GHz ISM Band (2402-2480 MHz, 40 channels) │ │ │ │ - Channel Spacing: 2MHz │ │ │ │ - Modulation: GFSK, 1Msym/s (LE 1M), 2Msym/s (LE 2M) │ │ │ └────────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ Data Flow Direction: Master (Central) Slave (Peripheral) ┌──────────────┐ ┌──────────────┐ │ Application │ <── GATT Read/Write/Notify/Indicate ──> │ Application │ ├──────────────┤ ├──────────────┤ │ GATT │ <────── ATT Request/Response ─────────> │ GATT │ ├──────────────┤ ├──────────────┤ │ ATT │ <────── L2CAP Data (CID=0x0004) ──────> │ ATT │ ├──────────────┤ ├──────────────┤ │ L2CAP │ <────── ACL Data Packets ────────────> │ L2CAP │ ├──────────────┤ ├──────────────┤ │ HCI │ <────── HCI ACL / HCI Events ─────────> │ HCI │ ├──────────────┤ ├──────────────┤ │ Link Layer │ <────── LL Data / LL Control PDU ─────> │ Link Layer │ ├──────────────┤ ├──────────────┤ │ PHY │ <────── Radio Frames (2.4GHz) ────────> │ PHY │ └──────────────┘ └──────────────┘各层核心作用
| 层级 | 功能 | 典型PDU/数据单元 |
|---|---|---|
| Application | 业务逻辑实现 | 自定义数据 |
| GATT | 定义服务、特征值、描述符结构 | Service/Characteristic/Descriptor |
| ATT | 属性读写协议 | ATT_Read_Request, ATT_Write_Response |
| L2CAP | 多路复用、分段重组 | L2CAP_Data_PDU, LE-CFC |
| HCI | 主机与控制器标准接口 | HCI_Command, HCI_Event, HCI_ACL |
| Link Layer | 状态机管理、加密、连接控制 | LL_Data_PDU, LL_Control_PDU |
| PHY | 射频收发、调制解调 | Radio Packet |
2. 物理层与链路层PDU格式
2.1 物理层空口数据包格式(LE 1M PHY)
┌──────────┬────────────┬───────────────┬──────────┬──────────────┬────────────┐ │ Preamble │ Access │ PDU │ CRC │ CTE │ Trailer │ │ (1 byte) │ Address │ (2-258 bytes)│ (3 bytes)│ (Optional) │ (Optional) │ │ │ (4 bytes) │ │ │ │ │ └──────────┴────────────┴───────────────┴──────────┴──────────────┴────────────┘Preamble(前导码) - 1 Byte
| 字节值 | 含义 | 说明 |
|---|---|---|
| 0xAA | LE 1M PHY | Access Address[0] = 0, 使用 01010101b |
| 0x55 | LE 1M PHY | Access Address[0] = 1, 使用 10101010b |
| 0xAA | LE Coded PHY S2/S8 | 重复前导,用于前向纠错 |
Bit级解析:
Preamble = 0x55 (10101010b): Bit[7:0] = 10101010 ├── Bit[7] = 1 → 交替模式,用于频率同步 ├── Bit[6] = 0 ├── Bit[5] = 1 ├── Bit[4] = 0 ├── Bit[3] = 1 ├── Bit[2] = 0 ├── Bit[1] = 1 └── Bit[0] = 0 用途: 提供频率同步和自动增益控制(AGC)训练Access Address(接入地址) - 4 Bytes
┌────────────────────────────────────────────────────────────────────┐ │ Access Address (32 bits) │ ├────────────────────────────────────────────────────────────────────┤ │ Byte[3] │ Byte[2] │ Byte[1] │ Byte[0] │ ├───────────┼───────────┼───────────┼────────────────────────────────┤ │ 0x8E/0x89 │ 0xBE/0x89 │ 0xD6/0x6D │ 0x00/0xAF │ └───────────┴───────────┴───────────┴────────────────────────────────┘ 广播信道固定地址: 0x8E89BED6 (大端序) 连接信道随机地址: 例如 0x00D68E89 (由Master在CONNECT_IND中生成) Bit级约束: - Bit[31:24] ≠ 0x00, 0x55, 0xAA, 0x6B, 0x7E, 0x99, 0xAA, 0xB5, 0xD6, 0xE7, 0xF8 - 不能包含6个连续的0或1 - 不能出现4个重复的nibble - 必须与广播地址(0x8E89BED6)海明距离 > 1广播信道Access Address = 0x8E89BED6(hex展开):
地址字节序 (小端传输): D6 BE 89 8E 地址字节序 (大端表示): 8E 89 BE D6 Bit展开: Byte[3] = 0x8E = 1000 1110b Bit[31:28] = 1000 = 0x8 Bit[27:24] = 1110 = 0xE Byte[2] = 0x89 = 1000 1001b Bit[23:20] = 1000 = 0x8 Bit[19:16] = 1001 = 0x9 Byte[1] = 0xBE = 1011 1110b Bit[15:12] = 1011 = 0xB Bit[11:8] = 1110 = 0xE Byte[0] = 0xD6 = 1101 0110b Bit[7:4] = 1101 = 0xD Bit[3:0] = 0110 = 0x6 校验属性: - 不符合连续6个相同bit规则 ✓ - 海明距离(0x55555555) = 17 > 1 ✓ - 海明距离(0xAAAAAAAA) = 14 > 1 ✓CRC(循环冗余校验) - 3 Bytes
CRC多项式: x^24 + x^10 + x^9 + x^6 + x^4 + x^3 + x + 1 CRC初始值(广播): 0x555555 CRC初始值(数据): 由Channel Map计算得出2.2 链路层PDU通用格式
链路层PDU根据信道类型分为两大类:
- 广播信道PDU(Advertising Channel PDU): 用于广播、扫描、发起连接
- 数据信道PDU(Data Channel PDU): 用于连接建立后的数据和控制
通用链路层PDU格式: ┌────────────────────────────────────────────────────────────────────┐ │ Link Layer PDU │ ├────────────────────────────────────────────────────────────────────┤ │ Header (2 bytes) │ Payload (0-255 bytes) │ MIC (0/4 bytes) │ └────────────────────────────────────────────────────────────────────┘2.2.1 广播信道PDU Header - 16 bits
┌────────────────────────────────────────────────────────────────────┐ │ Advertising Channel PDU Header │ ├──────────┬──────────────┬───────────────┬──────────────────────────┤ │ PDU Type │ RFU (ChSel) │ TxAdd │ RxAdd │ │ (4 bits) │ (1 bit) │ (1 bit) │ (1 bit) │ ├──────────┼──────────────┼───────────────┼──────────────────────────┤ │ Length │ RFU │ │ │ (8 bits) │ (8 bits) │ │ └──────────┴──────────────┴──────────────────────────────────────────────┘ 完整16-bit Header布局: Bit[15:12] = PDU Type Bit[11] = ChSel (通道选择算法 #2 指示, BLE 5.0+) Bit[10] = TxAdd (发送地址类型: 0=Public, 1=Random) Bit[9] = RxAdd (接收地址类型: 0=Public, 1=Random) Bit[8] = RFU (Reserved for Future Use) Bit[7:0] = Length (Payload长度, 单位: bytes) 注意: BLE 5.0扩展广播中,Header最高字节定义有变化,Length扩展为8bitsPDU Type编码 (Bit[15:12]):
| 值 (hex/bin) | PDU类型 | 描述 | 方向 |
|---|---|---|---|
| 0x0 (0000b) | ADV_IND | 可连接可扫描非定向广播 | Slave → 所有设备 |
| 0x1 (0001b) | ADV_DIRECT_IND | 可连接定向广播 | Slave → 特定Master |
| 0x2 (0010b) | ADV_NONCONN_IND | 不可连接不可扫描广播 | Slave → 所有设备 |
| 0x3 (0011b) | SCAN_REQ | 扫描请求 | Master → Slave |
| 0x4 (0100b) | AUX_SCAN_REQ | 辅助扫描请求 (BLE 5.0+) | Master → Slave |
| 0x5 (0101b) | SCAN_RSP | 扫描响应 | Slave → Master |
| 0x6 (0110b) | CONNECT_IND | 连接请求 | Master → Slave |
| 0x7 (0111b) | AUX_CONNECT_REQ | 辅助连接请求 (BLE 5.0+) | Master → Slave |
| 0x8 (1000b) | ADV_SCAN_IND | 可扫描非连接广播 | Slave → 所有设备 |
| 0x9-A (1001-1010b) | ADV_EXT_IND / AUX_ADV_IND | 扩展广播指示 | BLE 5.0 |
| 0xB-D (1011-1101b) | AUX_SYNC_IND / AUX_CHAIN_IND / AUX_CONNECT_RSP | 辅助广播 | BLE 5.0 |
| 0xE-F (1110-1111b) | Reserved | 保留 | - |
2.2.2 数据信道PDU Header - 16 bits (LE 4.0-4.1)
数据信道PDU (Data Channel PDU) 包含两种类型: 1. LL Data PDU - 传输上层数据(L2CAP) 2. LL Control PDU - 传输链路层控制命令 ┌────────────────────────────────────────────────────────────────────┐ │ Data Channel PDU Header (16 bits) │ ├──────────┬──────────┬───────────────┬──────────────────────────────┤ │ LLID │ NESN │ SN │ MD │ │ (2 bits) │ (1 bit) │ (1 bit) │ (1 bit) │ ├──────────┼──────────┼───────────────┼──────────────────────────────┤ │ CP │ RFU │ Length │ │ │ (1 bit) │ (3 bits) │ (8