乐鑫技术交流
直播中

刘波

8年用户 1042经验值
私信 关注
[问答]

请问esp32c3 AP模式如何配置udp主动向外sendto数据?

参考例程udp_server wifi配置为AP模式
recfrom可以接收到其他连接设备发送的数据,马上sendto 对方也可以收到。
但是没有收到对方数据,主动sento对方,对方无法收到。
请教该如何设置,udp才能主动向外sendto 数据?

回帖(1)

最强海贼王

2024-6-27 16:49:30
要在ESP32-C3上配置AP模式并使用UDP主动向外发送数据,您需要按照以下步骤操作:

1. 初始化WiFi并设置为AP模式:
首先,您需要初始化WiFi并将其设置为AP(接入点)模式。这可以通过以下代码实现:

```c
#include "esp_wifi.h"
#include "esp_event_loop.h"
#include "esp_log.h"

#define EXAMPLE_WIFI_SSID "ESP32-C3-AP"
#define EXAMPLE_WIFI_PASS "123456789"
#define EXAMPLE_MAX_STA_CONN 10

static const char *TAG = "example";

esp_err_t example_wifi_init_ap()
{
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    esp_err_t ret = esp_wifi_init(&cfg);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "wifi_init failed (%d)", ret);
        return ret;
    }

    esp_event_loop_create_default();

    wifi_config_t wifi_config = {
        .ap = {
            .ssid = EXAMPLE_WIFI_SSID,
            .ssid_len = strlen(EXAMPLE_WIFI_SSID),
            .password = EXAMPLE_WIFI_PASS,
            .max_connection = EXAMPLE_MAX_STA_CONN,
            .authmode = WIFI_AUTH_WPA_WPA2_PSK
        },
    };

    ret = esp_wifi_set_mode(WIFI_MODE_AP);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "esp_wifi_set_mode failed (%d)", ret);
        return ret;
    }

    ret = esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "esp_wifi_set_config failed (%d)", ret);
        return ret;
    }

    ret = esp_wifi_start();
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "esp_wifi_start failed (%d)"), ret;
        return ret;
    }

    return ESP_OK;
}
```

2. 创建UDP服务器:
接下来,您需要创建一个UDP服务器,以便接收来自客户端的数据。这可以通过以下代码实现:

```c
#include "esp_netif.h"
#include "esp_eth.h"
#include "esp_log.h"

#define UDP_SERVER_PORT 1234

static const char *TAG = "example";

void udp_server_task(void *pvParameters)
{
    char *buffer = malloc(1024);
    if (buffer == NULL) {
        ESP_LOGE(TAG, "Failed to allocate memory for buffer");
        return;
    }

    while (1) {
        int bytes_received = recvfrom(sockfd, buffer, 1024, 0, &client_addr, &addr_len);
        if (bytes_received < 0) {
            ESP_LOGE(TAG, "Error occurred during receiving");
        } else {
            ESP_LOGI(TAG, "Received %d bytes from %s:%d", bytes_received, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
        }
    }
}
```

3. 发送UDP数据:
现在,您可以使用`sendto`函数主动向外发送UDP数据。以下是一个示例:

```c
void send_udp_data(const char *data, size_t data_len, struct sockaddr_in *dest_addr)
{
    ssize_t bytes_sent = sendto(sockfd, data, data_len, 0, (struct sockaddr *)dest_addr, sizeof(struct sockaddr_in));
    if (bytes_sent < 0) {
        ESP_LOGE(TAG, "Error occurred during sending");
    } else {
        ESP_LOGI(TAG, "Sent %d bytes to %s:%d", bytes_sent, inet_ntoa(dest_addr->sin_addr), ntohs(dest_addr->sin_port));
    }
}
```

4. 使用示例:
最后,您可以使用以下示例代码来初始化AP模式、创建UDP服务器并发送数据:

```c
void app_main()
{
    example_wifi_init_ap();

    // 创建UDP服务器
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(UDP_SERVER_PORT);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
        return;
    }

    if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        ESP_LOGE(TAG, "Socket unable to bind: errno %d", errno);
        return;
    }

    // 创建UDP服务器任务
    xTaskCreatePinnedToCore(udp_server_task, "udp_server_task", 1024 * 2, NULL, 5, NULL, 0);

    // 发送UDP数据示例
    struct sockaddr_in dest_addr;
    dest_addr.sin_family =
举报

更多回帖

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