ESP32和ESP8266的ESP-MESH

news2024/11/27 22:21:41

ESP32和ESP8266的ESP-MESH

  • 功能介绍
  • 一、介绍ESP-MESH
  • 二、安装painlessMesh库
  • 三、ESP-MESH基本示例(广播消息)
  • 四、示范


功能介绍

了解如何使用ESP-MESH网络协议通过ESP32和ESP8266 NodeMCU板构建网状网络。 ESP-MESH允许多个设备(节点)在单个无线局域网下相互通信。 ESP32和ESP8266板均支持该功能。 在本指南中,我们将向您展示如何使用Arduino内核开始使用ESP-MESH。
在这里插入图片描述


本文涵盖以下主题:

介绍ESP-MESH
ESP-MESH基本示例(广播消息)
使用ESP-MESH交换传感器读数(广播)

一、介绍ESP-MESH

根据Espressif文档:

“ ESP-MESH是建立在Wi-Fi协议之上的网络协议。 ESP-MESH允许散布在较大物理区域(室内和室外)中的众多设备(称为节点)在单个WLAN(无线局域网)下互连。
ESP-MESH具有自我组织和自我修复的功能,这意味着该网络可以自动构建和维护。” 有关更多信息,请访问ESP-MESH官方文档。

传统的Wi-Fi网络架构
在传统的Wi-Fi网络体系结构中,单个节点(访问点–通常为路由器)连接到所有其他节点(站)。 每个节点都可以使用访问点相互通信。 但是,这仅限于接入点的Wi-Fi覆盖范围。 每个站点必须在范围内才能直接连接到接入点。 ESP-MESH不会发生这种情况。

在这里插入图片描述

ESP-MESH网络架构
使用ESP-MESH,节点无需连接到中央节点。 节点负责彼此中继传输。 这允许多个设备分布在较大的物理区域上。 节点可以自组织并彼此动态对话,以确保数据包到达其最终节点目的地。 如果从网络中删除了任何节点,则它可以自我组织以确保数据包到达其目的地。

在这里插入图片描述

painlessMesh库使我们能够以简单的方式使用ESP8266或/和ESP32板创建网状网络。

“ painlessMesh是真正的自组织网络,这意味着不需要计划,中央控制器或路由器。 任何包含1个或多个节点的系统都将自组织成功能齐全的网格。 网格的最大大小受堆中可分配给子连接缓冲区的内存量的限制(我们认为),因此应该确实很高。 有关painlessMesh库的更多信息。

二、安装painlessMesh库

您可以通过Arduino库管理器安装painlessMesh。 转到工具>管理库。 图书馆管理器应打开。

搜索“ painlessmesh”并安装该库。 我们正在使用1.4.5版

在这里插入图片描述
该库还需要其他一些库依赖项。 应该会弹出一个新窗口,要求您安装所有缺少的依赖项。 选择“全部安装”。

在这里插入图片描述

如果未显示此窗口,则需要安装以下库依赖项:

ArduinoJson(来自bblanchon)
任务计划程序
ESPAsyncTCP(ESP8266)
AsyncTCP(ESP32)
如果您使用的是PlatformIO,则将以下行添加到platformio.ini文件中,以添加库并更改监视器速度。
For the ESP32:

monitor_speed = 115200 lib_deps = painlessmesh/painlessMesh @ ^1.4.5
ArduinoJson
arduinoUnity
TaskScheduler
AsyncTCP

For the ESP8266:

monitor_speed = 115200 lib_deps = painlessmesh/painlessMesh @ ^1.4.5
ArduinoJson
TaskScheduler
ESPAsyncTCP

三、ESP-MESH基本示例(广播消息)

要开始使用ESP-MESH,我们首先尝试使用该库的基本示例。 本示例创建一个网状网络,其中所有板均向所有其他板广播消息。

我们以四个板(两个ESP32和两个ESP8266)为例进行了实验。 您可以添加或删除板。 该代码与ESP32和ESP8266板均兼容。
在这里插入图片描述

代码– painlessMesh库基本示例
将以下代码复制到您的Arduino IDE(库示例中的代码)。 该代码与ESP32和ESP8266板均兼容。

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp-mesh-esp32-esp8266-painlessmesh/
  
  This is a simple example that uses the painlessMesh library: https://github.com/gmag11/painlessMesh/blob/master/examples/basic/basic.ino
*/

#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 = "Hi 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();
}

在上传代码之前,您可以设置MESH_PREFIX(类似于MESH网络的名称)和MESH_PASSWORD变量(可以将其设置为任意值)。

然后,我们建议您为每个板更改以下行,以轻松识别发送消息的节点。 例如,对于节点1,更改消息,如下所示:

String msg = "Hi from node 1 ";

代码如何工作
首先包括painlessMesh库。

#include “painlessMesh.h”

MESH详细信息
然后,添加网格详细信息。 MESH_PREFIX引用网格的名称。 您可以将其更改为任何您喜欢的。

