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

server/2024/11/30 18:18:05/

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


http://www.ppmy.cn/server/146215.html

相关文章

积鼎科技携手西北工业大学动力与能源学院共建复杂多相流仿真联合实验室

11月26日,复杂多相流仿真联合实验室揭牌仪式及技术研讨活动在西北工业大学动力与能源学院成功举办。复杂多相流仿真联合实验室是由西北工业大学动力与能源学院牵头,携手上海积鼎信息科技有限公司与三航铸剑(西安)科技发展有限公司…

速盾:介绍一下高防cdn的缓存响应事什么功能?

高防CDN(Content Delivery Network)是一种基于分布式缓存技术的网络加速服务,能够提供强大的缓存响应功能。它的缓存响应功能主要包括缓存加速和智能缓存两个方面。 首先,高防CDN的缓存加速功能是指通过在全球范围内部署大量的缓…

图像处理里的傅里叶变换:原理与代码实现

简介:本文围绕傅里叶变换在图像处理中的应用展开。先是以通俗易懂的方式详细阐释了傅里叶变换的核心理论,涵盖为何选用正弦和余弦、空间域到频率域的转换以及幅度图像和相位图像的含义等内容,帮助读者理解其原理。接着通过具体代码示例&#…

mybatis02——Mapper代理开发

以上配置完后在mybatis-config.xml文件里改resources&#xff08;见后面&#xff1a;可以直接将整个mapper包导进来&#xff09; <mappers><mapper resource"com/test/mapper/UserMapper.xml"/></mappers> 在接口&#xff08;与xxxMapper.xml文件…

Linux xattr 命令详解

简介 Linux 中的 xattr 命令用于管理文件的扩展属性。扩展属性存储标准属性中未包含的附加元数据&#xff08;如权限、所有者和时间戳&#xff09;。它们通常由特定的应用程序或文件系统&#xff08;例如&#xff0c;acl、SELinux 标签&#xff09;使用。 关键概念 扩展属性&…

【docker】docker的起源与容器的由来、docker容器的隔离机制

Docker 的起源与容器的由来 1. 虚拟机的局限&#xff1a;容器的需求萌芽 在 Docker 出现之前&#xff0c;开发和部署软件主要依赖虚拟机&#xff08;VMs&#xff09;&#xff1a; 虚拟机通过模拟硬件运行操作系统&#xff0c;每个应用程序可以运行在自己的独立环境中。虽然虚…

26届JAVA 学习日记——Day17

2024.11.29 周五 今天把苍穹外卖的项目做完啦&#xff0c;准备开始做新的AI项目&#xff0c;今天的时间主要在修改简历&#xff0c;超级简历现在要收费&#xff0c;自己Word慢慢改真的很耗时间。 八股 今日暂无该内容学习。 算法 今日暂无该内容学习。 项目 苍穹外卖-完结…

AI开发-自然语言处理工具包-NumPy

1 需求 NLTK :: Natural Language Toolkit 2 接口 3 示例 4 参考资料