BLE Mesh 组网方案
Bluetooth Mesh 标准
Bluetooth Mesh 是蓝牙技术联盟(SIG)于 2017 年发布的标准,基于 BLE 广播实现多跳网状网络。
核心特性
多对多通信:
传统 BLE:一对一(主从)
BLE Mesh:多对多(任意节点间通信)
消息传播:
Flooding(泛洪):消息向所有邻居广播
TTL 控制:防止消息无限传播(最大 127 跳)
安全性:
网络层加密:AES-128 CCM
应用层加密:独立密钥
重放攻击防护:序列号机制
低功耗支持:
Friend 节点:为低功耗节点缓存消息
低功耗节点:大部分时间睡眠,定期向 Friend 节点查询智能照明 Mesh 方案
系统架构
手机 App(配置和控制)
↓ BLE GATT(通过 Proxy 节点)
Proxy 节点(网关)
↓ BLE Mesh 广播
┌─────────────────────────────────────────┐
│ BLE Mesh 网络 │
│ [灯1] ←→ [灯2] ←→ [灯3] ←→ [灯4] │
│ ↕ ↕ ↕ ↕ │
│ [灯5] ←→ [灯6] ←→ [灯7] ←→ [灯8] │
│ │
│ [开关1] [开关2] [传感器1] │
└─────────────────────────────────────────┘节点配置(Provisioning)
配网流程:
1. 新设备广播 Unprovisioned Beacon
2. Provisioner(手机/网关)发现新设备
3. 建立安全通道(ECDH 密钥交换)
4. Provisioner 分配网络密钥、设备密钥、单播地址
5. 设备加入网络,开始正常通信
地址类型:
单播地址(0x0001-0x7FFF):每个节点唯一
组播地址(0xC000-0xFEFF):一组节点
广播地址(0xFFFF):所有节点发布/订阅模型
灯光控制示例:
开关节点:发布到组地址 0xC001("客厅灯组")
灯节点1:订阅 0xC001
灯节点2:订阅 0xC001
灯节点3:订阅 0xC001
按下开关 → 发布 Generic OnOff Set 到 0xC001
→ 所有订阅该地址的灯同时响应工业传感器 Mesh
大型仓库传感器网络
场景:10000m² 仓库,部署 200 个温湿度传感器
传统方案(Wi-Fi):
需要 20+ 个 Wi-Fi AP
每个 AP 成本约 2000 元
总成本:40,000+ 元
BLE Mesh 方案:
传感器节点:200 个(每个约 100 元)
网关节点:2-3 个(每个约 500 元)
总成本:21,500 元
节省:约 50%
优势:
- 成本低
- 部署灵活(无需布线)
- 自愈网络(节点故障自动绕路)传感器节点实现
c
// nRF52840 BLE Mesh 传感器节点(使用 nRF5 SDK)
#include "nrf_mesh.h"
#include "generic_sensor_server.h"
#include "app_timer.h"
// 传感器数据
typedef struct {
int16_t temperature; // 0.01°C 分辨率
uint16_t humidity; // 0.01% 分辨率
} SensorData;
// 传感器服务器实例
static generic_sensor_server_t sensor_server;
// 读取传感器数据
static void read_sensor(SensorData *data) {
// 读取 SHT31 传感器
float temp, hum;
sht31_read(&temp, &hum);
data->temperature = (int16_t)(temp * 100);
data->humidity = (uint16_t)(hum * 100);
}
// 定时发布传感器数据
static void sensor_publish_timer_handler(void *p_context) {
SensorData data;
read_sensor(&data);
// 发布到 Mesh 网络
generic_sensor_server_status_publish(&sensor_server,
(uint8_t *)&data,
sizeof(data));
}
// 初始化
void sensor_node_init(void) {
// 初始化 BLE Mesh
nrf_mesh_init_params_t init_params = NRF_MESH_INIT_PARAMS_DEFAULT;
nrf_mesh_init(&init_params);
// 注册传感器服务器
generic_sensor_server_init(&sensor_server, 0);
// 启动定时发布(每60秒)
app_timer_create(&sensor_timer, APP_TIMER_MODE_REPEATED,
sensor_publish_timer_handler);
app_timer_start(sensor_timer, APP_TIMER_TICKS(60000), NULL);
// 启动 Mesh
nrf_mesh_enable();
}