SP32-C3, esp-idf 4.3.5,udp client 非阻塞式广播循环收发,提供个例程
时间: 2024-01-31 17:03:21 浏览: 143
以下是ESP32-C3上的非阻塞式UDP client循环广播收发的完整示例代码:
```c
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_log.h"
#define BROADCAST_IP "255.255.255.255"
#define BROADCAST_PORT 1234
static const char *TAG = "udp_client";
void wifi_init_sta()
{
tcpip_adapter_init();
ESP_ERROR_CHECK(esp_event_loop_create_default());
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
wifi_config_t wifi_config = {
.sta = {
.ssid = "your_ssid",
.password = "your_password",
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "wifi_init_sta finished.");
}
void udp_client_task(void *pvParameters)
{
// 配置Wi-Fi连接
wifi_init_sta();
// 创建UDP套接字并设置为非阻塞模式
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
fcntl(sock, F_SETFL, O_NONBLOCK);
// 设置广播地址和端口号
struct sockaddr_in broadcast_addr;
memset(&broadcast_addr, 0, sizeof(broadcast_addr));
broadcast_addr.sin_family = AF_INET;
broadcast_addr.sin_port = htons(BROADCAST_PORT);
inet_pton(AF_INET, BROADCAST_IP, &broadcast_addr.sin_addr);
// 设置广播选项
int broadcast_enable = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast_enable, sizeof(broadcast_enable));
while (1) {
// 广播数据包
const char *msg = "Hello, everyone!";
sendto(sock, msg, strlen(msg), 0, (struct sockaddr *)&broadcast_addr, sizeof(broadcast_addr));
// 接收数据包
char buf[1024];
struct sockaddr_in source_addr;
socklen_t socklen = sizeof(source_addr);
int len = recvfrom(sock, buf, sizeof(buf) - 1, 0, (struct sockaddr *)&source_addr, &socklen);
if (len < 0 && errno != EWOULDBLOCK) {
printf("Error receiving data: %d\n", errno);
} else if (len > 0) {
buf[len] = '\0';
printf("Received: %s\n", buf);
}
// 等待一段时间
vTaskDelay(pdMS_TO_TICKS(1000));
}
close(sock);
vTaskDelete(NULL);
}
void app_main()
{
xTaskCreate(udp_client_task, "udp_client_task", 4096, NULL, 5, NULL);
}
```
在该示例中,我们首先配置ESP32-C3的Wi-Fi连接。然后创建一个UDP套接字并将其设置为非阻塞模式。接下来,我们设置广播地址和端口号,并启用SO_BROADCAST选项以进行广播。在一个循环中,我们广播数据包并接收响应。在接收数据包时,如果没有收到数据包,则继续循环。如果接收到数据包,则将其打印到控制台。最后,我们关闭套接字并删除任务。
请注意,该示例仅供参考。您需要根据您的具体要求进行修改和调整。
阅读全文