硬件编程
硬件编程

ESP32 蓝牙 Mesh 组网实战:从零搭建智能家居设备网络

2026-06-02 Tuesday

背景:为什么需要蓝牙 Mesh

智能家居场景下,WiFi 设备数量一多就容易堵塞路由器。蓝牙 Mesh 解决了这个问题——每个节点既是终端又是中继,网络自组织、自修复。

本文用两块 ESP32 开发板搭建最小 Mesh 网络:一个手机网关 + 一个温湿度传感器节点。

硬件准备

组件数量说明
ESP32 开发板2Node32s 或任意型号
DHT22 温湿度传感器1传感器节点用
面包板 + 跳线若干

接线(传感器端):

左排第1脚 VCC  → 红线 → DHT22 pin 1 (VCC)
左排第2脚 GND  → 黑线 → DHT22 pin 4 (GND)
左排第3脚 D4   → 黄线 → DHT22 pin 2 (DATA)

软件架构

┌─────────────┐     Bluetooth Mesh     ┌──────────────────┐
│  手机 App    │ ◄──────────────────► │  ESP32 网关节点    │
│ (nRF Mesh)  │                       │  (provisioner)    │
└─────────────┘                       └────────┬─────────┘
                                               │ Mesh Network
                                     ┌─────────▼──────────┐
                                     │  ESP32 传感器节点   │
                                     │  DHT22 → 温度+湿度   │
                                     └────────────────────┘

代码实现

传感器节点(sensor_node.ino)

#include <NimBLEDevice.h>
#include <DHT.h>

#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

// Mesh 模型定义
#define SENSOR_MODEL_ID 0x0001

void setup() {
  Serial.begin(115200);
  dht.begin();
  
  NimBLEDevice::init("ESP32-Sensor");
  NimBLEServer *pServer = NimBLEDevice::createServer();
  
  // 创建 Mesh 服务
  NimBLEService *pService = pServer->createService("1820");
  NimBLECharacteristic *pChar = pService->createCharacteristic(
    "2A6E", NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY
  );
  
  pService->start();
  NimBLEAdvertising *pAdv = NimBLEDevice::getAdvertising();
  pAdv->start();
}

void loop() {
  float temp = dht.readTemperature();
  float hum = dht.readHumidity();
  
  if (!isnan(temp) && !isnan(hum)) {
    String payload = "{\"temp\":" + String(temp) + 
                     ",\"hum\":" + String(hum) + "}";
    pCharacteristic->setValue(payload.c_str());
    pCharacteristic->notify();
  }
  delay(5000); // 5秒上报一次
}

网关节点配置

网关节点通过 nRF Mesh App(iOS/Android 均有)进行 Provisioning

  1. 打开 nRF Mesh → 扫描设备 → 找到 “ESP32-Sensor”
  2. 点击 Provision → 自动分配 Unicast Address
  3. 绑定 Sensor Model → 订阅 Group Address 0xC000
  4. 手机即可收到每 5 秒推送的温湿度数据

低功耗优化

ESP32 在 Mesh 网络中持续广播,功耗较高。电池供电场景下的优化策略:

// 进入 Light Sleep 模式,Mesh 消息由 ULP 协处理器监听
esp_sleep_enable_timer_wakeup(5 * 1000000); // 5s 唤醒
esp_light_sleep_start();
模式电流适用场景
Active Mesh~80mAUSB 供电
Light Sleep + Mesh~5mA锂电池(7天续航)
Deep Sleep + 定时唤醒~50μA纽扣电池(1年+)

常见坑

  1. Provisioning 失败:检查 ESP32 分区表,BLE Mesh 需要至少 1.5MB app 分区
  2. 通信距离短:Mesh 实测室内穿墙 2-3 堵,节点间距不超过 15 米
  3. NimBLE 初始化卡死NimBLEDevice::init() 前确保 WiFi 已关闭(WiFi.mode(WIFI_OFF)
  4. Mesh 消息丢失:默认 TTL=3,多层中继时需在 Model 配置里调高 publishTTL

总结

蓝牙 Mesh 让 ESP32 从单点设备升级为自组织网络的一员。配合 DHT22 传感器,一个支持 nRF Mesh 的手机网关就能接入数十个低功耗节点,无需路由器、无需中心网关——这正是智能家居理想的边缘计算架构。

粤ICP备2026055292号-1