九、【ESP32开发全栈指南: UDP通信服务端】
一、TCP与UDP核心差异
特性 | TCP | UDP |
---|---|---|
连接方式 | 面向连接 (需三次握手) | 无连接 |
可靠性 | 可靠传输 (重传/排序/校验) | 尽力交付 (不保证可靠性) |
实时性 | 延迟较高 | 低延迟,实时性强 |
传输效率 | 协议开销大 | 头部开销小 (仅8字节) |
连接类型 | 点对点 | 支持广播/多播 |
资源占用 | 高 (需维护连接状态) | 极低 |
📌 关键场景选择:物联网传感器上报(UDP)、OTA升级(TCP)、音视频传输(UDP)
二、ESP32网络栈架构
-
lwIP轻量级TCP/IP栈
- 开源协议栈,专为嵌入式优化
- ESP-IDF修改版本:
esp-lwip
- 支持功能:
- BSD Socket API(推荐)
- Netconn API(不推荐直接使用)
-
核心文档
- ESP-NETIF 编程指南
- lwIP 配置指南
三、BSD Socket API 关键接口
头文件:lwip/sockets.h
函数 | 功能说明 | 返回值 |
---|---|---|
socket() | 创建通信端点 | 套接字描述符 |
bind() | 绑定IP和端口 | 0成功/-1失败 |
recvfrom() | 接收数据(来源地址) | 接收字节数 |
sendto() | 发送数据到指定地址 | 发送字节数 |
setsockopt() | 设置套接字选项(超时/广播等) | 0成功/-1失败 |
close() | 关闭套接字 | 0成功/-1失败 |
⚠️ 重要限制:
select()
通过VFS组件实现poll()
底层调用select()
- 文件操作需使用VFS接口 (
read()/write()
)
四、UDP服务端实现详解
4.1 工作流程
4.2 代码实现
// 配置UDP服务器参数
#define UDP_PORT 3333
#define RX_BUFFER_SIZE 128void udp_server_task(void *pvParameters) {// 1. 创建套接字int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);if (sock < 0) {ESP_LOGE(TAG, "创建套接字失败: errno %d", errno);vTaskDelete(NULL);}// 2. 配置服务器地址struct sockaddr_in server_addr = {.sin_family = AF_INET,.sin_port = htons(UDP_PORT),.sin_addr.s_addr = INADDR_ANY};// 3. 绑定端口if (bind(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {ESP_LOGE(TAG, "绑定失败: errno %d", errno);close(sock);vTaskDelete(NULL);}ESP_LOGI(TAG, "UDP服务已启动, 端口:%d", UDP_PORT);// 4. 数据循环处理char rx_buffer[RX_BUFFER_SIZE];struct sockaddr_in client_addr;socklen_t addr_len = sizeof(client_addr);while (1) {// 接收数据int len = recvfrom(sock, rx_buffer, RX_BUFFER_SIZE - 1, 0,(struct sockaddr *)&client_addr, &addr_len);if (len < 0) {ESP_LOGE(TAG, "接收错误: errno %d", errno);continue;}// 数据处理rx_buffer[len] = '\0';ESP_LOGI(TAG, "收到来自 %s:%d 的 %d 字节数据",inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port),len);// 发送响应 (回显模式)sendto(sock, rx_buffer, len, 0, (struct sockaddr *)&client_addr, addr_len);}close(sock);vTaskDelete(NULL);
}
4.3 关键配置项
menuconfig 设置:
# 启用IPv4
CONFIG_EXAMPLE_IPV4=y# 设置UDP端口
CONFIG_EXAMPLE_PORT=3333# WiFi配置 (Station模式)
CONFIG_ESP_WIFI_SSID="your_SSID"
CONFIG_ESP_WIFI_PASSWORD="your_password"
AP模式初始化:
void wifi_init_softap() {// ... [AP初始化代码]wifi_config_t ap_config = {.ap = {.ssid = "ESP32_UDP_Server",.password = "esp32pass",.max_connection = 4,.authmode = WIFI_AUTH_WPA2_PSK}};ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &ap_config));ESP_ERROR_CHECK(esp_wifi_start());
}
五、模式对比与选择
特性 | Station模式 | AP模式 |
---|---|---|
网络角色 | 连接现有WiFi | 自建热点 |
适用场景 | 设备接入互联网 | 局域网直连调试 |
IP获取 | DHCP (通常) | 固定IP (默认192.168.4.1) |
客户端连接 | 需路由器支持 | 设备直接连接ESP32 |
典型应用 | 云端数据上报 | 设备快速配网 |
✅ 推荐实践:
- 产品环境使用Station模式
- 开发调试使用AP模式避免路由器依赖
- 双模式切换可通过
esp_wifi_set_mode(WIFI_MODE_APSTA)
六、常见问题解决
-
绑定失败 (errno 98)
- 原因:端口被占用或套接字未关闭
- 解决方案:
int opt = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
-
数据接收超时
- 设置接收超时:
struct timeval timeout = { .tv_sec = 5 }; setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
- 设置接收超时:
-
多客户端管理
- UDP无连接状态,需通过
client_addr
区分客户端 - 建议使用白名单机制:
// 校验客户端IP if(client_addr.sin_addr.s_addr != expected_ip) {ESP_LOGW(TAG, "非法客户端访问");continue; }
- UDP无连接状态,需通过
💡 最佳实践总结:
- 使用
SO_BROADCAST
选项开启广播功能- 定期检查套接字有效性 (心跳机制)
- 大数据传输时添加分包序号校验
- 生产环境启用WPA3加密通信
完整示例代码:ESP-IDF UDP示例
相关文章:
九、【ESP32开发全栈指南: UDP通信服务端】
一、TCP与UDP核心差异 特性TCPUDP连接方式面向连接 (需三次握手)无连接可靠性可靠传输 (重传/排序/校验)尽力交付 (不保证可靠性)实时性延迟较高低延迟,实时性强传输效率协议开销大头部开销小 (仅8字节)连接类型点对点支持广播/多播资源占用高 (需维护连接状态)极低…...

