ESP32-UDP通信 (Arduino)

news2024/10/2 8:31:52

ESP32配置UDP通信

介绍


用户数据报协议UDP

UDP(User Datagram Protocol)是一种在计算机网络中常用的传输层协议,它与TCP(Transmission Control Protocol)一样属于传输层协议的一种。UDP主要用于在网络中传输数据,但与TCP不同,它是一种面向无连接的协议,不提供可靠性、流控制和错误恢复等特性。

以下是TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)的一些主要对比特点:

特点TCPUDP
连接方式面向连接面向无连接
可靠性提供可靠的数据传输,保证数据的完整性、顺序性不提供数据可靠性保障,无顺序保证
流控制提供流量控制机制,避免网络拥塞不提供流量控制,数据发送不受限制
差错检测与恢复提供差错检测和自动重传机制,确保数据的正确传输不提供差错检测和重传,数据可能丢失或损坏
适用场景文件传输、网页浏览等对可靠性要求较高的应用实时性要求较高的应用,如音频、视频传输
顺序保证保证数据包的顺序传输不保证数据包的顺序传输
连接建立和断开三次握手建立连接,四次挥手断开连接无连接建立和断开过程
面向字节是的,以字节为单位进行数据传输是的,以字节为单位进行数据传输
开销较高,需要维护连接状态、流控制等较低,无连接状态维护,适用于实时性要求高的应用
适用性适用于对可靠性要求较高的应用适用于对实时性要求较高的应用

总而言之,TCP适用于需要可靠性和顺序性的应用,而UDP适用于对实时性要求较高、能够容忍一定数据丢失的应用。

四层网络模型

请添加图片描述
TCP/IP 四层网络协议体系结构,用于指导互联网上数据的传输和通信。该模型的四个层次分别是:

  1. 链路层 (Link Layer):

    • 功能:负责定义与物理网络介质的接口,处理通过该介质的原始比特流。该层通常包括设备驱动程序和网络接口卡 (NIC)。
    • 协议:通常使用的协议包括以太网 (Ethernet)、Wi-Fi、PPP (Point-to-Point Protocol) 等。
  2. 网络层 (Internet Layer):

    • 功能:负责在不同网络之间路由数据包,实现源到目标主机的数据传输。这一层的主要目标是确保数据从源主机传输到目标主机,即实现端到端的通信。
    • 协议:主要协议是 Internet Protocol (IP),包括 IPv4 和 IPv6。
  3. 传输层 (Transport Layer):

    • 功能:提供端到端的通信,负责数据的分段、重组和流量控制。该层主要确保数据在源和目标主机之间的可靠传输。
    • 协议:主要协议包括 Transmission Control Protocol (TCP) 和 User Datagram Protocol (UDP)。
  4. 应用层 (Application Layer):

    • 功能:提供网络服务和应用程序之间的接口,允许用户访问网络上的各种服务。这一层包含了各种应用层协议,支持不同的网络应用。
    • 协议:包括常见的应用层协议如 Hypertext Transfer Protocol (HTTP)、File Transfer Protocol (FTP)、Simple Mail Transfer Protocol (SMTP) 等。

基本方法


