18、ESP32 ESP-NOW 点对点通信

news/2024/11/10 16:25:59/

        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.ppmy.cn/news/1453409.html

相关文章

【软测学习笔记】MySQL入门Day04

&#x1f31f;博主主页&#xff1a;我是一只海绵派大星 &#x1f4da;专栏分类&#xff1a;软件测试笔记 &#x1f4da;参考教程&#xff1a;黑马教程❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、空判断 二、where 子句在 update 与 delete 语句中同样有效 三、ord…

本地搭建llama大模型及对话UI

环境说明&#xff1a;MBP 2023 M2Pro芯片 用到的工具/组件/技术&#xff1a;ollama、llama3:8b、docker、open-webui 1.下载ollama ollama官网下载地址&#xff1a;https://ollama.com/download 到ollama官网地址下载对应操作系统版本的ollama平台&#xff0c;按照安装指引…

QPS(Queries Per Second)和TPS(Transactions Per Second)的介绍和区别

QPS&#xff08;Queries Per Second&#xff09;和TPS&#xff08;Transactions Per Second&#xff09;是衡量计算系统性能的两个指标&#xff0c;它们分别代表了系统每秒可以处理的查询数和事务数。虽然这两个术语在某些情况下可以互换使用&#xff0c;但它们在技术上有所区别…

多模态大模型是新一代人工智能技术范式

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

代码随想录算法训练营第四十二天

我家娃可太好看了&#xff0c;有点担心月嫂走了没法照顾娃。 明天没有新的题&#xff0c;所以我今天开个头吧。又懒了。 01背包问题 二维 思路看了一遍&#xff0c;默写一下哈。甚至看了两遍&#xff0c;但是还没开始搞。。。振作起来&#xff01;&#xff01;&#xff01; 目…

【论文阅读笔记】Order Matters(AAAI 20)

个人博客地址 注&#xff1a;部分内容参考自GPT生成的内容 论文笔记&#xff1a;Order Matters&#xff08;AAAI 20&#xff09; 用于二进制代码相似性检测的语义感知神经网络 论文:《Order Matters: Semantic-Aware Neural Networks for Binary Code Similarity Detection》…

深度解析Java 9核心新特性

码到三十五 &#xff1a; 个人主页 < 免责声明 > 避免对文章进行过度解读&#xff0c;因为每个人的知识结构和认知背景都不同&#xff0c;没有一种通用的解决方案。对于文章观点&#xff0c;不必急于评判。融入其中&#xff0c;审视自我&#xff0c;尝试从旁观者角度认清…

Linux的基础IO:文件系统

目录 学前补充 磁盘的存储结构 OS如何对磁盘的存储进行逻辑抽象 细节内容 学前补充 问题&#xff1a;计算机只认二进制&#xff0c;即0、1&#xff0c;什么是0、1&#xff1f; 解释&#xff1a;0、1在物理层面可能有不同的表现&#xff0c;0、1是数字逻辑&#xff0c;可以…