靶场(二十)---靶场体会小白心得 ---jacko
老样子开局先看端口,先看http端口 PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 10.0 |_http-title: H2 Database Engine (redirect) | http-methods: |_ Potentially risky methods: TRACE |_http-server-header:…...
【EasyExcel】导出时添加页眉页脚
一、需求 使用 EasyExcel 导出时添加页眉页脚 二、添加页眉页脚的方法 通过配置WriteSheet或WriteTable对象来添加页眉和页脚。以下是具体实现步骤: 1. 创建自定义页眉页脚实现类 public class CustomFooterHandler implements SheetWriteHandler {private final…...

高频通信与航天电子的材料革命:猎板PCB高端压合基材技术解析
—聚酰亚胺/陶瓷基板在5G与航天场景的产业化应用 一、极端环境材料体系:突破温域与频率极限 聚酰亚胺基板(PI)的航天级稳定性 猎板在卫星通信PCB中采用真空层压工艺处理聚酰亚胺基材(Dk≈10.2)&a…...
如何区分 “通信网络安全防护” 与 “信息安全” 的考核重点?
“通信网络安全防护” 与 “信息安全” 的考核重点可以从以下几个方面进行区分: 保护对象 通信网络安全防护:重点关注通信网络系统本身,包括网络基础设施,如路由器、交换机、基站等,以及网络通信链路和相关设备。同…...
Java 中 ArrayList、Vector、LinkedList 的核心区别与应用场景
Java 中 ArrayList、Vector、LinkedList 的核心区别与应用场景 引言 在 Java 集合框架体系中,ArrayList、Vector和LinkedList作为List接口的三大经典实现类,共同承载着列表数据的存储与操作功能。然而,由于底层数据结构设计、线程安全机制以…...

WPF技术体系与现代化样式
目录 1 WPF技术架构解析 1.1 技术演进与定位 1.2 核心机制对比 2 样式与资源系统 2.1 资源(Resource)定义与作用域 2.2 样式(Style)与触发器 3 开发环境配置(.NET 8) 3.1 安装流程 3.2 项目结…...
Redis 与 MySQL 数据一致性保障方案
在高并发场景下,Redis 作为缓存中间件与 MySQL 数据库配合使用时,数据一致性是一个关键挑战。本文将详细探讨如何保障 Redis 与 MySQL 的数据一致性,并结合 Java 代码实现具体方案。 数据不一致的原因分析 在分布式系统中,Redis…...
Sentry 接口返回 Status Code 429 Too Many Requests
Sentry 是一个 开源的错误追踪(Error Tracking)平台,主要用于实时捕获和监控应用程序中的异常、错误日志,并帮助开发者快速定位问题根源。 📌 Sentry 的核心功能 自动捕获异常 自动捕捉 JavaScript、Vue、React、Node.…...
数学建模期末速成 聚类分析与判别分析
聚类分析是在不知道有多少类别的前提下,建立某种规则对样本或变量进行分类。判别分析是已知类别,在已知训练样本的前提下,利用训练样本得到判别函数,然后对未知类别的测试样本判别其类别。 聚类分析 根据样本自身的属性…...

【工具教程】PDF电子发票提取明细导出Excel表格,OFD电子发票行程单提取保存表格,具体操作流程
在企业财务管理领域,电子发票提取明细导出表格是不可或缺的工具。 月末财务结算时,财务人员需处理成百上千张电子发票,将发票明细导出为表格后,通过表格强大的数据处理功能,可自动分类汇总不同项目的支出金额ÿ…...

基于STM32的DHT11温湿度远程监测LCD1602显示Proteus仿真+程序+设计报告+讲解视频
DHT11温湿度远程监测proteus仿真 1. 主要功能2.仿真3. 程序4. 设计报告5. 资料清单&下载链接 基于STM32的DHT11温湿度远程监测LCD1602显示Proteus仿真设计(仿真程序设计报告讲解视频) 仿真图proteus 8.9 程序编译器:keil 5 编程语言:C…...

分类预测 | Matlab实现CNN-BiLSTM-Attention高光谱数据分类预测
分类预测 | Matlab实现CNN-BiLSTM-Attention高光谱数据分类预测 目录 分类预测 | Matlab实现CNN-BiLSTM-Attention高光谱数据分类预测分类效果功能概述程序设计参考资料 分类效果 功能概述 该MATLAB代码实现了一个结合CNN、BiLSTM和注意力机制的高光谱数据分类预测模型&#x…...

微软推出SQL Server 2025技术预览版,深化人工智能应用集成
在Build 2025 大会上,微软向开发者社区开放了SQL Server 2025的测试版本。该版本的技术改进主要涵盖人工智能功能集成、系统性能优化与开发工具链升级三个维度,展示了数据库管理系统在智能化演进方向上的重要进展。 智能数据处理功能更新 新版本的技术亮…...
.net webapi http参数自定义绑定模型
.NET Web API 中 HTTP 参数自定义绑定模型的深度解析 在 .NET Web API 开发里,常规的参数绑定往往能满足大部分需求。不过,当遇到一些特殊情况时,就需要自定义将 HTTP 参数绑定到 action 特定模型参数了。接下来,我们就深入探讨如…...

RocketMQ入门5.3.2版本(基于java、SpringBoot操作)
一、RocketMQ概述 RocketMQ是一款由阿里巴巴于2012年开源的分布式消息中间件,旨在提供高吞吐量、高可靠性的消息传递服务。主要特点有: 灵活的可扩展性 海量消息堆积能力 支持顺序消息 支持多种消息过滤方式 支持事务消息 支持回溯消费 支持延时消…...

使用osqp求解简单二次规划问题
文章目录 一、问题描述二、数学推导1. 目标函数处理2. 约束条件处理 三、代码编写 一、问题描述 已知: m i n ( x 1 − 1 ) 2 ( x 2 − 2 ) 2 s . t . 0 ⩽ x 1 ⩽ 1.5 , 1 ⩽ x 2 ⩽ 2.5 min(x_1-1)^2(x_2-2)^2 \qquad s.t. \ \ 0 \leqslant x_1 \leqslant 1.5,…...
Ubuntu创建修改 Swap 文件分区的步骤——解决嵌入式开发板编译ROS2程序卡死问题
Ubuntu创建修改 Swap 文件分区的步骤——解决嵌入式开发板编译ROS2程序卡死问题 1. 问题描述2. 创建 / 修改 Swap 分区2.1 创建 Swap 文件 (推荐)2.2 使用 Swap 分区 (如果已经存在) 3. 注意事项 同步发布在个人笔记Ubuntu创建修改 Swap 文件分区的步骤——解决嵌入式开发板编译…...

【C语言】通用统计数据结构及其更新函数(最值、变化量、总和、平均数、方差等)
【C语言】通用统计数据结构及其更新函数(最值、变化量、总和、平均数、方差等) 更新以gitee为准: gitee 文章目录 通用统计数据结构更新函数附录:压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转换什…...

Spring AI(10)——STUDIO传输的MCP服务端
Spring AI MCP(模型上下文协议)服务器Starters提供了在 Spring Boot 应用程序中设置 MCP 服务器的自动配置。它支持将 MCP 服务器功能与 Spring Boot 的自动配置系统无缝集成。 本文主要演示支持STDIO传输的MCP服务器 仅支持STDIO传输的MCP服务器 导入j…...

Sklearn 机器学习 缺失值处理 填充数据列的缺失值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 💡使用 Scikit-learn 处理数据缺失值的完整指南 在机器学习项目中,数据缺失是不可避…...

猜字符位置游戏-position gasses
import java.util.*;public class Main {/*字符猜位置游戏;每次提交只能被告知答对几个位置;根据提示答对的位置数推测出每个字符对应的正确位置;*/public static void main(String[] args) {char startChar A;int gameLength 8;List<String> ballList new ArrayList&…...

宝塔安装配置FRP
FRP(Fast Reverse Proxy)作为一款高性能的反向代理应用,能够帮助我们轻松实现内网穿透,将内网服务暴露到公网,满足远程访问、开发调试等多种需求。宝塔面板以其简洁易用的界面和强大的功能,成为众多站长和开…...
元器件基础学习笔记——结型场效应晶体管 (JFET)
场效应晶体管(Field Effect Transistor,FET)简称场效应管,是一种三端子半导体器件,它根据施加到其其中一个端子的电场来控制电流的流动。与双极结型晶体管 (BJT) 不同,场效应晶体管 …...

tableau 实战工作场景常用函数与LOD表达式的应用详解
这是tableau实战工作场景图表制作第七期--常用函数与LOD表达式的应用 数据资源已经与这篇博客捆绑,有需要者可以下载通过网盘分享的文件:3.2-8月成交数据.xlsx等3个文件 链接: https://pan.baidu.com/s/17WtUoZTqzoNo5kTFjua4hw?pwd0623 提取码: 06…...
智能终端与边缘计算按章复习
第1章:智能终端与边缘计算概述 简述计算机网络和Web技术发展过程中,信息和运算从用户本地向Web服务器迁移的趋势,并解释这一过程如何逐步形成了如今的云计算形态。 随着计算机网络和Web技术的不断发展,信息和运算的重心发生了显著…...
C#面试问题61-80
66. What is reflection? 反射是一种机制,它使我们能够编写可以检查应用程序中所 用类型的代码。例如,调用名称与给定字符串相等的方法,或者列出属于给定 对象的所有字段及其值。 在 Convert 方法中,我们根本不知道处理的是什么…...
分布式Session处理的五大主流方案解析
在分布式环境下,Session 处理的核心挑战是确保用户请求在不同服务器间流转时能保持会话状态一致。以下是主流解决方案及优缺点分析: 🔐 一、集中存储方案(主流推荐) Redis/Memcached 存储 原理:将 Session…...
C++ 中的 const 知识点详解,c++和c语言区别
目录 一。C 中的 const 知识点详解1. 基本用法1.1) 定义常量1.2) 指针与 const 2. 函数中的 const2.1)const 参数2.2)const 成员函数 3. 类中的 const3.1)const 成员变量3.2)const 对象 4. const 返回值5. …...

《PyTorch:开启深度学习新世界的魔法之门》
一、遇见 PyTorch:深度学习框架新星登场 在当今的技术领域中,深度学习已然成为推动人工智能发展的核心动力,而深度学习框架则是这场技术革命中的关键工具。在众多深度学习框架里,PyTorch 以其独特的魅力和强大的功能,迅速崛起并占据了重要的地位,吸引着无数开发者和研究者…...