news 2026/9/12 4:01:04

Tasmota 无线网状网络(TASMESH)实战指南:基于 ESP-NOW 让节点脱离 Wi-Fi 组网

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Tasmota 无线网状网络(TASMESH)实战指南:基于 ESP-NOW 让节点脱离 Wi-Fi 组网

Tasmota 无线网状网络(TASMESH)实战指南:基于 ESP-NOW 让节点脱离 Wi-Fi 组网

【免费下载链接】TasmotaAlternative firmware for ESP8266 and ESP32 based devices with easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local control over MQTT, HTTP, Serial or KNX. Full documentation at项目地址: https://gitcode.com/GitHub_Trending/ta/Tasmota

本文基于 Tasmota 仓库中的 TASMESH 官方文档与驱动源码,系统讲解如何利用 ESP-NOW 协议将 ESP8266 节点从 Wi-Fi 网络中解放出来,通过 ESP32 网关(Broker)接入 MQTT。读完本文,你将掌握 TASMESH 的组网原理、编译开关、全部 Mesh 命令与规则写法,以及其消息分片、加密机制和已知限制,可直接用于打造低功耗电池供电的分布式传感节点。

概述:为什么需要 TASMESH

TASMESH 是 Tasmota 内置的一个驱动(xdrv_57),它通过 ESP-NOW 在 Tasmota 设备之间建立双向通信的内部协议,让普通节点设备彻底脱离 WLAN。其核心价值体现在三个方面:

  • 减轻无线路由器负载:节点不再与路由器建立 Wi-Fi 连接,路由器承担的连接数与空口流量显著下降;
  • 释放 2.4 GHz 频段资源:减少了节点与 AP 之间的信令开销,把宝贵的空口时间让给其他设备;
  • 显著降低节点功耗:ESP8266 节点不再维持 Wi-Fi 连接与 DHCP、TCP 栈等开销,更适合电池供电的项目。

从源码看,该驱动的实现分为两个文件:xdrv_57_1_tasmesh_support.ino(协议支持层:数据包结构、加解密、对端管理)与 xdrv_57_9_tasmesh.ino(主驱动层:命令解析、Broker/Node 启动、MQTT 代理、主循环调度)。

工作原理:ESP32 网关 + ESP8266 节点的星型/网状拓扑

TASMESH 采用“一个 Broker + 多个 Node”的拓扑:

  1. ESP32 充当网关(Broker):它仍然连接 Wi-Fi 与 MQTT Broker,负责在 WLAN 与 ESP-NOW 网状网之间“翻译”消息;
  2. ESP8266 充当节点(Node):节点通过 ESP-NOW 与 Broker 通信,不再连接 Wi-Fi
  3. MQTT 代理(Proxy)机制:Broker 会收到每个节点的 MQTT 主题,并作为代理订阅该主题。当收到形如cmnd/node_topic/...的 MQTT 消息时,Broker 自动通过 ESP-NOW 将其转发给对应节点(对应源码 xdrv_57_9_tasmesh.ino 中的MESHinterceptMQTTonBroker);
  4. 节点上报:节点产生的 MQTT 消息(如 tele 状态)通过 ESP-NOW 发回 Broker,由 Broker 代发到 MQTT(节点侧对应MESHrouteMQTTtoMESH,见 xdrv_02_9_mqtt.ino,它挂在MqttPublishLib上拦截所有外发 MQTT);
  5. 时间同步:Broker 自动向所有节点发送时间消息,保证节点有统一的时间基准。

从源码的结构体(xdrv_57_1_tasmesh_support.ino)可以推断,节点分两种角色:

