完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
参考例程udp_server wifi配置为AP模式
recfrom可以接收到其他连接设备发送的数据,马上sendto 对方也可以收到。 但是没有收到对方数据,主动sento对方,对方无法收到。 请教该如何设置,udp才能主动向外sendto 数据? |
|
相关推荐
1个回答
|
|
要在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 = |
|
|
|
只有小组成员才能发言,加入小组>>
545浏览 6评论
457浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
437浏览 5评论
441浏览 4评论
411浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:02 , Processed in 0.762570 second(s), Total 81, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号