项目简介
本项目是基于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】