角色枚举值行为
ROLE_NODE_FULL2全功能节点:除与 Broker 通信外,还会监听并转发其他节点的消息,实现多跳网状转发
ROLE_NODE_SMALL3精简节点:只与 Broker 直接通信,不参与消息转发(ROLE_NODE_SMALL在收到非本机消息时直接丢弃,见回调CB_MESHDataReceived

加密与传输机制

自动加密:ChaCha20-Poly1305

TASMESH 对 ESP-NOW 载荷启用自动加密,密钥直接取自设备的Wi-Fi 密码 1(Password1),取前 32 字节作为 ChaCha20Poly1305 认证加密的密钥。这一设计使得组网过程无需额外配置密钥——只要所有节点配置了相同的 Wi-Fi 密码,就天然共享同一把加密密钥。

源码佐证:MESHsetKey(xdrv_57_1_tasmesh_support.ino)从SettingsText(SET_STAPWD1 + Settings->sta_active)读取密码并截断至 32 字节;MESHencryptPayload(同文件 L345-L373)调用 BearSSL 的br_chacha20_ct_runbr_poly1305_ctmul32_run完成认证加密,加密失败会记录MSH: payload decryption error日志。注意:Broker 与节点的密码 1 必须一致,否则节点注册会被拒绝。

send-and-pray:放弃 ACK/NACK

由于 ESP8266 与 ESP32 两个平台上的 ESP-NOW ACK/NACK 消息均不可靠,TASMESH 采用**“发送即祈祷”(send-and-pray)策略:发送方不做可靠确认。为尽量补偿,节点侧实现了发送队列**(packetToResend),消息会带 TTL(Time to Live)字段并支持多跳转发。

启用驱动:编译开关

在编译前,向你的 user_config_override.h(或直接在 my_user_config.h 中取消注释)加入:

#define USE_TASMESH // Enable Tasmota Mesh using ESP-NOW (+11k code)

仓库中的 my_user_config.h 还提供了两个可选宏:

// #define USE_TASMESH_HEARTBEAT // 启用后 Broker 可检测节点上下线,并通过 MQTT 发送 Birth / LWT 消息 // #define TASMESH_OFFLINE_DELAY 3 // 距最后一次心跳多少秒后,Broker 判定节点离线

启用USE_TASMESH会增加约 11 KB 固件体积;它对应 support_features.ino 中的功能位0x00000200。若需要深睡眠场景下的在线状态检测,建议同时开启USE_TASMESH_HEARTBEAT(驱动默认并未开启)。

命令详解

所有命令以Mesh为前缀。重要警告:Broker 用于 ESP-NOW 的 MAC 地址是 Soft AP MAC(软 AP 地址),而不是 Wi-Fi STA MAC!另外,命令中 MAC 地址的冒号是可选的(源码MESHstripColon会剥离冒号)。

MeshBroker —— 启动 Broker(仅 ESP32)

MeshBroker

在 ESP32 上启动 Broker,并将自身的 MAC 与所用 Wi-Fi 信道打印到日志。源码中CmndMeshBroker(xdrv_57_9_tasmesh.ino)直接从当前关联的 Wi-Fi 信道取值(MESH.channel = WiFi.channel()),随后MESHstartBroker调用WiFi.softAPmacAddress(MESH.broker)Soft AP MAC作为网格内标识。因此节点侧使用MeshChannel时必须对准 Broker 的 AP 信道。

必须在 Wi-Fi 初始化完成之后调用!典型用法:

Rule1 on system#boot do meshbroker endon

MeshChannel 1..13 —— 切换节点信道

MeshChannel 7

在节点上把 Wi-Fi 信道切换到 1~13 之间的数值,需与 ESP32 Broker 所在的信道一致。源码CmndMeshChannel(xdrv_57_9_tasmesh.ino)校验范围为0 < payload < 14注意:Broker 的信道是自动从路由器获取的,无需(也不应)手动设置。

MeshNode AA:BB:CC:DD:EE:FF —— 启动节点(仅 ESP8266)

MeshNode FA:KE:AD:DR:ES:S1

在 ESP8266 上启动节点模式,并连接指定 MAC 的 Broker,随后自动把自己的 MQTT 主题发送给 BrokerMESHregisterNode,见 xdrv_57_9_tasmesh.ino)。有意思的是,源码CmndMeshNode会扫描名为ESP_<MAC后6位>的 SSID 来定位 Broker 所在的信道(见 xdrv_57_9_tasmesh.ino),因此请勿修改 Broker 的 AP SSID 默认格式。节点启动后,按设计会禁用 Wi-Fi 与 Web 服务器MESHsetWifi(0),见 xdrv_57_1_tasmesh_support.ino)。

MeshPeer AA:BB:CC:DD:EE:FF —— 添加对端

MeshPeer FA:KE:AD:DR:ES:S1

将一个已知节点添加到另一个节点的对端列表,用于在直接通信范围之外通过网状网多跳转发数据到 Broker。Broker 固定为对端 0(源码注释明确 “must always be peer 0”)。若 MAC 已在列表中会拒绝重复添加,且不允许添加自身。

