Mesh 承载层
核心概念
BLE Mesh 不直接使用 BLE 的连接态,而是基于广播态进行通信。承载层(Bearer)定义了 Mesh 消息如何在 BLE 传输层上发送和接收。
两种承载方式
1. ADV Bearer(广播承载)
Mesh 消息 → Network PDU → ADV Bearer → 广播信道 (37/38/39) 或扩展广播信道- 使用 BLE 广播信道传输 Mesh 数据
- 不需要建立连接
- 所有 Mesh 消息都通过广播发送
- 支持传统广播(ADV_NONCONN_IND)和扩展广播(ADV_EXT_IND)
ADV Bearer 广播数据格式
AD Structure: ┌──────────────┬──────────────────────────┐ │ Length: 1B │ AD Type: 0x29/0x2A/0x2B │ │ │ AD Data: Mesh PDU │ └──────────────┴──────────────────────────┘AD Type 值:
| AD Type | 名称 | 用途 |
|---|---|---|
0x29 | Mesh Provisioning PDU | 配网协议数据单元(PB-ADV) |
0x2A | Mesh Message | Mesh 普通消息(Network PDU) |
0x2B | Mesh Beacon | Mesh 网络 Beacon 心跳包 |
标准 GAP AD Type(Flags
0x01、UUID0x03、Service Data0x16等)见 week105_AD结构与广播数据.md。
三类 AD Type 作用说明:
按 Mesh 节点生命周期,三种 AD Type 分工如下:
未配网阶段 配网进行中 已配网运行阶段 │ │ │ ▼ ▼ ▼ 0x2B Beacon 0x29 Provisioning 0x2A Message (Unprovisioned) (PB-ADV 配网 PDU) (Network PDU) │ │ │ 0x2B Beacon │ (Secure Network) ▼ 分配 NetKey / 地址0x29— Mesh Provisioning PDU(配网协议数据单元)
使用场景:设备正在配网,Provisioner 与未配网节点通过PB-ADV广播交换配网数据。
主要作用:
- 建立 / 关闭 PB-ADV 配网链路(Link Open / Link Close)
- 交换配网能力(OOB 方式、元素数量等)
- ECDH 密钥交换与认证(Public Key、Confirm、Random)
- 下发NetKey、AppKey、Unicast Address等网络参数
特点:
- 仅在配网过程中使用,配网完成后不再发送
- 承载的是Provisioning PDU,不是 Network PDU
- 对应 GATT 配网走PB-GATT(Mesh Provisioning Service 0x1827),不走 0x29
典型场景:工厂新设备首次上电,Provisioner App 扫描发现后将其加入 Mesh 网络。
0x2A— Mesh Message(Network PDU,已配网业务消息)
使用场景:设备已配网,在 Mesh 网络中传输正常业务数据。这是 ADV Bearer 上最常用的 AD Type。
主要作用:
- 传输模型消息:Generic OnOff、Level、Lightness 等
- 传输配置消息:Composition Data、AppKey Add、Relay 设置等
- 支持多跳中继:节点收到后解密、TTL 减 1、再转发
- 手机经 Proxy 写入的 Mesh 消息,最终也会以 0x2A 在 ADV Bearer 上广播
特点:
- 只有已配网节点才会发送 / 接收
- 需要NetKey才能解密;普通手机能扫到 0x2A,但无法解析内容
- 承载经网络层加密 + 混淆后的 Network PDU
典型场景:开关发送 OnOff Set 控制灯;传感器上报状态;消息经 Relay 节点多跳转发。
0x2B— Mesh Beacon(网络 Beacon 心跳包)
使用场景:周期性广播,用于设备发现和网络状态同步,本身不承载业务控制数据。
0x2B 内部用第 1 字节Beacon Type区分两种子类型:
| Beacon Type | 名称 | 设备状态 | 作用 |
|---|---|---|---|
0x00 | Unprovisioned Device Beacon | 未配网 | 宣告「我是可配网设备」,携带 UUID、OOB Information |
0x01 | Secure Network Beacon | 已配网 | 同步 IV Index、Key Refresh 等网络状态,携带 Network ID、Flags |
Unprovisioned Device Beacon(Type=0x00)作用:
- 让 Provisioner发现附近未配网设备
- 提供 UUID 和 OOB 信息,供 Provisioner 决定配网方式
Secure Network Beacon(Type=0x01)作用:
- IV Index 同步,防止全网 IV 不一致导致解密失败
- Key Refresh 通知,NetKey 更新时通知全网节点
- 网络健康监测,节点通过 Beacon 判断子网是否活跃
典型场景:Provisioner 扫描 0x2B 发现新灯;已配网节点每约 10 秒发送 Secure Network Beacon 维持网络同步。
速记:
- 0x29= 配网专用(加入网络)
- 0x2A= 业务专用(已配网后的控制 / 数据)
- 0x2B= 心跳 / 宣告专用(未配网时被 discovery,已配网时同步网络状态)
BLE 5.x 扩展广播完整空口包格式
一、扩展广播整体物理层帧结构(所有扩展广播 PDU 通用)
所有 BLE 链路层数据包固定四层结构,扩展广播 / 传统广播物理层头部完全一致:
| 字段 | 长度 | 说明 |
|---|---|---|
| Preamble 前导码 | 1 字节 (1M PHY) / 2 字节 (2M PHY) | 01交替序列,射频同步、AGC 锁定 |
| Access Address 访问地址 | 4 字节 | 广播固定地址:0x8E89BED6 |
| LL PDU 链路层 PDU | 可变长度 | 核心扩展广播载荷(下文重点拆分) |
| CRC 校验 | 3 字节 | 24 位 CRC 校验,校验整个 PDU 载荷 |
扩展广播两大核心 PDU 分工(BLE Mesh 必用)
- ADV_EXT_IND:主信道(37/38/39 传统广播信道)发送,不携带用户 / Mesh 有效数据,只通过
AuxPtr指针告诉接收机:辅助包在哪条信道、何时接收、使用哪种 PHY; - AUX_ADV_IND:次信道(0~36 全部数据信道)发送,承载完整广播数据,BLE Mesh 网络层 PDU 就封装在这里,单包最大254 字节AD 数据;
超长报文可追加AUX_CHAIN_IND链式分包,单条广播事件最大可传输上千字节。
二、核心 PDU 详细载荷格式(CEAPF 通用扩展广播载荷格式)
所有扩展广播 PDU(ADV_EXT_IND/AUX_ADV_IND)共用一套Common Extended Advertising Payload Format,结构分为:
2 字节 LL Header + 扩展头标志 Flags + 可选扩展头字段 + 广播 AD 数据1. 链路层 LL Header(固定 2 字节,16 bit)
| Bit 域 | 位数 | 含义 |
|---|---|---|
| PDU Type | 4 bit | 0b0111= ADV_EXT_IND;0b1000= AUX_ADV_IND |
| RFU 保留 | 1 bit | 固定 0 |
| ChSel 信道选择 | 1 bit | 辅助信道跳频算法开关 |
| TxAdd 发送地址类型 | 1 bit | 0 = 公网地址,1 = 随机私有地址 |
| RxAdd 接收地址类型 | 1 bit | 0 = 公网地址,1 = 随机私有地址(定向广播使用) |
| Payload Length | 8 bit | 后面整个载荷字节长度(最大 255) |
2. 扩展头 Flags 标志位(1 字节)
决定后续哪些可选字段存在,Mesh 扩展广播固定开启:
- Bit 0:
AdvA Present广播者地址存在(必选) - Bit 1:
TargetA Present定向目标地址(Mesh 非定向广播关闭) - Bit 2:
AuxPtr Present辅助指针存在(ADV_EXT_IND 强制开启) - Bit 3:
ADI Present广播集信息 SID/DID(多广播集必开)
其余 CTE、SyncInfo、ACAD 字段 Mesh 场景基本不用。
3. 关键字段详解(Mesh 扩展广播高频使用)
(1)AdvA(6 字节)
48 位广播 MAC 地址,Mesh 节点随机私有地址居多。
(2)AuxPtr 辅助指针(ADV_EXT_IND 核心,3 字节)
决定接收机如何找到AUX_ADV_IND辅助包,5 个子字段:
| 子字段 | 位数 | 说明 |
|---|---|---|
| Channel Index | 6 bit | 0~36,辅助包使用的物理信道号 |
| CA 时钟精度 | 1 bit | 收发端晶振误差容错 |
| Offset Units | 1 bit | 时间单位,0 = 30 μs,1 = 300 μs |
| AUX Offset | 13 bit | 主包结束后延迟多少个单位再发辅助包 |
| AUX PHY | 3 bit | 000= 1M,001= 2M,010= Coded 远距离 PHY |
(3)ADI 广播数据信息(2 字节)
- SID(广播集 ID,4 bit):同一设备多组独立广播区分号,Mesh 独占 1 个 SID,可同时并行设备状态广播;
- DID(数据 ID,12 bit):广播内容版本号,用于接收机过滤重复广播包。
4. AUX_ADV_IND 有效载荷(AD Data 区域)
真正存放 BLE Mesh 上层数据的区域,格式遵循标准 BLE AD 结构:
[1 字节长度] + [1 字节 AD Type] + [N 字节 AD 数据]BLE Mesh 广播承载层 AD Type(同上表,详见上文「三类 AD Type 作用说明」):
| AD Type | 名称 | 用途 |
|---|---|---|
0x29 | Mesh Provisioning PDU | 配网协议数据单元 |
0x2A | Mesh Message | Mesh 普通消息(Network PDU) |
0x2B | Mesh Beacon | Mesh 网络 Beacon 心跳包 |
5. 传统广播 vs 扩展广播容量对比
| 特性 | 传统 Legacy 广播 | 扩展广播 AUX_ADV_IND |
|---|---|---|
| 最大 AD 数据 | 31 字节 | 254 字节 |
| Mesh 实际可用约 | 27 字节(扣除封装头) | 250 字节以上 |
| 是否需要协议层分片 | 长报文需要 | 单包可完整承载,无需分片重组 |
| 承载信道 | 37/38/39 | 0~36 数据信道 |
三、Mesh 扩展广播承载示意图
Primary Channel (37/38/39) ┌─────────────────────────────────────────┐ │ ADV_EXT_IND │ │ ┌────────────────────────────────────┐ │ │ │ LL Header │ │ │ │ PDU Type = ADV_EXT_IND (0x07) │ │ │ └────────────────────────────────────┘ │ │ ┌────────────────────────────────────┐ │ │ │ Extended Header │ │ │ │ - AdvA (6B) │ │ │ │ - AuxPtr ─────────────────────────┼─┼──┐ │ │ - ADI (2B) │ │ │ │ └────────────────────────────────────┘ │ │ │ AdvData (空或极少) │ │ └─────────────────────────────────────────┘ │ │ AuxPtr 指向 ▼ Secondary Channel (0~36) ┌─────────────────────────────────────────────┐ │ AUX_ADV_IND │ │ ┌────────────────────────────────────────┐ │ │ │ LL Header │ │ │ │ PDU Type = AUX_ADV_IND (0x08) │ │ │ └────────────────────────────────────────┘ │ │ ┌────────────────────────────────────────┐ │ │ │ Exten