ESP32 蓝牙 Mesh 组网实战:从零搭建智能家居设备网络
2026-06-02 Tuesday
背景:为什么需要蓝牙 Mesh
智能家居场景下,WiFi 设备数量一多就容易堵塞路由器。蓝牙 Mesh 解决了这个问题——每个节点既是终端又是中继,网络自组织、自修复。
本文用两块 ESP32 开发板搭建最小 Mesh 网络:一个手机网关 + 一个温湿度传感器节点。
硬件准备
| 组件 | 数量 | 说明 |
|---|---|---|
| ESP32 开发板 | 2 | Node32s 或任意型号 |
| 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:
- 打开 nRF Mesh → 扫描设备 → 找到 “ESP32-Sensor”
- 点击 Provision → 自动分配 Unicast Address
- 绑定 Sensor Model → 订阅 Group Address
0xC000 - 手机即可收到每 5 秒推送的温湿度数据
低功耗优化
ESP32 在 Mesh 网络中持续广播,功耗较高。电池供电场景下的优化策略:
// 进入 Light Sleep 模式,Mesh 消息由 ULP 协处理器监听
esp_sleep_enable_timer_wakeup(5 * 1000000); // 5s 唤醒
esp_light_sleep_start();
| 模式 | 电流 | 适用场景 |
|---|---|---|
| Active Mesh | ~80mA | USB 供电 |
| Light Sleep + Mesh | ~5mA | 锂电池(7天续航) |
| Deep Sleep + 定时唤醒 | ~50μA | 纽扣电池(1年+) |
常见坑
- Provisioning 失败:检查 ESP32 分区表,BLE Mesh 需要至少 1.5MB app 分区
- 通信距离短:Mesh 实测室内穿墙 2-3 堵,节点间距不超过 15 米
- NimBLE 初始化卡死:
NimBLEDevice::init()前确保 WiFi 已关闭(WiFi.mode(WIFI_OFF)) - Mesh 消息丢失:默认 TTL=3,多层中继时需在 Model 配置里调高
publishTTL
总结
蓝牙 Mesh 让 ESP32 从单点设备升级为自组织网络的一员。配合 DHT22 传感器,一个支持 nRF Mesh 的手机网关就能接入数十个低功耗节点,无需路由器、无需中心网关——这正是智能家居理想的边缘计算架构。