ESP-BLE-MESH:如何从单颗 BLE 设备到完整 Mesh 组网——能力、源码与示例的完整指南
【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf
组件定位与本文范围
ESP-BLE-MESH 是 ESP-IDF 内置的蓝牙 Mesh 协议栈组件,面向多节点组网与低功耗 BLE 设备开发者。本文回答一个问题:每项 Mesh 能力对应哪个源码文件、哪个可运行示例。
能力地图:按开发者心智分组的完整清单
按"入网与密钥安全 / 组网与消息可达 / 低功耗与代理接入 / 节点管理与升级"四个开发者最常关心的问题分组,能力与源码的对应关系如下:
| 分组 | 能力 | 一句话说明(解决什么问题) | 源码位置 | 相关示例 |
|---|---|---|---|---|
| 入网与密钥安全 | 标准配网(PB-ADV / PB-GATT / PB-Remote) | 让未配网设备(Unprovisioned Device)安全入网;三种承载分别为广播信道、GATT 连接、已入网节点中继 | core/ 的 prov_node.c、prov_pvnr.c、prov_common.c | provisioner |
| 入网与密钥安全 | OOB 带外认证 | 入网时防中间人攻击,可选 No / Static / Output / Input OOB | 同上 | 同上 |
| 入网与密钥安全 | 基于证书的配网 | 需要强身份验证场景的证书级校验 | 同上 | 同上 |
| 入网与密钥安全 | 快速配网 | 60 秒内批量配网多达 100 台设备 | core/fast_prov.c | fast_provisioning |
| 入网与密钥安全 | 远程配网(Mesh v1.1) | 已入网节点替远处的未配网设备完成入网 | v1.1/ 的 esp_ble_mesh_rpr_model_api.c | remote_provisioning |
| 入网与密钥安全 | Key Refresh 密钥刷新 | 网络疑似被入侵后整体更换 NetKey(网络密钥) | core/ 的 prov_pvnr.c、cfg_cli.c | provisioner |
| 入网与密钥安全 | IV Index 更新 | 加密计数器随网络运行递增,保证长期唯一性并防重放 | core/ 的 net.c、beacon.c | 同上 |
| 组网与消息可达 | Relay 中继 | 每个节点替别的节点转发 PDU,让消息多跳跨越无线覆盖盲区 | core/net.c、core/transport.c | onoff_models |
| 组网与消息可达 | SAR 分段与重组 | 长消息超过单包 MTU 时切段传输、对端重组 | core/net.c | onoff_models |
| 组网与消息可达 | Directed Forwarding 定向转发(v1.1) | 仅路径上的节点转发定向消息,其余节点不处理 | v1.1/ 的 esp_ble_mesh_df_model_api.c | directed_forwarding |
| 组网与消息可达 | Subnet Bridge 子网桥(v1.1) | 跨子网转发消息 | v1.1/ 的 esp_ble_mesh_brc_model_api.c | —(经 v1.1 API 调用) |
| 组网与消息可达 | Wi-Fi 共存 | 同一射频上 Wi-Fi 与 Mesh 分时共享 | esp_coex 配合 core/ | wifi_coexist |
| 低功耗与代理接入 | Friend 好友节点 | 替低功耗节点缓存消息,节点醒着时再取走 | core/friend.c | onoff_models |
| 低功耗与代理接入 | LPN 低功耗节点 | 周期性休眠,经 Friend 收发消息,省电台时间 | core/lpn.c | onoff_models |
| 低功耗与代理接入 | Proxy Server / Client | 只会 BLE GATT、不懂 Mesh 广播的设备经连接接入网络 | core/ 的 proxy_server.c、proxy_client.c | provisioner(手机应用经 Proxy 连接节点) |
| 低功耗与代理接入 | Private Beacon 私有信标(v1.1) | 随机化信标内容,降低被被动跟踪的可能 | v1.1/ 的 esp_ble_mesh_prb_model_api.c | —(经 v1.1 API 调用) |
| 低功耗与代理接入 | On-Demand Private Proxy(v1.1) | 按需建立的私有代理链路 | v1.1/ 的 esp_ble_mesh_odp_model_api.c | —(经 v1.1 API 调用) |
| 节点管理与升级 | Configuration Server / Client | 管理模型订阅/发布、AppKey 与 NetKey 绑定 | core/ 的 cfg_srv.c、cfg_cli.c | onoff_models、provisioner |
| 节点管理与升级 | Health Server / Client | 设备健康状态上报与查询 | core/ 的 health_srv.c、health_cli.c | —(经 API 调用) |
| 节点管理与升级 | NVS 持久化 | 配网信息与配置写入 NVS,重启后免配网恢复 | core/storage/ 的 settings_nvs.c | onoff_models |
| 节点管理与升级 | Firmware Update(v1.1,Preview) | 经 Mesh 网络升级节点固件 | v1.1/dfu/ 的 dfu_cli.c、dfu_srv.c、dfu_metadata.c | —(预览能力,无官方示例) |
| 节点管理与升级 | Firmware Distribution / MBT(v1.1,Preview) | 固件经多个节点接力分发,单节点带宽不足也能传完 | v1.1/dfu/ 的 dfd_cli.c、dfd_srv.c;v1.1/mbt/ 的 blob_cli.c、blob_srv.c | —(预览能力,无官方示例) |
注:标 "—" 的能力在 examples/bluetooth/esp_ble_mesh/ 中没有独立示例工程,验证方式是对应 API 头文件(api/core/ 与 v1.1/api/)。
高频能力拆解
设备入网(Provisioning):从广播发现到密钥写入
问题场景:新设备手里没有任何密钥,如何证明身份并入网;Provisioner(把未入网设备配入 Mesh 网络的节点)如何防止中间人把伪造节点塞进网络。
原理:入网走三种承载之一——广播信道(PB-ADV)、GATT 连接(PB-GATT)或经已入网节点中继(PB-Remote);过程中双方做身份互验,可按需启用 OOB 带外认证或基于证书的配网。成功后节点拿到 NetKey、单播地址等全部密钥,并写入 NVS 持久化。
源码:节点侧 prov_node.c,Provisioner 侧 prov_pvnr.c,公共逻辑 prov_common.c,Provisioner 管理 pvnr_mgmt.c;远程配网模型见 esp_ble_mesh_rpr_model_api.c。
验证:烧录 onoff_server 与 provisioner,用手机上的第三方 Mesh 应用经 Proxy 连接节点,依次执行 Identify(标识目标设备)与 Provision(配网)。现象:应用展示节点初始组配置数据(Composition Data),串口打印配网成功;断电重启后节点仍保持入网状态,无需再次配网。
消息传输与密钥维护:Relay、SAR 与 Key Refresh / IV Update
问题场景:两个节点不在彼此无线电直连范围内,消息如何到达;一条长消息超过单包 MTU 如何传完;网络长期运行后密钥如何轮换、如何抵抗重放。
原理:Relay 让入网节点为其他节点转发 PDU,消息因此可以多跳;SAR(Segmentation and Reassembly,分段与重组)把长消息切成多个分段、由对端重组;Key Refresh 由 Provisioner 向全网分发新 NetKey;IV Index 周期性递增,维持网络加密的唯一性。
源码:net.c 负责 Relay 与 SAR,transport.c 处理传输层分段,prov_pvnr.c 与 cfg_cli.c 承载密钥刷新与 IV 更新的触发,beacon.c 维护 IV Index 相关的 Beacon 信息。
验证:在 onoff_models 中让两个节点超出直连距离并开启 Relay,消息仍可达;用 provisioner(内含 Configuration Client)发起密钥刷新后,全节点在新旧 NetKey 切换过程中保持正常收发。
BLE 设备接入与低功耗:Proxy、Friend 与 LPN
问题场景:手机只有 BLE GATT 能力、不解析 Mesh 广播,如何参与网络;电池供电的传感器不可能全天候监听信道。
原理:Proxy Server 在节点上开放 GATT 通道,Proxy Client(如手机)经连接收发消息,不依赖广播信道;Friend 节点为名下 LPN(Low Power Node,低功耗节点)缓存消息,LPN 周期性唤醒从 Friend 取消息后继续休眠。
源码:proxy_server.c、proxy_client.c、friend.c、lpn.c;低功耗 API 入口在 esp_ble_mesh_low_power_api.c。
验证:provisioner 示例中手机经 Proxy 连接节点后直接下发指令,串口可见消息处理日志;节点侧在工程配置中开启 LPN 选项后,日志呈周期性 Poll 取消息行为,其余时间保持休眠。
Client/Server 模型全景:标准模型成对提供的能力矩阵
蓝牙 Mesh 的能力由 Model(模型)承载,每个模型按 Client / Server 成对提供:Client 发起操作,Server 持有状态并响应。ESP-BLE-MESH 的标准模型实现位于 models/client/ 与 models/server/,API 入口在 api/models/。按功能域分组如下:
| 功能域 | 模型(Client / Server) | 一句话用途 | 源码位置 | 相关示例 |
|---|---|---|---|---|
| Generic | OnOff、Level、Default Transition Time | 开关、等级值、全局过渡时间的设置与读取 | generic_client.c、generic_server.c | onoff_models |
| Generic | Power OnOff(含 Setup)、Power Level(含 Setup) | 上电开关状态与功率等级 | 同上 | — |
| Generic | Battery、Location(Location 含 Setup) | 电量读取、物理位置读写 | 同上 | — |
| Generic | Property Client;User / Admin / Manufacturer Property Server | 设备属性读写 | models/server/ 的 generic_server.c | — |
| Lighting | Light Lightness(含 Setup) | 绝对亮度调节 | lighting_client.c、lighting_server.c | — |
| Lighting | Light CTL、Light CTL Temperature(含 Setup) | 色温调节 | 同上 | — |
| Lighting | Light HSL、Hue、Saturation(含 Setup) | HSL 色彩空间调节 | 同上 | — |
| Lighting | Light xyL(含 Setup) | CIE 1931 色坐标与亮度 | 同上 | — |
| Lighting | Light LC(含 Setup) | 逻辑级别到物理级别映射 | 同上 | — |
| Sensor | Sensor Client;Sensor、Sensor Setup Server | 传感器数据订阅与属性配置 | sensor_client.c、sensor_server.c | sensor_models |
| Time and Scenes | Time、Scene、Scheduler(Server 侧各含 Setup) | 时间同步、场景切换与定时任务 | time_scene_client.c、time_scene_server.c | — |
两个配套机制:state_binding.c 做状态绑定,让多个模型共享同一份状态并同步变化(例如 Light Lightness 与 Generic Level 联动);state_transition.c 做状态迁移,在过渡时间内对目标值平滑插值,输出渐变而非跳变。
Foundation Models(系统级模型)
Foundation 模型负责网络管理与设备配置,同样按 Client / Server 成对提供。其中 Configuration Server 的上层消息使用 DevKey 加密而非 AppKey,配网完成后无需再为其绑定 AppKey。
| 能力 | 一句话用途 | 源码位置 | 相关示例 |
|---|---|---|---|
| Configuration Server / Client | 模型订阅/发布、AppKey 与 NetKey 管理 | core/ 的 cfg_srv.c、cfg_cli.c | onoff_models、provisioner |
| Health Server / Client | 健康状态上报与查询 | core/ 的 health_srv.c、health_cli.c | — |
| Remote Provisioning Server / Client | 远程入网(Mesh v1.1) | v1.1/ 的 esp_ble_mesh_rpr_model_api.c | remote_provisioning(rpr_client / rpr_server / unprov_dev 三角色) |
| Directed Forwarding Config Server / Client | 配置定向转发(v1.1) | v1.1/ 的 esp_ble_mesh_df_model_api.c | directed_forwarding |
| Bridge Config Server / Client | 子网桥接配置(v1.1) | v1.1/ 的 esp_ble_mesh_brc_model_api.c | — |
| Private Beacon Server / Client | 私有信标配置(v1.1) | v1.1/ 的 esp_ble_mesh_prb_model_api.c | — |
| On-Demand Private Proxy Server / Client | 按需私有代理(v1.1) | v1.1/ 的 esp_ble_mesh_odp_model_api.c | — |
| SAR Config Server / Client | 分段重组参数配置(v1.1) | v1.1/ 的 esp_ble_mesh_sar_model_api.c | — |
| Solicitation PDU RPL Config Server / Client | 请求 PDU 重放保护列表配置(v1 |
【免费下载链接】esp-idfEspressif IoT Development Framework. Official development framework for Espressif SoCs.项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考