18、ESP32 ESP-NOW 点对点通信

        ESP-NOW 是乐鑫自主研发的无连接通信协议,具有短数据包传输功能。该协议使多个设备能够以简单的方式相互通信。

ESP-NOW 功能

ESP-NOW 支持以下功能:

  • 加密和未加密的单播通信;
  • 混合加密和未加密的对等设备;
  • 最多可携带 250 字节 的有效载荷;
  • 发送回调功能,可以设置用于通知应用层传输成功或失败。

ESP-NOW 技术还存在以下局限性:

  • 有限的加密对等体。Station 模式最多支持 10 个加密对等体,在 SoftAP 或 SoftAP + Station 模式下最多 6 个;
  • 支持多个未加密的对等体,但其总数应小于 20 个,包括加密的对等体;
  • 有效负载限制为 250 字节

        简单来说,ESP-NOW 是一种快速通信协议,可用于在 ESP32 开发板之间交换小消息(最大 250 字节)。


ESP-NOW 通信

1、 单向通信,这种配置非常容易实现,适合将数据从一块板发送到另一块板

 2、一对多通信,一个 ESP32 向不同的 ESP32 发送相同或不同的命令,适合构建类似遥控器的东西

3、多对一通信,将多个传感器节点的数据收集到一个 ESP32 中。可以配置为Web服务器,以显示来自所有其他板的数据

ESP32 获取 MAC 地址

        要通过 ESP-NOW 进行通信,需要知道 ESP32 的 MAC 地址,这样就可以知道要将数据发送到哪个设备。

        每个 ESP32 都有唯一的 MAC 地址,这就是我们识别每块开发板的方式,以便使用 ESP-NOW 向其发送数据。

// 次示例返回 MAC 地址#include <Arduino.h>
#include <WiFi.h>void setup()
{Serial.begin(115200);WiFi.mode(WIFI_MODE_STA);Serial.println(WiFi.macAddress());
}void loop()
{
}

 ESP-NOW 双向通信

        使用 ESP-NOW,每块板可以同时是发送方和接收方。因此也可以构建一个类似网络的连接。

函数名称和说明
esp_now_init()初始化 ESP-NOW。在初始化 ESP-NOW 之前,必须先初始化 Wi-Fi
esp_now_add_peer()调用此函数以配对设备并将对等 MAC 地址作为参数传递
esp_now_send()使用 ESP-NOW 发送数据
esp_now_register_send_cb()注册发送回调函数。发送消息时调用此函数返回传递是否成功
esp_now_register_rcv_cb()注册接收回调函数。当通过 ESP-NOW 接收数据时触发

发送设备内容:

  1. 初始化 ESP-NOW;
  2. 注册发送回调函数 OnDataSent,函数将在发送消息时执行,告诉我们消息是否成功传递;
  3. 添加对等设备(接收 ESP32),需要知道接收方 MAC 地址;
  4. 向对等设备发送消息。

接收设备内容:

  1. 初始化 ESP-NOW;
  2. 注册接收回调函数 OnDataRecv,在收到消息时将执行;
  3. 在回调函数中,将消息保存到变量中,以使用该信息执行任何任务。
