ESP32-UDP通信 (Arduino)

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();
  }
}

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

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

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

相关文章

小程序学习-20

建议每次构建npm之前都先删除miniprogram_npm

第15届蓝桥杯嵌入式省赛准备第三天总结笔记(使用STM32cubeMX创建hal库工程+串口接收发送)

因为我是自己搞得板子&#xff0c;原本的下程序和串口1有问题&#xff0c;所以我用的是串口2&#xff0c;用的PA2和PA3 一&#xff0c;使用CubeMX配置串口 选择A开头的这个是异步通信。 配置串口参数&#xff0c;往届的题基本用的9600波特率&#xff0c;所以我这里设置为9600…

【Linux】解决能访问github但克隆不了的问题

文章目录 1.查看你的代理的地址&#xff1a;2.git设置3.尝试clone 1.查看你的代理的地址&#xff1a; 2.git设置 先看看当前的git设置 $ git config --list然后git中要设置好对应的地址 git config --global http.proxy 127.0.0.1:78903.尝试clone $ git clone https://git…

异或运算的骚操作,由浅入深拿捏一类型的题

文章目录 &#x1f680;前言&#x1f680;异或运算的基本用法&#x1f680;一组数中一种数出现了奇数次&#xff0c;其他种数出现了偶数次&#xff0c;找出这个数&#x1f680;一组数中有两种数出现了奇数次&#xff0c;其他种数出现了偶数次&#xff0c;求这两个数✈️得到一个…

4D毫米波雷达——FFT-RadNet 目标检测与可行驶区域分割 CVPR2022

前言 本文介绍使用4D毫米波雷达&#xff0c;实现目标检测与可行驶区域分割&#xff0c;它是来自CVPR2022的。 会讲解论文整体思路、输入数据分析、模型框架、设计理念、损失函数等&#xff0c;还有结合代码进行分析。 论文地址&#xff1a;Raw High-Definition Radar for Mu…

[pytorch] 2. tensorboard

tensorboard简介 TensorBoard 是一组用于数据可视化的工具。它包含在流行的开源机器学习库 Tensorflow 中.但是也可以独立安装&#xff0c;服务Pytorch等其他的框架 可以常常用来观察训练过程中每一阶段如何输出的 安装pip install tensorboard启动tensorboard --logdir<d…

自定义注解与拦截器实现不规范sql拦截(自定义注解填充插件篇)

在自定义注解与拦截器实现不规范sql拦截&#xff08;拦截器实现篇&#xff09;中提到过&#xff0c;写了一个idea插件来辅助对Mapper接口中的方法添加自定义注解&#xff0c;这边记录一下插件的实现。 需求简介 在上一篇中&#xff0c;定义了一个自定义注解对需要经过where判…

理解PCIE设备透传

PCIE设备透传解决的是使虚拟机直接访问PCIE设备的技术&#xff0c;通常情况下&#xff0c;为了使虚拟机能够访问Hypervisor上的资源&#xff0c;QEMU&#xff0c;KVMTOOL等虚拟机工具提供了"trap and emulate"&#xff0c; Virtio半虚拟化等机制实现。但是这些实现都…

[学习笔记]刘知远团队大模型技术与交叉应用L4-Prompt-learning Delta-learning

Prompt-Learning and Delta-Tunning 背景和概览 但是从T5开始&#xff0c;大模型越来越大了。 微调很难了。 模型的趋势 Model Scaling&#xff1a;模型越来越大 Difficult Tuning&#xff1a;微调越来越难 Prompt-Learning 基本组成与流程介绍 预训练和fine-tuning有一…

数学建模学习笔记||层次分析法

评价类问题 解决评价类问题首先需要想到一下三个问题 我们评价的目标是什么我们为了达到这个目标有哪几种可行方案评价的准则或者说指标是什么 对于以上三个问题&#xff0c;我们可以根据题目中的背景材料&#xff0c;常识以及网上收集到的参考资料进行结合&#xff0c;从而筛…

反欺诈与异常点检测