MeshInterval 2..200 —— 调整发送间隔

MeshInterval 50

修改网格消息的发送间隔,取值范围 2~200 ms,默认 50 ms(源码常量MESH_REFRESH)。该值同时会影响节点在深睡眠/低功耗场景下的休眠参数(MESHsetSleep会把Settings->sleep收敛到不大于 Mesh 间隔)。

快速参考表

命令参数适用平台说明
MeshBrokerESP32启动 Broker,打印 MAC 与信道,需在 Wi-Fi 就绪后执行
MeshChannel1~13节点切换节点信道以对齐 Broker
MeshNodeMAC 地址ESP8266启动节点并连接 Broker,自动上报 MQTT 主题
MeshPeerMAC 地址均可添加多跳转发对端
MeshInterval2~200均可设置消息间隔,默认 50 ms

规则(Rules)配置示例

因为命令状态不会被保存到 Flash,也不会自动重启 Mesh,必须依靠规则在开机或唤醒时重新初始化。

Broker 端:等待 Wi-Fi/MQTT 就绪

Rule1 on system#boot do meshbroker endon

节点端:尽早启动 + 应对停电场景

节点可以尽快启动,但需要注意一个关键陷阱:若全网同时断电,节点将无法在 Broker 就绪前重连(当前驱动不实现重试)。例如节点在system#init加入网格时,Broker 可能还没在system#boot之后完成初始化,此时节点加入失败且不再重试。

官方推荐的稳妥做法:给所有节点配置一个公共组主题(如GroupTopic2 tasnodes),由 Broker 就绪后主动向该组下发启动命令

Rule1 on system#boot do meshbroker endon Rule2 on mesh#broker=1 do publish cmnd/tasnodes/meshnode FA:KE:AD:DR:ES:S1 endon

节点端则可保留“尽早启动”的兜底规则:

Rule1 on system#init do meshnode FA:KE:AD:DR:ES:S1 endon

深睡眠唤醒后重新初始化

要在深睡眠组合中使用 Mesh,必须设置规则在唤醒时重新初始化网格:

Rule1 on system#init do meshnode FA:KE:AD:DR:ES:S1 endon

添加已知对端

节点初始化完成后添加多跳对端:

Rule3 on mesh#node=1 do meshpeer FA:KE:AD:DR:ES:S1 endon

规则中的mesh#broker=1mesh#node=1事件由驱动在处理命令后触发XdrvRulesProcess(0)产生(见 xdrv_57_9_tasmesh.ino),可作为 Mesh 初始化完成的信号。

运行机制与状态可见性

  • 时间同步:Broker 每秒调度MESHEverySecond(xdrv_57_9_tasmesh.ino),按需或每 30 秒广播一次时间包;节点收到时间包后设置Rtc.utc_time并触发system#boot规则事件;
  • 节点保活:节点若超过 31 秒未收到 Broker 消息,会重新注册(MESHregisterNode(1));超过 70 秒则放弃 Mesh、重新拉起 Wi-Fi(见 xdrv_57_9_tasmesh.ino);
  • 状态查询:Broker 的StatusJSON 中会追加MESH字段(信道、节点数、节点 MAC 列表),其 Web 界面也会显示 Broker MAC、信道、各节点 MAC/最近消息时间/主题(MESHshow,见 xdrv_57_9_tasmesh.ino)。

数据包与消息大小限制

从 xdrv_57_1_tasmesh_support.ino 的常量可以看到协议的关键边界:

常量含义
MESH_PAYLOAD_SIZE160单包载荷上限(含 20 字节头与 16 字节认证标签后仍低于 200 字节,兼容 ESP8266 ESP-NOW)
MESH_TOPICSZ64节点 MQTT 主题最大长度
MESH_BUFFERS26分片重组缓冲区数量
MESH_MAX_PACKETS3去重记录的最大包数
MESH_REFRESH50默认发送间隔(ms)

数据包头包含发送者/接收者 MAC、滚动计数器、类型、分片信息(chunks/chunk)、TTL 与时间戳等字段。较大的 MQTT 消息会被拆分为多个 chunk,由接收端按receivedChunks位掩码重组(多包重组逻辑见 xdrv_57_9_tasmesh.ino)。

已知限制与注意事项

