ESP32和ESP8266的ESP-MESH

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传感器的传感器读数,但是您可以使用任何其他传感器。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单例模式与多线程

目录 前言 正文 1.立即加载/饿汉模式 2.延迟加载/懒汉模式 1.延迟加载/懒汉模式解析 2.延迟加载/懒汉模式的缺点 3.延迟加载/懒汉模式的解决方案 (1)声明 synchronized 关键字 (2)尝试同步代码块 (3&am…

vue 中 js 金额数字转中文

参考:js工具函数之数字转为中文数字和大写金额_js封装工具类函数金额大写-CSDN博客 我使用的框架vol.core。 客户需求要将录入框的金额数字转换成中文在旁边显示,换了几种函数,最终确定如下函数 function changeToChineseMoney(Num) {//判断…

Quartz定时任务基础

springBoot有一个定时执行某个方法的 注解: Scheduled 可以满足挺多的需求,但是到了一些场景,就显得比较麻烦,比如: 机器待机五分钟后执行切换待机状态。如果是按照使用Scheduled注解,就得持久化一个表&…

【Java SE】 带你走近Java的抽象类与接口

🌹🌹🌹【JavaSE】专栏🌹🌹🌹 🌹🌹🌹个人主页🌹🌹🌹 🌹🌹🌹上一篇文章🌹🌹&…

2018年3月26日 Go生态洞察:Go包版本管理提案分析

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

java springboot测试类虚拟MVC环境 匹配请求头指定key与预期值是否相同

上文 java springboot测试类虚拟MVC环境 匹配返回值与预期内容是否相同 (JSON数据格式) 版 中 我们展示 json匹配内容的方式 那么 本文我们来看看Content-Type属性的匹配方式 首先 我们从返回体可以看出 Content-Type 在请求头信息 Headers 中 我们直接将测试类代码更改如下 …

C#,《小白学程序》第二十七课:大数四则运算之“运算符重载”的算法及源程序

1 文本格式 using System; using System.Text; using System.Collections; using System.Collections.Generic; /// <summary> /// 大数的四则&#xff08;加减乘除&#xff09;运算 /// 及其运算符重载&#xff08;取余数&#xff09; /// </summary> public cl…

在项目中集成marsUI

拷贝文件夹到目标项目 集成 安装相关依赖 npm i --save ant-design-vue4.x npm i less npm i nprogress npm i consola npm i echarts npm i vue-color-kit npm i icon-park/svg npm i vite-plugin-style-import 配置Vite文件 使用 效果

Leetcode—828.统计子串中的唯一字符【困难】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—828.统计子串中的唯一字符 算法思想 枚举所有种类字母在s中出现的位置&#xff0c;分别统计只包含这个字母不包含该类字母中其他字母的子串个数 实现代码 int uniqueLetterString(char* s) {int len strlen(s);cha…

电子学会C/C++编程等级考试2022年06月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:小白鼠再排队 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白…

十分钟让你搞懂JVM中的GC垃圾回收机制(分代回收)

文章目录 0. 为什么要有垃圾回收?1. 垃圾回收哪个内存区域?2. 如何找到垃圾(死亡对象的判断)2.1 引用计数法2.2 可达性分析法2.3 两种算法的差别 3. 如何清理垃圾(死亡对象的回收)3.1 标记-清楚法3.2 复制法3.3 标记-整理法 4. JVM使用的回收方法4.1 什么是分代回收4.2 哪些对…

【Linux】:信号的产生

信号 一.前台进程和后台进程1.前台进程2。后台进程3.总结 二.自定义信号动作接口三.信号的产生1.键盘组合键2.kill信号进程pid3.系统调用1.kill函数2.raise函数3.abort函数 四.异常五.软件条件六.通过终端按键产生信号 一.前台进程和后台进程 1.前台进程 一个简单的代码演示 …

跟着chatgpt学习|1.spark入门

首先先让chatgpt帮我规划学习路径&#xff0c;使用Markdown格式返回&#xff0c;并转成思维导图的形式 目录 目录 1. 了解spark 1.1 Spark的概念 1.2 Spark的架构 1.3 Spark的基本功能 2.spark中的数据抽象和操作方式 2.1.RDD&#xff08;弹性分布式数据集&#xff09; 2…

JAVA时间常用操作工具类

小刘整理了JAVA中对时间的常用操作&#xff0c;封装了几种方法&#xff0c;简单方便&#xff0c;开箱即用。时间转字符串格式&#xff0c;字符串转时间&#xff0c;以及过去和未来的日期。除此之外&#xff0c;还新增了时间戳之差计算时分秒天的具体方案。 public static void …

【力扣:1707 1803】0-1字典树

思路&#xff1a;树上每个节点存储拥有该节点的数组元素的最小值&#xff0c;left节点表示0&#xff0c;right节点表示1&#xff0c;构建完成后遍历树当子节点没有比mi小的元素时直接输出-1&#xff0c;否则向下构造。 struct tree{int m;tree*leftnullptr,*rightnullptr;tree…

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

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

养生馆服务预约会员管理系统小程序效果如何

中医养生馆的全国数量逐渐增加&#xff0c;各种疾病困扰下&#xff0c;有些病往往通过养生馆即可治好&#xff0c;比如常见的针灸、按摩、药理滋补、切脉等&#xff0c;都有很高的市场需求度&#xff0c;而随着众多商家入局赛道及消费升级&#xff0c;传统中医养生馆经营痛点也…

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

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

印刷基板开孔机上的直线导轨怎么安装?

直线导轨是属于高精度的传动元件&#xff0c;作为印刷基板开孔机重要的传动元件&#xff0c;倘若安装不当&#xff0c;严重则无法正常作业&#xff0c;轻则影响直线导轨的精度和寿命。那么&#xff0c;印刷基板开孔机的直线导轨是如何安装的呢&#xff1f; 在安装前&#xff0c…

C语言编译过程再解析

多年以前,分析过编译过程,并写了一篇博客,现在对编译过程有了更广阔的认识,记录在此 编译过程 中的 链接与 编译 编译过程分为1. 预处理2. 编译3. 汇编4. 链接其中有 2个过程比较特殊,1. 编译2. 链接对于C程序来说,链接分为提前链接(静态链接)对应下图第1行运行时链接(动态链…