#define MESH_PREFIX “whateverYouLike”

顾名思义,MESH_PASSWORD是MESH密码。 您可以将其更改为任何您喜欢的。

#define MESH_PASSWORD “somethingSneaky”

网格中的所有节点应使用相同的MESH_PREFIX和MESH_PASSWORD。

MESH_PORT指您要在其上运行网格服务器的TCP端口。 默认值为5555。

#define MESH_PORT 5555

Scheduler
建议避免在网状网络代码中使用delay()。 为了维护网格,需要在后台执行一些任务。 使用delay()将阻止这些任务的发生,并可能导致网格失去稳定性/崩溃。

相反,建议使用TaskScheduler运行在painlessMesh本身中使用的任务。

下面的行创建了一个名为userScheduler的新Scheduler。

painlessMesh
创建一个名为mesh的painlessMesh对象,以处理网格网络。
Create tasks
创建一个名为taskSendMessage的任务,该任务负责在程序运行时每秒调用一次sendMessage()函数。

Task taskSendMessage(TASK_SECOND * 1 , TASK_FOREVER, &sendMessage);
Send a Message to the Mesh sendMessage()函数将消息发送到消息网络(广播)中的所有节点。

void sendMessage() {
  String msg = "Hi from node 1";
  msg += mesh.getNodeId();
  mesh.sendBroadcast( msg );
  taskSendMessage.setInterval(random(TASK_SECOND * 1, TASK_SECOND * 5));
}

The message contains the “Hi from node 1” text followed by the board chip ID.

String msg = “Hi from node 1”;
msg += mesh.getNodeId();

要广播消息,只需在网格对象上使用sendBroadcast()方法,然后将要发送的消息(msg)作为参数传递。

mesh.sendBroadcast(msg);

每次发送新消息时,代码都会更改消息之间的间隔(一到五秒)。

taskSendMessage.setInterval(random(TASK_SECOND * 1, TASK_SECOND * 5));

Mesh Callback Functions
接下来,创建多个回调函数,当特定事件在网格上发生时将被调用。
receiveCallback()函数打印消息发件人(来自)和消息内容(msg.c_str())。

void receivedCallback( uint32_t from, String &msg ) {
  Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
}

每当新节点加入网络时,newConnectionCallback()函数就会运行。 此功能仅打印新节点的芯片ID。 您可以修改功能以执行任何其他任务。

void newConnectionCallback(uint32_t nodeId) {
  Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}

每当网络上的连接发生更改时(节点加入或离开网络时),changedConnectionCallback()函数都会运行。

void changedConnectionCallback() {
  Serial.printf("Changed connections\n");
}

当网络调整时间时,nodeTimeAdjustedCallback()函数将运行,以便所有节点都同步。 打印偏移量。

void nodeTimeAdjustedCallback(int32_t offset) {
  Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(),offset);
}

setup()
选择所需的调试消息类型:
//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);

最后,将taskSendMessage函数添加到userScheduler。 调度程序负责在正确的时间处理和运行任务。
userScheduler.addTask(taskSendMessage);
最后,启用taskSendMessage,以便程序开始将消息发送到网格。
taskSendMessage.enable();
为了使网格保持运行,将mesh.update()添加到loop()中。

void loop() {
  // it will run the user scheduler as well
  mesh.update();
}

四、示范

将提供的代码上传到所有主板。 不要忘记修改邮件以轻松识别发件人节点

将板连接到计算机后,打开每个板的串行连接。 您可以使用串行监视器,也可以使用类似PuTTY的软件并为所有板打开多个窗口。

您应该看到所有板都收到彼此的消息。 例如,这些是节点1收到的消息。它从节点2、3和4接收消息。

在这里插入图片描述

当网格上发生更改时,您还应该看到其他消息:板子离开或加入网络时。

在这里插入图片描述
使用ESP-MESH交换传感器读数
在下一个示例中,我们将在4个板之间交换传感器读数(您可以使用不同数量的板)。 每个板都接收其他板的读数。
在这里插入图片描述
例如,我们将交换来自BME280传感器的传感器读数,但是您可以使用任何其他传感器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1254534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Java] 阿里一面~说一下ArrayList 与 LinkedList 区别

文章目录 是否保证线程安全底层数据结构插入和删除是否受元素位置的影响是否支持快速随机访问内存空间占用: 是否保证线程安全 ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 底层数据结构 ● ArrayList 底层使用的是 Obje…

windows安装yarn

1、不要用npm装,因为npm安装的没有配置环境变量; 2、 用github搜yarn,点击排名第一的,然后点击releases 3、往下拉找到msi这几个字母的,然后就是下一步,下一步就行

深度学习第3天:CNN卷积神经网络