TASMESH 当前版本有以下明确限制:

  • 平台绑定:只有ESP32 支持作为 Broker,只有ESP8266 支持作为节点
  • 无命令持久化:命令不会被保存,断电或重启后必须通过规则重新启动 Broker/Node,深睡眠唤醒同理;
  • 消息方向不对称
    • 节点虽有发送队列,但没有接收队列——发往节点的 MQTT 命令需要尽可能短小,含主题在内约 160 字符上限
    • Broker 虽有接收队列,但没有发送队列——同理,Broker 转发的命令也应控制在该长度以内;
  • LWT 语义:由于节点与 MQTT Broker 之间没有直接连接,节点会被 MQTT 侧标记为LWT Offline(若启用USE_TASMESH_HEARTBEAT,Broker 会依据心跳替节点补发 Online/Offline 的 Birth/LWT 消息,见 xdrv_57_9_tasmesh.ino);
  • 断电恢复顺序:全网同时上电时,Broker 从system#boot启动往往晚于节点在system#init的入网尝试,且当前不实现重试,必须用“公共组主题 + Broker 主动下发”的方案规避;
  • 关键地址:节点入网使用的是 Broker 的Soft AP MAC,而非其 Wi-Fi STA MAC,配置时切勿混淆。

适用场景建议

综合以上特性,TASMESH 适合以下场景:

  • 电池供电的传感节点:如温湿度、门磁、人体感应等低频上报设备,利用脱离 Wi-Fi 的低功耗优势延长续航;
  • 无线信号死角扩展:通过MeshPeer建立多跳路径,把远离路由器的节点接入网格;
  • 高密度节点部署:需要大量设备接入、又不想给路由器增加连接负担的场景。

反之,若你的设备需要高频双向交互、大载荷 MQTT 命令或严格的送达保证,则应优先考虑传统 Wi-Fi + MQTT 方案,或等待 TASMESH 未来版本补齐接收队列与命令持久化能力。

参考资料

  • 官方驱动文档:info/xdrv_57_tasmesh.md
  • 主驱动实现:xdrv_57_9_tasmesh.ino
  • 协议支持层:xdrv_57_1_tasmesh_support.ino
  • 编译开关与心跳配置:my_user_config.h
  • MQTT 与 Mesh 的集成点:xdrv_02_9_mqtt.ino

【免费下载链接】TasmotaAlternative firmware for ESP8266 and ESP32 based devices with easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local control over MQTT, HTTP, Serial or KNX. Full documentation at项目地址: https://gitcode.com/GitHub_Trending/ta/Tasmota

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 4:00:55

时间序列异常检测源码解析:特征构造、模型选型与阈值调优

简介&#xff1a;一份面向时间序列异常点检测任务的完整源码项目包&#xff0c;适合计算机、数学、电子信息等专业学生用于课程设计、期末大作业或毕业设计参考。项目基于残差统计方法实现加性离群点检测&#xff0c;代码可直接运行&#xff0c;帮助读者理解异常检测算法从数据…

作者头像 李华
网站建设 2026/9/12 4:00:50

OpenLogi 上手:十分钟完成安装、连接与第一次鼠标按键重映射

OpenLogi 上手&#xff1a;十分钟完成安装、连接与第一次鼠标按键重映射 【免费下载链接】OpenLogi ⚡️A native, local-first alternative to Logitech Options, written in Rust &#x1f980; — remap buttons, DPI, and SmartShift over HID. No account, no telemetry. …

作者头像 李华
网站建设 2026/9/12 4:00:48

如何参与 Supertonic 社区贡献:第一次开源 PR 的 30 天完整路径

如何参与 Supertonic 社区贡献&#xff1a;第一次开源 PR 的 30 天完整路径 【免费下载链接】supertonic Lightning-Fast, On-Device, Multilingual TTS — running natively via ONNX. 项目地址: https://gitcode.com/GitHub_Trending/sup/supertonic 想给开源项目提第…

作者头像 李华
网站建设 2026/9/12 3:59:04

MOD44B植被覆盖数据在中国生态评估中的应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 3:58:54

缓存无关数据结构:原理、实现与性能优化

1. 缓存无关数据结构核心思想解析在《Handbook of Data Structures and Applications》这本经典著作中&#xff0c;缓存无关数据结构&#xff08;Cache-Oblivious Data Structures&#xff09;被作为现代算法设计的重要范式进行深入探讨。这种数据结构设计方法最精妙之处在于&a…

作者头像 李华