乐鑫技术交流
直播中

李建设

7年用户 1355经验值
私信 关注
[问答]

如何利用ESP32C3做UDP的服务器?

请教一下,我利用了ESP32C3 建立了Soft AP ,我想利用ESP32C3做UDP的服务器。热点的建立,参考例程都没有问题。关键是如何形成UDP的服务器。教程有教如何制作成TCP的服务器。。但是 listen_sock = socket(addr_family, SOCK_DGRAM, ip_protocol),中间的变量换成 SOCK_DGRAM,这个是配置UDP的。到了linse的时候, listen(listen_sock, 1);这条语句无法通过,我打印了一下,Error occurred during listen: errno 95。打印信息是这个(如果配置TCP服务器,这条语句是没有问题的。),请问。我如何才能配置成UDP的服务器。谢谢。例外,我使用的IDF是V4.4.4.

回帖(1)

fdvcxhtg

2024-6-12 17:34:43
要使用ESP32C3作为UDP服务器,您需要遵循以下步骤。首先,确保您已经成功建立了Soft AP。接下来,我们将使用ESP-IDF开发框架来创建一个UDP服务器。

1. 配置ESP-IDF环境:
确保您已经安装了ESP-IDF开发框架。如果没有,请访问 https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/get-started/index.html 并按照指南安装。

2. 创建一个新的ESP-IDF项目:
在您喜欢的IDE中创建一个新的ESP-IDF项目,例如Visual Studio Code。

3. 编写UDP服务器代码:
在您的项目中,创建一个新的C文件,例如`udp_server.c`,并添加以下代码:

```c
#include
#include
#include
#include
#include
#include

#define UDP_SERVER_PORT 1234

static const char *TAG = "UDP_SERVER";

void udp_server_task(void *pvParameters)
{
    int listen_sock = -1;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    socklen_t client_addr_len = sizeof(client_addr);
    char buffer[1024];

    listen_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (listen_sock < 0) {
        ESP_LOGE(TAG, "Error occurred during socket creation: errno %d", errno);
        return;
    }

    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(UDP_SERVER_PORT);

    if (bind(listen_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        ESP_LOGE(TAG, "Error occurred during bind: errno %d", errno);
        close(listen_sock);
        return;
    }

    while (1) {
        memset(buffer, 0, sizeof(buffer));
        int bytes_received = recvfrom(listen_sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &client_addr_len);
        if (bytes_received < 0) {
            ESP_LOGE(TAG, "Error occurred during recvfrom: errno %d", errno);
            continue;
        }

        ESP_LOGI(TAG, "Received %d bytes from %s:%d", bytes_received, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
        ESP_LOGI(TAG, "Data: %s", buffer);

        // Process the received data and send a response if needed
        // ...
    }

    close(listen_sock);
}

void app_main()
{
    ESP_LOGI(TAG, "Starting UDP server...");
    xTaskCreate(&udp_server_task, "udp_server_task", 4096, NULL, 5, NULL);
}
```

4. 配置项目:
在`sdkconfig`文件中,确保启用了以下选项:
```
CONFIG_LWIP_IPV4=y
CONFIG_LWIP_UDP=y
```

5. 编译并烧录到ESP32C3:
使用ESP-IDF构建系统编译您的项目,并将生成的二进制文件烧录到ESP32C3开发板上。

6. 测试UDP服务器:
使用网络工具(如Wireshark或在线UDP测试工具)向ESP32C3的IP地址发送UDP数据包。您应该能够在ESP32C3的串行控制台中看到接收到的数据。

注意:在您的代码中,`listen()`函数是不必要的,因为UDP是无连接的协议。您应该直接使用`recvfrom()`和`sendto()`函数来接收和发送数据。

通过以上步骤,您应该能够成功创建一个基于ESP32C3的UDP服务器。如果遇到任何问题,请检查您的网络配置和ESP32C3的串行输出,以便找到可能的错误。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分