打造智能物联网骨干网:ESP-Mesh + MQTT 真正实现本地通信 + 云端推送!

发布于:2025-04-08 ⋅ 阅读:(41) ⋅ 点赞:(0)

在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


前言

物联网开发里,组网和通信一直是个很绕的事。用 Wi-Fi 各自连路由器吧,配置麻烦,离开 Wi-Fi 就断了;用蓝牙 mesh 吧,带宽又太小。而 ESP32 的 ESP-Mesh 提供了一种中间解——节点之间可以自动组网、自动修复,还能通过一个“根节点”连接外网。

这篇文章,我们就来聊一个 ESP-IDF 自带的例子:Mesh IP Internal Networking example。它展示了怎么在 mesh 网络里让每个节点拥有 IP 地址,并通过 MQTT 来和云端通信,同时还支持节点之间通过底层接口通信。

本文对应IDF 示例中的路径:./esp-idf/examples/mesh/ip_internal_network

我们为什么要搞这个?

在实际项目中,比如下面几种情况,我们会遇到这些麻烦:

  • “我希望节点之间可以直接通信,不靠云。”
    比如一个节点检测到烟雾,立刻广播给所有其他节点,而不是上传服务器再转发,省时又稳定。

  • “但我又想接入云端,统一做控制和查看。”
    管理员想在手机上收到通知,也要通过 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。

串口输出里,你会看到这些典型日志:

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 网络:临时部署多个节点自组网,公网不稳定也能内部通信

怎么快速上手这个示例?

简单列下步骤:

  1. 打开示例工程,执行 idf.py menuconfig,配置:
    • mesh channel
    • 路由器 SSID / 密码
    • MQTT broker 地址

如下图:

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

  1. 串口看到日志,确认每个节点都连上 MQTT 并获取 IP。
  2. 按下按钮或者通过串口触发事件,看看是不是同时通过 MQTT 和 mesh 广播出去了。

一些注意点

  • 这个例子不支持 IPv6-only 网络,用的是 IPv4 NAT。
  • NAT 功能是实验性质,所以别拿它做正式产品的唯一依赖。
  • 所有节点都要烧录相同程序,并配置 mesh 参数,否则组网失败。

最后总结一下

这个例子其实就是在探索**“如何让 mesh 网络既有本地快速通信能力,又能方便地接入云平台”**这个场景的最佳实践。

它做到了两点:

  1. 每个节点都是智能节点,能发 IP 消息,也能发低层广播
  2. 只要根节点在线,整个网络就可以和外界保持联系

如果你正在开发一个需要“节点互联 + 云端控制”的系统,这个例子可以作为非常好的参考起点。