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/DescriptorATT属性读写协议ATT_Read_Request, ATT_Write_ResponseL2CAP多路复用、分段重组L2CAP_Data_PDU, LE-CFCHCI主机与控制器标准接口HCI_Command, HCI_Event, HCI_ACLLink Layer状态机管理、加密、连接控制LL_Data_PDU, LL_Control_PDUPHY射频收发、调制解调Radio Packet2. 物理层与链路层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字节值含义说明0xAALE 1M PHYAccess Address[0] = 0, 使用 01010101b0x55LE 1M PHYAccess Address[0] = 1, 使用 10101010b0xAALE 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 BytesCRC多项式: 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 → 特定Master0x2 (0010b)ADV_NONCONN_IND不可连接不可扫描广播Slave → 所有设备0x3 (0011b)SCAN_REQ扫描请求Master → Slave0x4 (0100b)AUX_SCAN_REQ辅助扫描请求 (BLE 5.0+)Master → Slave0x5 (0101b)SCAN_RSP扫描响应Slave → Master0x6 (0110b)CONNECT_IND连接请求Master → Slave0x7 (0111b)AUX_CONNECT_REQ辅助连接请求 (BLE 5.0+)Master → Slave0x8 (1000b)ADV_SCAN_IND可扫描非连接广播Slave → 所有设备0x9-A (1001-1010b)ADV_EXT_IND / AUX_ADV_IND扩展广播指示BLE 5.00xB-D (1011-1101b)AUX_SYNC_IND / AUX_CHAIN_IND / AUX_CONNECT_RSP辅助广播BLE 5.00xE-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