☁️主页 Nowl 🔥专栏《机器学习实战》 《机器学习》 📑君子坐而论道,少年起而行之 ​ 文章目录 介绍 CNN的主要结构 卷积层 激励层 池化层 Kears搭建CNN 搭建代码 直观感受卷积的作用 结语 介绍 卷积神经网络(Convol…

单片机学习2——流水灯的实现

#include<reg52.h>sbit LED P1^0; unsigned char i;void main() {while(1){LED 0;for(i0;i<100;i);LED 1;for(i0;i<100;i);} } RST是复位按钮&#xff0c;单击一下之后&#xff0c;程序就会跑到最开始的位置运行。 右侧的按钮是RUN按钮&#xff0c;单击下&…

【华为OD】B\C卷真题:100%通过:找城市 C/C++实现

【华为OD】B\C卷真题&#xff1a;100%通过&#xff1a;找城市 C/C实现 题目描述&#xff1a; 一张地图上有n个城市&#xff0c;城市和城市之间有且只有一条道路相连&#xff1a;要么直接相连&#xff0c;要么通过其它城市中转相连&#xff08;可中转一次或多次&#xff09;。…

项目去除git版本控制

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 ✈️已经旅游的地点 | 新疆-乌鲁木齐、新疆-吐鲁番、广东-广州…

【深度学习】DAMO-YOLO,阿里,701类通用检测模型,目标检测

https://github.com/tinyvision/DAMO-YOLO/blob/master/README_cn.md DAMO-YOLO是由阿里巴巴达摩院智能计算实验室TinyML团队开发的一个兼顾速度与精度的目标检测框架,其效果超越了目前的一众YOLO系列方法&#xff0c;在实现SOTA的同时&#xff0c;保持了很高的推理速度。DAMO…

中伟视界:创新解决方案,搭建自适应的AI算法模型训练平台

搭建AI算法模型自训练平台是当今人工智能领域的热门话题&#xff0c;但是其中存在着许多技术难点需要克服。 自训练平台需要具备高效的算法模型&#xff0c;这就要求能够处理庞大的数据量并进行高速计算。 平台需要具备强大的数据管理及存储能力&#xff0c;以满足训练过程中的…

Typescript基础面试题 | 02.精选 ts 面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

串口通信基础知识介绍

一、串行通讯与并行通讯 在通信和计算机科学中&#xff0c;串行通信(Serial Communication)是一个通用概念&#xff0c;泛指所有的串行的通信协议&#xff0c;如RS232、RS422、RS485、USB、I2C、SPI等。 串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种…

2023年网络安全比赛--综合渗透测试②(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.通过 PC 中的渗透测试平台 Kali 对服务器场景进行渗透测试,将扫描开放的所有端口当作flag提交(例:21,22,23); 2.通过 PC 中的渗透测试平台 Kali 对服务器场景进行渗透测试,将初…

智能优化算法应用:基于海鸥算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于海鸥算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于海鸥算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.海鸥算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

智能优化算法应用:基于斑点鬣狗算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于斑点鬣狗算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于斑点鬣狗算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.斑点鬣狗算法4.实验参数设定5.算法结果6.参考…

2018年4月26日 Go生态洞察:Go新品牌形象及标识发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

电子画册制作,谁能拒绝有这么好用的模板平台!

电子画册是我们生活中经常见到的&#xff0c;但很多人不知道电子画册是如何制作的&#xff0c;总觉得只有专业人士才能创作出来。其实不然&#xff0c;电子画册制作也可以很简单&#xff0c;就算是零基础小白也可以轻松上手&#xff0c;关键是找到一款可靠的制作工具。 在这方…

我的创作纪念日-----MySql服务

MySql服务 1.什么是数据库 1.1.数据 描述事物的符号记录&#xff0c;可以是数字文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;它们都可以经过数字化后存入计算机。 1.2.数据库 存储数据的仓库&#xff0c;是长期存放在计算机内、有组织、可共享的大…

<JavaEE> Java中线程有多少种状态(State)?状态之间的关系有什么关系?

目录 一、系统内核中的线程状态 二、Java中的线程状态 一、系统内核中的线程状态 状态说明就绪状态线程已经准备就绪&#xff0c;随时可以接受CPU的调度。阻塞状态线程处于阻塞等待&#xff0c;暂时无法在CPU中执行。 二、Java中的线程状态 相比于系统内核&#xff0c;Java…

C++局域网从服务器获取已连接用户的列表(linux to linux)

目录 服务器端 代码 客户端 代码解析 服务器端 原理 遇到的阻碍以及解决办法 客户端 原理 遇到的阻碍以及解决办法 运行结果截图 总结 服务器端 代码 #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet…

智能优化算法应用:基于蝗虫算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蝗虫算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蝗虫算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蝗虫算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

4D Gaussian Splatting:用于实时的动态场景渲染

Wu G, Yi T, Fang J, et al. 4d gaussian splatting for real-time dynamic scene rendering[J]. arXiv preprint arXiv:2310.08528, 2023. 更多参考资料如下&#xff1a; 文章总结&#xff1a;4D Gaussian Splatting for Real-Time Dynamic Scene Rendering&#xff1b;疑难问…