Skip to content

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();
}

褚成志的笔记