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