ESP32的基本UDP设置流程:

  1. 引入库文件: 引入必要的网络功能库文件<WiFi.h>

    #include <Arduino.h>
    #include <WiFi.h>
    
  2. 声明UDP对象: 使用WiFiUDP类声明一个UDP对象,该对象将用于处理UDP通信。

    WiFiUDP udp;
    
  3. 设置WiFi连接:setup函数中,配置ESP32的WiFi连接。将ESP32设置为SoftAP(访问点)模式,并指定SSID和密码。

    WiFi.softAP("ESP32_UDP", "987654321");
    
  4. 初始化UDP:setup函数中,使用udp.begin(port)初始化UDP。这里的port参数指定UDP服务器监听的端口号。

    udp.begin(1133);
    
  5. 串口打印IP地址(可选):setup函数中,可以使用Serial.println(WiFi.softAPIP())将分配给SoftAP的IP地址打印到串口监视器,以便调试和验证连接。

    Serial.println(WiFi.softAPIP());
    
  6. 处理UDP数据:loop函数中,使用udp.parsePacket()检查是否有传入的UDP数据包。如果有,可以使用udp.read()读取数据,并进行相应的处理。这里我将读取到的数据回发给客户端。

    if (udp.parsePacket()) {
      char val = udp.read();
      // 处理接收到的数据
      // 回发数据给客户端
      udp.beginPacket(udp.remoteIP(), udp.remotePort());
      udp.println(val);
      udp.endPacket();
    }
    
    1. udp.beginPacket(udp.remoteIP(), udp.remotePort());

      • beginPacket()函数用于开始构建UDP数据包,指定了目标设备的IP地址和端口号。
      • udp.remoteIP()用于获取远程设备的IP地址。
      • udp.remotePort()用于获取远程设备的端口号。
    2. udp.println(val);

      • println()函数用于将数据写入UDP数据包。在这里,它将变量 val 的值写入数据包。
      • udp对象是已经声明的WiFiUDP对象,它管理UDP通信。
    3. udp.endPacket();

      • endPacket()函数用于结束UDP数据包的构建,并将数据包发送到之前指定的远程设备的IP地址和端口号。

    这三行代码一起完成了以下操作:

    • 开始构建一个UDP数据包,指定目标设备的IP地址和端口号。
    • 将数据写入UDP数据包,这里是将变量 val 的值写入。
    • 结束UDP数据包的构建,并将数据包发送到远程设备。

这样,ESP32通过UDP协议回发了接收到的数据给远程设备。要注意的是在UDP通信设备之间可以交换数据包 而无需先建立连接。

当读取多个字节时

修改代码:

void loop() {
  if (udp.parsePacket()) {
    char* val = new char[256];  // 使用 new 动态分配一个数组,假设你想读取最多 255 个字节,为 null 终止符留下空间
    int bytesRead = udp.read(val, 255);  // 读取最多 255 个字节

    val[bytesRead] = '\0';  // 加上 null 终止符

    // 处理并打印接收到的数据
    Serial.println(val);

    // 将接收到的数据发送回客户端
    udp.beginPacket(udp.remoteIP(), udp.remotePort());
    udp.write(val, bytesRead);
    udp.endPacket();

    delete[] val;  // 使用 delete[] 释放动态分配的数组内存
  }
}

修改后的代码中:

  • 使用 new char[256]; 动态分配了一个数组来存储接收到的数据。
  • udp.read(val, 255); 读取最多 255 个字节,确保有空间容纳 null 终止符。
  • 添加 val[bytesRead] = '\0'; 来添加 null 终止符,使其适用于使用 Serial.println 打印。
  • 使用 delete[] val; 来释放使用 new 分配的数组内存。

请注意,在使用 new 动态分配内存后,必须使用 deletedelete[] 进行释放,以防止内存泄漏。

常用API


以下是Arduino ESP32中涉及UDP通信的一些关键API的总结:

  1. WiFiUDP类:

    • WiFiUDP类用于处理UDP通信。
    • 成员函数:
      • begin(port): 初始化UDP并指定监听的端口号。
      • beginPacket(ip, port): 打包一个UDP数据包准备将数据发送到指定的IP地址和端口。
      • endPacket(): 结束UDP数据包,发送数据到指定的IP地址和端口。
      • write(data, size): 将指定大小的数据写入UDP数据包。
      • parsePacket(): 检查是否有新的UDP数据包到达。
      • read(): 读取一个字节的数据。
      • remoteIP(): 获取远程设备的IP地址。
      • remotePort(): 获取远程设备的端口号。
  2. WiFi类:

    • WiFi类用于处理ESP32的WiFi连接。
    • 成员函数:
      • softAP(ssid, password): 将ESP32设置为SoftAP模式,并指定SSID和密码。
      • softAPIP(): 获取分配给SoftAP的IP地址。
  3. Serial类(用于调试):

    • Serial类用于在串口监视器上打印调试信息。
    • 成员函数:
      • begin(baud): 初始化串口通信,并指定波特率。
      • println(data): 将数据打印到串口监视器并换行。

这些API提供了在ESP32上设置和使用UDP通信所需的基本功能。通过这些函数,可以初始化UDP,发送和接收数据,处理连接,以及在串口监视器上输出调试信息。更详细的介绍请查看Arduino-ESP32手册

