udp - ESP32 接收广播 UDP 数据包时出现问题 (ESP IDF)

标签 udp embedded broadcast esp32 esp-idf

我正在尝试通过单个 ESP32 AP 配置多个连接的 ESP32 站。对我来说,最简单的方法是将单个广播 UDP 数据包发送到 255.255.255.255。但是,我使用开放 UDP 端口进行监听的电台根本没有接收到广播数据。我还需要在站/AP 上配置其他内容才能实现此目的吗?

我已经阅读了一些内容,似乎 lwip/opt.h 可能禁止检测广播数据包,但在设置 IP_SOF_BROADCASTIP_SOF_BROADCAST_RECV 之后,我'没发现什么区别。

这是我当前站的UDP监听任务:

static void udp_listen_task(void *pvParameters)
{

    while (1) {

        struct sockaddr_in dest_addr;
        dest_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        dest_addr.sin_family = AF_INET;
        dest_addr.sin_port = htons(PORT);
        int addr_family = AF_INET;
        int ip_protocol = IPPROTO_IP;
        inet_ntoa_r(dest_addr.sin_addr, addr_str, sizeof(addr_str) - 1);


        int sock = socket(addr_family, SOCK_DGRAM, ip_protocol);
        if (sock < 0) {
            ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
            break;
        }
        //ESP_LOGI(TAG, "Socket created");

        int err = bind(sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
        if (err < 0) {
            ESP_LOGE(TAG, "Socket unable to bind: err %d", err);
        }

        while (1) {

            struct sockaddr_in6 source_addr; 
            socklen_t socklen = sizeof(source_addr);
            int len = recvfrom(sock, &controller_msg, sizeof(controller_msg), 0, (struct sockaddr *)&source_addr, &socklen);

            //Error occurred during receiving
            if (len < 0) {
                ESP_LOGE(TAG, "recvfrom failed: errno %d", errno);
                break;
            }
            // Data received
            else {

                // Get the sender's ip address as string
                if (source_addr.sin6_family == PF_INET) {
                    inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1);
                } else if (source_addr.sin6_family == PF_INET6) {
                    inet6_ntoa_r(source_addr.sin6_addr, addr_str, sizeof(addr_str) - 1);
                }

                // Post event to act on message
                xEventGroupSetBits(conn_evt, CONN_EVT_UDP_RECEIVED);

            }
        }

        if (sock != -1) {
            ESP_LOGE(TAG, "Shutting down socket and restarting...");
            shutdown(sock, 0);
            close(sock);
        }
    }
    vTaskDelete(NULL);
}

最佳答案

看起来您的监听套接字缺少 SO_BROADCAST 选项。创建套接字后,您需要这样的东西:

int bc = 1;
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &bc, sizeof(bc)) < 0) {
    ESP_LOGE(TAG, "Failed to set sock options: errno %d", errno);
    closesocket(sock);
    break;
}

看看这个 example

提示:如果这没有帮助,那么也许您还需要快速检查以验证发送者是否确实正在广播。将计算机连接到同一 WiFi 网络并运行 WireShark 以查看空中的 UDP 数据包。

关于udp - ESP32 接收广播 UDP 数据包时出现问题 (ESP IDF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66103497/

相关文章:

networking - 链接TCP应用程序和UDP应用程序

java - 集群中并发java套接字连接的最大数量是多少?

c++ - 从 stdin 读取输入并准备好接收来自服务器的广播

c - 嵌入式系统(c 代码)中使用的 tdf 文件是什么?

android-intent - 在运行时注册 CATEGORY_HOME 意图

c - 通过 UDP(低数据计划)向 Xively 发送 500 个字节,在 MCU 上使用 C

Node.js - 无法将 udp6 套接字绑定(bind)到特定地址

c++ - 使用UDP套接字发送时如何设置源地址

linux - 部署32位或64位Linux作为嵌入式开发的主机

java - 嵌入式 Java 中的二进制编码十进制数学