1. 反欺诈检检测 1.1 反欺诈检测的难点 反诈骗实际是个多分类问题&#xff0c;每种不同的诈骗都当做一种单独的类型。除了欺诈手段多样且持续变化&#xff0c;欺诈检测一般还面临以下问题&#xff1a; 1. 大部分情况下数据是没有标签的&#xff0c;各种成熟的监督学习没有用武…

反序列化字符串逃逸(下篇)

这里承接上篇文章反序列化字符串逃逸&#xff08;上篇&#xff09;-CSDN博客带大家学习反序列化字符串逃逸减少&#xff0c;没有看过的可以先去看看&#xff0c;不会吃亏。 例题&#xff1a; <?php highlight_file(__FILE__); error_reporting(0); function filter($name…

vectorCast基于分类树设计测试用例

根据代码的条件,以图表的形式为大家展示出各个变量组合的等价类划分。性别分为2类,年龄分为3类,工作年数分为3类。 那么它们最全面的组合结果就是2*3*3=18 也就是说它们最多有18种组合情况的测试用例 2.选中该函数,点击右键 3.自动生成一个map的基于分类树的测试用例 4.此…

commit 历史版本记录修正

commit 历史版本记录修正 当 Bug 发生的时候&#xff0c;我们会需要去追踪特定 bug 的历史记录&#xff0c;以查出该 bug 真正发生的原因&#xff0c;这个时候就是版本控制带来最大价值的时候。 因此&#xff0c;要怎样维持一个好的版本记录是非常重要的&#xff0c;下面是一…

机器学习--Matplotlib

机器学习–Matplotlib Matplotlib 是专门用于开发2D图表(包括3D图表)以渐进、交互式方式实现数据可视化 简单的Matplotlib画图 — 以折线图为例 matplotlib.pyplot模块 matplotlib.pytplot包含了一系列类似于matlab的画图函数。 import matplotlib.pyplot as plt图形绘制流…

7.【CPP】String类

一.汉字的编码 我们知道计算机存储英文字母&#xff0c;标点&#xff0c;数字用的是ascall码&#xff0c;128种用一个字节表示绰绰有余。而汉字远远不止128种&#xff0c;因此汉字需要两个字节表示。 1.gbk编码中汉字占两个字节。 2.utf-8中&#xff0c;一个汉字占三个字节。…

Java - 深入四大限流算法:原理、实现与应用

文章目录 Pre概述简单计数器原理实现测试优缺点 滑动窗口算法原理实现测试优缺点 漏桶算法原理实现测试优缺点 令牌桶算法原理实现测试优缺点 小结 Pre 深入理解分布式技术 - 限流 并发编程-25 高并发处理手段之消息队列思路 应用拆分思路 应用限流思路 SpringBoot - 优雅…

(上) C语言中的语句分类及分支语句:if语句、switch语句介绍

目录 前言 一、语句的分类 1. 空语句 2. 表达式语句 3. 函数调用语句 4. 复合语句 5. 控制语句 二、分支语句 1. if语句 (1) if的使用 (2) else的使用 (3) 分支中包含多条语句 (4) 嵌套if (5) 悬空else问题 2. switch语句 (1) if语句和switch语句的对比 (2) s…

摇臂MG995舵机模块实战教程

简介 舵机也叫伺服电机&#xff0c;最早用于船舶上实现其转向功能&#xff0c;由于可以通过程序连续控制其转角&#xff0c;因而被广泛应用智能小车以实现转向以及机器人各类关节运动中。舵机&#xff08;英文叫Servo&#xff09;&#xff1a;它由直流电机、减速齿轮组、传感器…

计算机网络——面试问题

1 从输⼊ URL 到⻚⾯展示到底发⽣了什么&#xff1f; 1. 先检查浏览器缓存⾥是否有缓存该资源&#xff0c;如果有直接返回&#xff1b;如果没有进⼊下⼀ 步⽹络请求。 2. ⽹络请求前&#xff0c;进⾏ DNS 解析 &#xff0c;以获取请求域名的 IP地址 。 3. 浏览器与服务器…