ESP32/ESP8266通过ESP-MESH无线组网协议通信
- 简介
- painlessMesh Library
- ESP-MESH广播通信示例
- ESP-MESH通信验证
- 总结
简介
Wi-Fi Mesh 是一种能够大幅提高 Wi-Fi 信号覆盖范围的无线网络系统。乐鑫基于 Wi-Fi 协议推出了 Wi-Fi Mesh 组网方案 ESP-Mesh-Lite,支持分布在室内、室外大范围内的大量设备均接入同一个网络,能够为用户带来快速、稳定、安全的 Wi-Fi 覆盖。ESP-Mesh-Lite 支持乐鑫 ESP32、ESP32-C、ESP32-S 等系列 Wi-Fi SoC,适用于智能家庭、智能灌溉、植物照明、太阳能发电等需要多设备组网部署和群控的自动化场景。
传统 Wi-Fi 网络中,所有终端设备入网时,都需要与路由器直接相连,才能与其他终端通信。这使得 Wi-Fi 的覆盖区域受到路由器位置的限制,可接入终端设备的数量也受到路由器容量的限制。
乐鑫 ESP-Mesh-Lite 网络中,所有终端设备均可以和相邻设备相连,无需受限于路由器的位置和容量。这种网络架构不仅能够使 Wi-Fi 覆盖区域更广,而且支持接入更多设备,也不易于超载。同时,每个节点会由父节点分配得到 IP 地址,故可以像单个设备接入路由器一样访问网络,其父节点对该数据只做网络层的转发,对应用层无感。
终端设备会自动连接信号强的节点组成 ESP-Mesh-Lite 网络。网络中任意节点断开时,其他节点也会自动重新连接,以实现网络自愈。这一机制保证了 Mesh 网络中某些设备发生故障时,其他设备仍能稳定联网。使用ESP-MESH,节点不需要连接到中心节点,节点负责转发彼此的传输。这允许多个设备分布在一个大的物理区域。节点可以自组织并动态地相互对话,以确保数据包到达其最终节点目的地。
相比于 Thread、Zigbee、蓝牙 Mesh 组网,Wi-Fi 连接具有较高的网络传输和设备间通信速率。这使方案适用于多设备同时上报、OTA 等高吞吐场景。
ESP-Mesh-Lite 网络允许不同类型的 Wi-Fi 设备接入,并支持各设备直接访问互联网。
ESP-Mesh-Lite 网络无需网关或边界路由器,且网络中的任意设备均可以和相邻设备相连,因此易于不断拓展网络覆盖范围。
用户仅需添加 ESP-Mesh-Lite 初始化和修改配网,即可快速将 ESP-Mesh-Lite 迁移至原有 Wi-Fi 应用,降低了开发和维护的成本。
ESP-MESH-LITE 与 ESP-MESH(又称 ESP-WIFI-MESH)最大的不同是 ESP-MESH-LITE 允许组网内的子设备独立访问外部网络,传输信息对于父节点无感,大大降低了应用层开发难度,ESP-MESH-LITE 相较于 ESP-MESH 会节省出更多的内存空间,但 ESP-MESH 的自组网和自修复的特性相对来说更加完善。
ESP-MESH-LITE 跟 ESP-MESH 自动选择父节点方式不同。
1、ESP-MESH:在上电后所有设备处于空闲节点的时候进行竞选,根据 RSSI 选出根节点,之后根节点再连接路由器。
2、ESP-MESH-LITE:默认首先配网完上电的设备作为根节点,若同时有多个设备上电,设备都连到路由器上面后,所有设备开始广播路由器 RSSI,RSSI 最好的作为根节点,其余节点断开与路由器的连接,开始重新扫描发现新的父节点。
3、ESP-MESH 只有根节点使能 LWIP 协议栈,所有子节点设备想要与外部网络通信都需要通过根节点的转发。
painlessMesh Library
painlessMesh是一个真正的自组织网络,这意味着不需要规划、中央控制器或路由器。任何包含一个或多个节点的系统都会自组织成功能齐全的网状网络。
Arduino IDE安装painlessMesh库,若提示安装其他库的依赖,则选择全部安装
或者进行单独下载安装依赖库:
ArduinoJson (by bblanchon)
TaskScheduler
AsyncTCP (ESP32)
ESPAsyncTCP(ESP8266)
PlatformIO中则在platformio.ini文件中添加
ESP32中:
monitor_speed = 115200
lib_deps = painlessmesh/painlessMesh @ ^1.4.5
ArduinoJson
arduinoUnity
TaskScheduler
AsyncTCP
ESP8266中:
monitor_speed = 115200
lib_deps = painlessmesh/painlessMesh @ ^1.4.5
ArduinoJson
TaskScheduler
ESPAsyncTCP
ESP-MESH广播通信示例
两个ESP32开发板和两个ESP8266开发板进行组网后,每一个开发板向另外3个开发板发送广播信息
Arduino IDE打开安装好的Painless Mesh库的基础示例Basic
//************************************************************
// this is a simple example that uses the painlessMesh library
//
// 1. sends a silly message to every node on the mesh at a random time between 1 and 5 seconds
// 2. prints anything it receives to Serial.print
//
//
//************************************************************
#include "painlessMesh.h"#define MESH_PREFIX "whateverYouLike"
#define MESH_PASSWORD "somethingSneaky"
#define MESH_PORT 5555Scheduler userScheduler; // to control your personal task
painlessMesh mesh;// User stub
void sendMessage() ; // Prototype so PlatformIO doesn't complainTask taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );void sendMessage() {String msg = "Hello from node1";msg += mesh.getNodeId();mesh.sendBroadcast( msg );taskSendMessage.setInterval( random( TASK_SECOND * 1, TASK_SECOND * 5 ));
}// Needed for painless library
void receivedCallback( uint32_t from, String &msg ) {Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
}void newConnectionCallback(uint32_t nodeId) {Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}void changedConnectionCallback() {Serial.printf("Changed connections\n");
}void nodeTimeAdjustedCallback(int32_t offset) {Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}void setup() {Serial.begin(115200);//mesh.setDebugMsgTypes( ERROR | MESH_STATUS | CONNECTION | SYNC | COMMUNICATION | GENERAL | MSG_TYPES | REMOTE ); // all types onmesh.setDebugMsgTypes( ERROR | STARTUP ); // set before init() so that you can see startup messagesmesh.init( MESH_PREFIX, MESH_PASSWORD, &userScheduler, MESH_PORT );mesh.onReceive(&receivedCallback);mesh.onNewConnection(&newConnectionCallback);mesh.onChangedConnections(&changedConnectionCallback);mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);userScheduler.addTask( taskSendMessage );taskSendMessage.enable();
}void loop() {// it will run the user scheduler as wellmesh.update();
}
#define MESH_PREFIX “ESP-MESH” 定义MESH网络名称
#define MESH_PASSWORD “ESP123456” 定义MESH网络密码
#define MESH_PORT 5555 定义MESH网络端口
String msg = “Hello from node1”; 改变node字符后面的序号以便区分是哪一个开发板发送的数据,本例程使用了4个开发板,每一个开发板下载程序前先改变node序号,如node1,node2,node3,node4
ESP-MESH通信验证
给每一个开发板下载好程序,打开串口助手,观察每一个开发板的串口信息打印
若4个开发板组网成功,每一个开发板可接收到另外3个开发板发送过来的广播信息,例如node4开发板接收到了node1、2、3发送过来的信息
若node3开发板离线,则提示连接发生了变化,此时node1开发板只接收到node2、4开发板发送的信息
若node3开发板重新连线,则提示连接发生了变化,有新的连接到网络中。此时node1开发板重新接收到node2、3、4开发板发送的信息
总结
通过以上实验我们验证了多个ESP开发板通过ESP-NOW自组网的无线通信