// 发送设备代码
// 发送四个类型的数据#include <Arduino.h>
#include <esp_now.h>
#include <WiFi.h>// CC:7B:5C:25:7B:BC
// 08:D1:F9:EB:52:E8uint8_t broadcastAddress[] = {0xCC, 0x7B, 0x5C, 0x25, 0x7B, 0xBC};// 发送的数据结构
typedef struct struct_message
{char a[32];int b;float c;bool d;
} struct_message;struct_message myData;esp_now_peer_info_t peerInfo;// 发送数据回调函数
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status)
{// 打印消息是否成功传递Serial.print("Last Packet Send Status:");Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}void setup()
{Serial.begin(115200);WiFi.mode(WIFI_STA);    // Wi-Fi Stationif (esp_now_init() != ESP_OK){Serial.println("Error initializing ESP-NOW");return;}esp_now_register_send_cb(OnDataSent);   // 注册发送数据的回调函数memcpy(peerInfo.peer_addr, broadcastAddress, 6);    // 复制 MAC 地址peerInfo.channel = 0;       // 使用当前打开的通道peerInfo.encrypt = false;   // 未加密// 添加以上列表if (esp_now_add_peer(&peerInfo) != ESP_OK){Serial.println("Failed to add peer");return;}
}void loop()
{// 设置发送信息strcpy(myData.a, "THIS IS A CHAR");myData.b = random(1, 20);myData.c = 1.2;myData.d = false;esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&myData, sizeof(myData));  // 发送if (result == ESP_OK){Serial.println("Sent with success");}else{Serial.println("Error sending the data");}delay(5000);
}
// 接收设备代码#include <Arduino.h>
#include <esp_now.h>
#include <WiFi.h>// 接收数据结构体
typedef struct struct_message
{char a[32];int b;float c;bool d;
} struct_message;struct_message myData;// 接收数据回调函数
void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len)
{memcpy(&myData, incomingData, sizeof(myData));Serial.print("Bytes received: ");Serial.println(len);Serial.print("Char: ");Serial.println(myData.a);Serial.print("Int: ");Serial.println(myData.b);Serial.print("Float: ");Serial.println(myData.c);Serial.print("Bool: ");Serial.println(myData.d);Serial.println();
}void setup()
{Serial.begin(115200);WiFi.mode(WIFI_STA); // Wi-Fi Stationif (esp_now_init() != ESP_OK){Serial.println("Error initializing ESP-NOW");return;}// 注册接收数据回调函数esp_now_register_recv_cb(OnDataRecv);
}void loop()
{
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第66题加一

题目&#xff1a; 题解&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:n len(digits)for i in range(n - 1, -1, -1):if digits[i] ! 9:digits[i] 1for j in range(i 1, n):digits[j] 0return digits# digits 中所有的元素均为 9retu…

阿里云API网关 产品的使用笔记

阿里云的产品虽多&#xff0c;还是一如既往的一用一个看不懂&#xff0c;该模块的文档依旧保持“稳定”发挥&#xff0c;磕了半天才全部跑通。 用阿里云API网关的原因是&#xff0c;在Agent中写插件调用API的时候&#xff0c;需要使用Https协议&#xff0c;又嫌搞备案、证书等事…

ASV1000视频监控平台:通过SDK接入海康网络摄像机IPC

目录 一、为何要通过SDK接入海康网络摄像机 &#xff08;一&#xff09;海康网络摄像机的SDK的功能 1、视频采集和显示 2、视频存储 3、视频回放 4、报警事件处理 5、PTZ控制 6、自定义设置 7、扩展功能 &#xff08;二&#xff09;通过SDK接入的好处&#xff08;相对…

ARP欺骗使局域网内设备断网

一、实验准备 kali系统&#xff1a;可使用虚拟机软件模拟 kali虚拟机镜像链接&#xff1a;https://www.kali.org/get-kali/#kali-virtual-machines 注意虚拟机网络适配器采用桥接模式 局域网内存在指定断网的设备 二、实验步骤 打开kali系统命令行&#xff1a;ctrlaltt可快…

nginx--配置文件

组成 主配置文件&#xff1a;nginx.conf 子配置文件&#xff1a;include conf.d/*.conf 协议相关的配置文件&#xff1a;fastcgi uwsgi scgi等 mime.types&#xff1a;⽀持的mime类型&#xff0c;MIME(Multipurpose Internet Mail Extensions)多用途互联⽹网邮件扩展类型&…

Linux服务器常用命令总结

view查找日志关键词 注意日志级别&#xff0c;回车后等一会儿&#xff0c;因为文件可能比较大加载完需要时间 当内容显示出来后&#xff0c;使用“/关键词”搜索 回车就能搜到&#xff0c;n表示查找下一个&#xff0c;N表示查找上一个 find 查找 find Family -name book …

CBCGPStatic 显示图片

初始化代码&#xff1a; // 1、 m_DataPic.SetPicture(IDB_BITMAP1, TRUE, TRUE); //2、 CString strPath L"C:\\Users\\14713\\Desktop\\Example\\Example\\res\\pic.png"; m_DataPic.SetPicture(strPath, TRUE, TRUE); 资源中&#xff1a; / // //…

MVP+敏捷开发

MVP敏捷开发 1. 什么是敏捷开发&#xff1f; 敏捷开发是一种软件开发方法论&#xff0c;旨在通过迭代、自组织的团队和持续反馈&#xff0c;快速响应需求变化并交付高质量的软件。相较于传统的瀑布模型&#xff0c;敏捷开发强调灵活性、适应性和与客户的紧密合作。敏捷开发方…

深入 Django 模型层:数据库设计与 ORM 实践指南

title: 深入 Django 模型层&#xff1a;数据库设计与 ORM 实践指南 date: 2024/5/3 18:25:33 updated: 2024/5/3 18:25:33 categories: 后端开发 tags: Django ORM模型设计数据库关系性能优化数据安全查询操作模型继承 第一章&#xff1a;引言 Django是一个基于Python的开源…

chrome和drive安装包路径

Chrome for Testing availability (googlechromelabs.github.io) 下载Stable下面的包哈

如何低成本创建个人网站?

目录 前言 网站源代码 虚拟主机或服务器 域名注册或免费二级域名 域名解析 上传源代码压缩包 添加刚刚的域名 成功搭建 失败的解决方案 结语 前言 很多小白都非常想拥有自己的网站&#xff0c;但很多人虽然有了自己的源代码但苦于不知道怎么将其变成所有人都能够访…

深度学习中损失函数和激活函数的选择

文章目录 前言 你需要解决什么问题&#xff1f; 你想预测数值吗&#xff1f; 你想预测分类结果吗&#xff1f; 回归&#xff1a;预测数值 分类&#xff1a;预测二元结果 分类&#xff1a;从多个类别中预测单个标签 分类&#xff1a;从多个类别中预测多个标签 总结表 前言 本篇…

使用Neo4j和Langchain创建知识图谱

使用Neo4j和Langchain创建知识图谱 知识图谱是组织和整合信息的强大工具。通过使用实体作为节点和关系作为边缘&#xff0c;它们提供了一种系统的知识表示方法。这种有条理的表示有利于简化查询、分析和推理&#xff0c;使知识图在搜索引擎、推荐系统、自然语言处理和人工智能…

SpringBoot文件上传+拦截器

1、resource static下有个图片&#xff0c;希望浏览器可以查看这个图片 访问&#xff1a; 若yml设置路径&#xff0c;则可以定义在static下才可以访问 classpath代表类路径&#xff0c;都在target下 也就是项目在运行后的resource下的文件都会到classes下去 无需在target下创…

设计模式之业务代表模式

在编程江湖的风雨中漂泊多年&#xff0c;每当我遇到那些错综复杂的业务逻辑和系统交互&#xff0c;总有一个模式像一位忠诚的骑士&#xff0c;默默守护着我的代码城堡&#xff0c;那就是——业务代表模式&#xff08;Business Delegate Pattern&#xff09;。它不是最耀眼的明星…

Spark Structured Streaming 分流或双写多表 / 多数据源(Multi Sinks / Writes)

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测 目录 分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测分类效果基本介绍程序设计参考资料分类效果 基本介绍 MATLAB实现LSSVM最小二乘支持向量机多分类预测。最小二乘支持向量机(Least Squares Support Vecto…

android 分区存储(沙盒存储)适配总结

目录 一、分区存储概念 1.外部存储分类 2.分区存储如何影响文件访问 二、分区适配方案 1. 应用分区存储的文件访问规定 (1).应用专属目录--私有目录 (2).共享目录文件--公有目录 2.MediaStore API介绍 3.Storage Access Framework介绍 三、所有文件访问权限 四、总结…

【开发技巧 | 第二篇】IDEA新增作者信息、方法参数返回值

文章目录 2.IDEA新增作者信息、方法参数返回值2.1类新增作者信息2.2方法新增参数返回信息2.3测试2.3.1新建类2.3.2新建方法 2.IDEA新增作者信息、方法参数返回值 2.1类新增作者信息 打开IDEA的Settings&#xff0c;Editor->Code Style->File and Code Templates->Inc…

LabVIEW鸡蛋品质智能分级系统

LabVIEW鸡蛋品质智能分级系统 随着现代农业技术的飞速发展&#xff0c;精确、高效的农产品质量控制已成为行业的重要需求。其中&#xff0c;鸡蛋作为日常膳食中不可或缺的重要组成部分&#xff0c;其品质直接关系到消费者的健康与满意度。本文设计并实现了一套基于LabVIEW的鸡…