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

前言

物联网开发里,组网和通信 一直是个很绕的事。用 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 网络:临时部署多个节点自组网,公网不稳定也能内部通信

怎么快速上手这个示例?

简单列下步骤:

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

如下图:

  1. 编译并烧录到几块板子上:
bash 复制代码
idf.py -p PORT flash monitor
  1. 串口看到日志,确认每个节点都连上 MQTT 并获取 IP。
  2. 按下按钮或者通过串口触发事件,看看是不是同时通过 MQTT 和 mesh 广播出去了。

一些注意点

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

最后总结一下

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

它做到了两点:

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

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

相关推荐
想拿高薪的韭菜3 小时前
嵌入式基础(二)ARM基础
嵌入式
庐阳寒月5 小时前
linux多线(进)程编程——番外1:内存映射与mmap
linux·c语言·嵌入式
Scout-leaf10 小时前
UTC时间与正常时间相互转换的shell脚本
嵌入式
政安晨12 小时前
【嵌入式人工智能产品开发实战】(二十)—— 政安晨:小智AI嵌入式终端代码解读:【B】小智AI嵌入式终端OTA升级功能深度解析
c++·人工智能·嵌入式·ota·小智ai·代码解读·ai聊天助手
塞尔维亚大汉1 天前
【鸿蒙南向开发】标准系统方案之瑞芯微RK3566移植案例(下)
操作系统·嵌入式·harmonyos
别说我什么都不会1 天前
OpenHarmony 实战开发 ——轻量型系统服务管理部件
物联网·嵌入式·harmonyos
塞尔维亚大汉1 天前
【鸿蒙南向开发】标准系统方案之瑞芯微RK3568移植案例(下)
物联网·嵌入式·harmonyos
别说我什么都不会2 天前
OpenHarmony 实战开发 —— 在自绘编辑框中使用输入法
嵌入式·harmonyos
飞凌嵌入式3 天前
飞凌嵌入式T527核心板正式发布OpenHarmony4.1系统,实现从芯片架构到操作系统的全链路国产化
人工智能·嵌入式硬件·嵌入式·飞凌嵌入式
alive9033 天前
【QT】 进程
c++·qt·嵌入式·进程·qprocess