完整程序和测试效果


#include <Arduino.h>
#include <WiFi.h>

WiFiUDP udp;  //声明UDP对象,服务端开启,监听

void setup() {
  WiFi.softAP("ESP32_UDP","987654321");
  udp.begin(1133);
  Serial.begin(115200);
  //串口打印AP-IP
  Serial.println(WiFi.softAPIP());
}

void loop() {
  //接收发送过来的UDP数据
  if(udp.parsePacket()){
    char val=udp.read(); //读取一个字节
    Serial.println(val);
    
	//读取多个字节
    // char* val;
    // udp.read(val,255);
    // Serial.println(val);
    
    //将接收到的数据处理在回发
    udp.beginPacket(udp.remoteIP(),udp.remotePort());
    udp.println(val);
    udp.endPacket();
  }
}

串口发送且得到返回
在这里插入图片描述

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

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

相关文章

算法每日一题: 分割数组的最大值 | 动归 | 分割数组 | 贪心+二分

Hello&#xff0c;大家好&#xff0c;我是星恒 呜呜呜&#xff0c;今天给大家带来的又是一道经典的动归难题。 题目&#xff1a;leetcode 410给定一个非负整数数组 nums 和一个整数 k &#xff0c;你需要将这个数组分成 k_ 个非空的连续子数组。设计一个算法使得这 k _个子数组…

【Linux】第三十三站:日志

文章目录 一、实现一个简单的日志1.简介2.可变参数3.错误等级4.时间5.打印每一条参数6.与前面的一些代码搭配使用 二、完整代码 一、实现一个简单的日志 1.简介 我们运行代码的时候&#xff0c;我们希望有各种各样的运行时候的一些信息。这也就是日志 它一半有日志时间&…

Python 字符串不可变性的优缺点

随着计算机技术的快速发展&#xff0c;越来越多的编程语言被发明出来&#xff0c;每种编程语言都有自己独特的特点和优势。以我经常使用python写爬虫为例&#xff0c;在 Python 中&#xff0c;字符串是不可变的&#xff0c;这意味着一旦字符串被创建&#xff0c;就不能被修改。…

【机组】微程序控制单元实验的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1f33a;一、 实验目…

Laykefu客服系统 任意文件上传漏洞复现

0x01 产品简介 Laykefu 是一款基于workerman+gatawayworker+thinkphp5搭建的全功能webim客服系统,旨在帮助企业有效管理和提供优质的客户服务。 0x02 漏洞概述 Laykefu客服系统/admin/users/upavatar.html接口处存在文件上传漏洞,而且当请求中Cookie中的”user_name“不为…

嵌入式C语言基本编写规范

最重要的一条规则 编写代码时最重要的一条规则是&#xff1a;检查周围的代码并尝试模仿它。 作为维护人员&#xff0c;如果收到的补丁明显与周围代码的编码风格不同&#xff0c;这是令人沮丧的。这是不尊重人的&#xff0c;就像某人穿着泥泞的鞋子走进一间一尘不染的房子。 …

RT-Thread 17. 中断发送信号量后线程去处理信号量

1. 代码 //sem.c #include <rtthread.h> #include <rtdevice.h> #include "drv_gpio.h"#define THREAD_PRIORITY 25 #define THREAD_TIMESLICE 5#define LED3_PIN GET_PIN(B, 3) ALIGN(RT_ALIGN_SIZE) static char thread3_stack[1024]; static struct…

2023 IoTDB Summit:北京城建智控科技股份有限公司高级研发主管刘喆《IoTDB在城市轨道交通综合监控系统中的应用》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

CRM是什么软件?

阅读本文&#xff0c;你将了解&#xff1a;一、CRM是什么软件&#xff1b;二、CRM软件如何进行客户管理&#xff1b;三、CRM软件有什么价值&#xff1b;四、优秀案例分享。 一、CRM是什么软件 CRM&#xff08;Customer Relationship Management&#xff0c;客户关系管理&…

用pandas实现用前一行的excel的值填充后一行

