问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ESP32/ESP8266通过ESP-MESH无线组网协议通信

创作时间:
作者:
@小白创作中心

ESP32/ESP8266通过ESP-MESH无线组网协议通信

引用
CSDN
1.
https://m.blog.csdn.net/qq_42250136/article/details/144142757

随着物联网技术的快速发展,无线组网技术在智能家居、智能农业等领域的应用越来越广泛。ESP32/ESP8266作为目前主流的Wi-Fi模块,其自带的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       5555  

Scheduler userScheduler; // to control your personal task  

painlessMesh  mesh;  

// User stub  

void sendMessage() ; // Prototype so PlatformIO doesn't complain  

Task 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 on  

  mesh.setDebugMsgTypes( ERROR | STARTUP );  // set before init() so that you can see startup messages  

  mesh.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 well  

  mesh.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自组网的无线通信

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号