ESP8266-Arduino网络编程实例-ESP-MESH多设备节点通信
ESP-MESH多设备节点通信
本文将演示如何使用ESP-MESH网络协议通过多个ESP设备(ESP32或ESP8266)来构建网状网络。ESP-MESH允许多个设备(节点)在单个无线局域网下相互通信。
1、ESP-MESH简单介绍
根据Espressif官方文档描述:
ESP-MESH 是建立在 Wi-Fi 协议之上的网络协议。 ESP-MESH 允许分布在大物理区域(室内和室外)的众多设备(称为节点)在单个 WLAN(无线局域网)下互连。
ESP-MESH 是自组织和自修复的,这意味着网络可以自主构建和维护。
在传统的 Wi-Fi 网络架构中,单个节点(接入点——通常是路由器)连接到所有其他节点(站)。 每个节点都可以使用接入点相互通信。 但是,这仅限于接入点 wi-fi 覆盖范围。 每个站点都必须在范围内才能直接连接到接入点。 ESP-MESH 不会发生这种情况。
传统Wi-Fi网络构架如下图所示:

使用 ESP-MESH,节点无需连接到中心节点。 节点负责相互中继传输。 这允许多个设备分布在一个大的物理区域。 节点可以自组织并动态地相互通信,以确保数据包到达其最终节点目的地。 如果任何节点从网络中删除,它能够自组织以确保数据包到达目的地。如下图所示:

2、硬件准备
- ESP8266 NodeMCU开发板两块
- 数据线两条
3、软件准备
- Arduino IDE或VSCode + PlatformIO
在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:
ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:
4、代码实现
本次实例使用到的开源库如下:
painlessMesh 是一个真正的 ad-hoc 网络,这意味着不需要规划、中央控制器或路由器。 任何具有 1 个或多个节点的系统都将自组织成功能齐全的网格。 网格的最大尺寸(我们认为)受到堆中可分配给子连接缓冲区的内存量的限制。
下面将演示一个简单的ESP-MESH网络消息广播:

示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include "painlessMesh.h"
#define MESH\_PREFIX "\*\*\*\*\*" // ESP-MESH网络名称 #define MESH\_PASSWORD "\*\*\*\*\*" // ESP-MESH网络密码 #define MESH\_PORT 5555
Scheduler userScheduler; // 任务调度器 painlessMesh mesh; // ESP-MESH网络对象
// User stub void sendMessage() ;
Task taskSendMessage( TASK_SECOND \* 1 , TASK_FOREVER, &sendMessage );
// 向ESP-MESH网络广播消息 void sendMessage() { String msg = "Hi from node1"; // 其他节点请更改这里作为区别 msg += mesh.getNodeId(); mesh.sendBroadcast( msg ); taskSendMessage.setInterval( random( TASK_SECOND \* 1, TASK_SECOND \* 5 )); }
// ESP-MESH网络数据接收回调 void receivedCallback( uint32\_t from, String &msg ) { Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c\_str()); }
// ESP-MESH网络设备连接回调 void newConnectionCallback(uint32\_t nodeId) { Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId); }
// ESP-MESH网络设备连接变化回调 void changedConnectionCallback() { Serial.printf("Changed connections\n"); }
// ESP-MESH网络时间调整回调 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 // 设置消息调试类型,必须在init函数调用前设置 mesh.setDebugMsgTypes( ERROR | STARTUP ); // set before init() so that you can see startup messages // 初始化ESP-MESH网络 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() { // 网络维护及刷新 mesh.update(); }
|
文章来源: https://iotsmart.blog.csdn.net/article/details/127727878
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!