今天接到一份数据需要分析&#xff0c;数据在一个excel文件里&#xff0c;内容大概形式如下&#xff1a; 后面空的格子里的值就是默认是前面的非空的值&#xff0c;由于数据分析的需要需要对重复的数据进行去重&#xff0c;去重就需要把控的cell的值补上&#xff0c;然后根据几…

最佳 C++ 编译器

我喜欢 C&#xff0c;这已经不是什么秘密。我偏爱 C 的一个原因是&#xff0c;C 是一个“开放”的编程语言&#xff0c;任何人都可以使用自己喜欢的编译器。当然&#xff0c;C 编译器的种类也很多。同样&#xff0c; C IDE 也不少&#xff0c;我在之前的一个博客中讨论过这个话…

深度了解六西格玛培训:用MINITAB软件优化数据处理和项目管理——张驰咨询

在追求卓越的道路上&#xff0c;六西格玛培训不仅是一种管理哲学&#xff0c;更是一套科学精细的工具箱。它起源于摩托罗拉的制造车间&#xff0c;但如今它的精粹已经应用到各个行业&#xff0c;无论规模大小&#xff0c;都在追求完美的产品和服务质量。 在张驰咨询&#xff0…

SwiftUI 纯手工打造 100% 可定制的导航栏

功能需求 何曾几时,我们是否也厌倦了 SwiftUI 界面中刻板守旧的导航栏外观,而想要自己动手充分展示灵动炸裂的创造力呢? 如上图所示:我们在 SwiftUI 中通过纯手工打造了一款 100 在本篇博文中,您将学到以下内容 功能需求1. 导航栏基本结构2. 如何感知当前发生用户拖拽行为…

Unity SRP 管线【第五讲:URP烘培光照】

本节&#xff0c;我们将跟随数据流向讲解UEP管线中的烘培光照。 文章目录 一、URP烘培光照1. 搭建场景2. 烘培光照参数设置MixedLight光照设置&#xff1a;直观感受 Lightmapping Settings参数设置&#xff1a; 3. 我们如何记录次表面光源颜色首先我们提取出相关URP代码&#…

ctfshow-反序列化(web267-web270)

目录 web267 web268 web269 web270 总结 web267 页面用的什么框架不知道 看源码看一下 框架就是一种软件工具&#xff0c;它提供了一些基础功能和规范&#xff0c;可以帮助开发者更快地构建应用程序。比如Yii框架和ThinkPHP框架就是两个流行的PHP框架&#xff0c;它们提供…

基于Java SSM框架实现共享充电宝管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现共享充电宝管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于共享充电宝管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带…

开年安全锦囊|保护现代Web应用程序的 7 大关键举措

Web 应用和 API 已成为构建业务关键型应用程序的首选工具&#xff0c;而这些应用程序不但面临着多云环境、新兴架构等带来的复杂性&#xff0c;也受到愈加严峻的暴力破解、信息泄露、会话劫持、跨站脚本、注入攻击等安全挑战。 现代 Web 应用程序防护七大关键 对于安全专业人员…

SpringSecurity(11)——核心组件和认证流程

获取用户信息 // 获取安全上下文对象&#xff0c;就是那个保存在 ThreadLocal 里面的安全上下文对象 // 总是不为null(如果不存在&#xff0c;则创建一个authentication属性为null的empty安全上下文对象) SecurityContext securityContext SecurityContextHolder.getContext(…

免费的WordPress插件大全

在当今数字化的时代&#xff0c;拥有一个强大的在线存在变得至关重要。而对于使用WordPress建站的用户来说&#xff0c;插件是提高网站功能的关键。在这篇文章中&#xff0c;我们将为您推荐三款免费的WordPress插件&#xff0c;它们不仅是147SEO软件中的佼佼者&#xff0c;而且…

makefile的机制,执行命令的流程分析

makefile的机制&#xff0c;流程分析 calc:add.o sub.o multi.ogcc add.o sub.o multi.o calc.cpp -o calcadd.o:add.cppgcc -c add.cpp -o add.osub.o:sub.cppgcc -c sub.cpp -o sub.omulti.o:multi.cppgcc -c multi.cpp -o multi.oclean:rm -rf *.o calc按照这个例子分析&am…