littlebot
Published on 2025-04-03 / 2 Visits
0

【源码】基于ESP32 IDF的UDP服务器示例

项目简介

本项目是基于ESP32 IDF框架的UDP服务器示例,包含C语言编写的UDP服务器以及Python编写的测试脚本。借助此示例,可学习在ESP32上创建简单UDP服务器,并使用Python脚本进行测试。

项目的主要特性和功能

  • UDP服务器:采用ESP32 IDF框架编写,监听3333端口,接收数据并回发。
  • Python测试脚本:用于测试UDP服务器,向服务器发送数据并接收响应。

安装使用步骤

1. 环境准备

确保已安装ESP32 IDF开发环境,且VSCode中安装了Espressif IDF插件。

2. 创建项目

在VSCode中使用Espressif IDF插件创建新项目,选择hello_world模板。

3. 编写UDP服务器代码

将以下C语言代码复制到项目中,命名为udp_server.c: ```c

include "freertos/FreeRTOS.h"

include "freertos/task.h"

include "esp_system.h"

include "esp_log.h"

include "esp_wifi.h"

include "lwip/ip_addr.h"

include "lwip/sockets.h"

define UDP_SERVER_PORT 3333

define BUF_SIZE 1024

static void udp_server_task(void *pvParam) { int sockfd; struct sockaddr_in server_addr, client_addr; char buffer[BUF_SIZE]; socklen_t addr_len = sizeof(client_addr);

sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
    ESP_LOGI("UDP Server", "Failed to create socket");
    return;
}

server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(UDP_SERVER_PORT);

if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
    ESP_LOGI("UDP Server", "Failed to bind socket");
    close(sockfd);
    return;
}

while (1) {
    int bytes_read = recvfrom(sockfd, buffer, BUF_SIZE, 0, (struct sockaddr*)&client_addr, &addr_len);
    if (bytes_read < 0) {
        ESP_LOGI("UDP Server", "Failed to receive data");
        continue;
    }

    ESP_LOGI("UDP Server", "Received: %s", buffer);

    // Echo back the received data
    sendto(sockfd, buffer, bytes_read, 0, (struct sockaddr*)&client_addr, addr_len);
}

}

void app_main(void) { xTaskCreate(&udp_server_task, "udp_server_task", 4096, NULL, 5, NULL); } ```

4. 编译和上传

在VSCode中使用以下命令编译和上传代码到ESP32: shell idf.py build idf.py -p /dev/ttyUSB0 flash

5. 运行Python测试脚本

将以下Python代码保存为example_test.py,并在另一台计算机上运行: ```python import os import socket import sys

def udp_client(address, payload): try: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(5) s.sendto(payload.encode(), (address, 3333)) data, addr = s.recvfrom(1024) s.close() return data.decode() except Exception as e: print(f"Error: {e}") return None

def test_udp_server(address): payload = "Hello, UDP Server!" response = udp_client(address, payload) if response: print(f"Received response: {response}") else: print("No response received.")

if name == 'main': if len(sys.argv) > 1: test_udp_server(sys.argv[1]) else: print("Usage: python example_test.py ") 运行脚本时,提供ESP32的IP地址作为参数:shell python example_test.py 192.168.1.100 ```

6. 验证结果

若一切正常,Python脚本应输出从ESP32 UDP服务器接收到的响应。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】