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 命令与规则写法以及其消息分片、加密机制和已知限制可直接用于打造低功耗电池供电的分布式传感节点。概述为什么需要 TASMESHTASMESH 是 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”的拓扑ESP32 充当网关Broker它仍然连接 Wi-Fi 与 MQTT Broker负责在 WLAN 与 ESP-NOW 网状网之间“翻译”消息ESP8266 充当节点Node节点通过 ESP-NOW 与 Broker 通信不再连接 Wi-FiMQTT 代理Proxy机制Broker 会收到每个节点的 MQTT 主题并作为代理订阅该主题。当收到形如cmnd/node_topic/...的 MQTT 消息时Broker 自动通过 ESP-NOW 将其转发给对应节点对应源码 xdrv_57_9_tasmesh.ino 中的MESHinterceptMQTTonBroker节点上报节点产生的 MQTT 消息如 tele 状态通过 ESP-NOW 发回 Broker由 Broker 代发到 MQTT节点侧对应MESHrouteMQTTtoMESH见 xdrv_02_9_mqtt.ino它挂在MqttPublishLib上拦截所有外发 MQTT时间同步Broker 自动向所有节点发送时间消息保证节点有统一的时间基准。从源码的结构体xdrv_57_1_tasmesh_support.ino可以推断节点分两种角色角色枚举值行为ROLE_NODE_FULL2全功能节点除与 Broker 通信外还会监听并转发其他节点的消息实现多跳网状转发ROLE_NODE_SMALL3精简节点只与 Broker 直接通信不参与消息转发ROLE_NODE_SMALL在收到非本机消息时直接丢弃见回调CB_MESHDataReceived加密与传输机制自动加密ChaCha20-Poly1305TASMESH 对 ESP-NOW 载荷启用自动加密密钥直接取自设备的Wi-Fi 密码 1Password1取前 32 字节作为 ChaCha20Poly1305 认证加密的密钥。这一设计使得组网过程无需额外配置密钥——只要所有节点配置了相同的 Wi-Fi 密码就天然共享同一把加密密钥。源码佐证MESHsetKeyxdrv_57_1_tasmesh_support.ino从SettingsText(SET_STAPWD1 Settings-sta_active)读取密码并截断至 32 字节MESHencryptPayload同文件 L345-L373调用 BearSSL 的br_chacha20_ct_run与br_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消息会带 TTLTime 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仅 ESP32MeshBroker在 ESP32 上启动 Broker并将自身的 MAC 与所用 Wi-Fi 信道打印到日志。源码中CmndMeshBrokerxdrv_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 endonMeshChannel 1..13 —— 切换节点信道MeshChannel 7在节点上把 Wi-Fi 信道切换到 113 之间的数值需与 ESP32 Broker 所在的信道一致。源码CmndMeshChannelxdrv_57_9_tasmesh.ino校验范围为0 payload 14。注意Broker 的信道是自动从路由器获取的无需也不应手动设置。MeshNode AA:BB:CC:DD:EE:FF —— 启动节点仅 ESP8266MeshNode 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修改网格消息的发送间隔取值范围 2200 ms默认 50 ms源码常量MESH_REFRESH。该值同时会影响节点在深睡眠/低功耗场景下的休眠参数MESHsetSleep会把Settings-sleep收敛到不大于 Mesh 间隔。快速参考表命令参数适用平台说明MeshBroker无ESP32启动 Broker打印 MAC 与信道需在 Wi-Fi 就绪后执行MeshChannel113节点切换节点信道以对齐 BrokerMeshNodeMAC 地址ESP8266启动节点并连接 Broker自动上报 MQTT 主题MeshPeerMAC 地址均可添加多跳转发对端MeshInterval2200均可设置消息间隔默认 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#broker1 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#node1 do meshpeer FA:KE:AD:DR:ES:S1 endon规则中的mesh#broker1、mesh#node1事件由驱动在处理命令后触发XdrvRulesProcess(0)产生见 xdrv_57_9_tasmesh.ino可作为 Mesh 初始化完成的信号。运行机制与状态可见性时间同步Broker 每秒调度MESHEverySecondxdrv_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-NOWMESH_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_HEARTBEATBroker 会依据心跳替节点补发 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.hMQTT 与 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),仅供参考