前言
物联网开发里,组网和通信 一直是个很绕的事。用 Wi-Fi 各自连路由器吧,配置麻烦,离开 Wi-Fi 就断了;用蓝牙 mesh 吧,带宽又太小。而 ESP32 的 ESP-Mesh 提供了一种中间解------节点之间可以自动组网、自动修复,还能通过一个"根节点"连接外网。
这篇文章,我们就来聊一个 ESP-IDF 自带的例子:Mesh IP Internal Networking example。它展示了怎么在 mesh 网络里让每个节点拥有 IP 地址,并通过 MQTT 来和云端通信,同时还支持节点之间通过底层接口通信。
我们为什么要搞这个?
在实际项目中,比如下面几种情况,我们会遇到这些麻烦:
-
"我希望节点之间可以直接通信,不靠云。"
比如一个节点检测到烟雾,立刻广播给所有其他节点,而不是上传服务器再转发,省时又稳定。
-
"但我又想接入云端,统一做控制和查看。"
管理员想在手机上收到通知,也要通过 MQTT 发消息给整个网络。
-
"我不想手动配每个节点的 IP。"
一旦节点多起来,靠 DHCP 自动发 IP 最省心。
ESP-Mesh 的这个例子,其实就是解决上面这些问题的:内部 mesh 通信 + 外部 MQTT 消息推送,两手都要抓。
这个例子到底干了啥?
这个例子主要实现了这么几件事:
1. 所有节点都能获取 IP 地址
整个 mesh 网络的根节点会启用一个 DHCP 服务,给每个子节点分发一个 IP。这样一来,不只是节点之间能互相识别,连 MQTT 这类基于 IP 的通信也能跑起来。
2. 引入了 NAT 功能,实现内外地址转换
ESP-IDF 里目前提供了一个实验性的 NAT 功能,它能让子节点通过根节点访问外部网络,同时隐藏内部 IP 结构,跟家用路由器差不多一个逻辑。
3. 两种通信方式并存
节点之间用的是:
- 低层 mesh send/recv 接口:速度快,适合本地通信
- 高层 MQTT:适合接入云平台,手机 app 收消息就靠这个
比如一个节点检测到按钮按下,会:
- 通过 mesh_send() 广播这个事件给其他节点
- 同时通过 MQTT 发布一个消息,比如
/topic/ip_mesh/key_pressed
4. 路由表同步:谁在线,一目了然
根节点会定期将网络中的所有在线节点地址(路由表)广播出去,所有节点都能知道自己邻居是谁,方便管理和优化路径。
实际跑起来是个啥样?
你可以用几块 ESP32 板子(任意型号基本都支持),编译好这个示例,然后烧进去。每个节点启动后,会自动连接组网,获取 IP,然后连接 MQTT Broker。
串口输出里,你会看到这些典型日志:
text
I mesh_main: <IP_EVENT_STA_GOT_IP>IP:10.0.0.3
I mesh_main: Tried to publish layer:2 IP:10.0.0.3
I mesh_mqtt: MQTT_EVENT_CONNECTED
...
W mesh_main: Key pressed!
I mesh_main: Sending to [0] xx:xx:xx:xx:xx:xx: sent with err code: 0
I mesh_mqtt: MQTT_EVENT_PUBLISHED
代表这个节点已经获取 IP,连上 MQTT,收发消息都 OK。
如下图:

能用在哪些场景?
这个模式其实在很多场景下都挺实用的,比如:
- 智能农业:温湿度节点之间相互协调,同时把采集的数据上传云平台
- 楼宇安防系统:一旦某个节点报警,快速通知其他节点,同时通知服务器
- 分布式开关控制:按钮在哪按都行,整个网都能知道状态
- 应急救援 mesh 网络:临时部署多个节点自组网,公网不稳定也能内部通信
怎么快速上手这个示例?
简单列下步骤:
- 打开示例工程,执行
idf.py menuconfig
,配置:- mesh channel
- 路由器 SSID / 密码
- MQTT broker 地址
如下图:

- 编译并烧录到几块板子上:
bash
idf.py -p PORT flash monitor

- 串口看到日志,确认每个节点都连上 MQTT 并获取 IP。
- 按下按钮或者通过串口触发事件,看看是不是同时通过 MQTT 和 mesh 广播出去了。
一些注意点
- 这个例子不支持 IPv6-only 网络,用的是 IPv4 NAT。
- NAT 功能是实验性质,所以别拿它做正式产品的唯一依赖。
- 所有节点都要烧录相同程序,并配置 mesh 参数,否则组网失败。
最后总结一下
这个例子其实就是在探索**"如何让 mesh 网络既有本地快速通信能力,又能方便地接入云平台"**这个场景的最佳实践。
它做到了两点:
- 每个节点都是智能节点,能发 IP 消息,也能发低层广播
- 只要根节点在线,整个网络就可以和外界保持联系
如果你正在开发一个需要"节点互联 + 云端控制"的系统,这个例子可以作为非常好的参考起点。