ESP32无法接收广播UDP数据包(ESP IDF)

ESP32无法接收广播UDP数据包(ESP IDF),udp,embedded,broadcast,esp32,esp-idf,Udp,Embedded,Broadcast,Esp32,Esp Idf,我正试图通过单个ESP32 AP配置多个已连接的ESP32站点。对我来说,最简单的方法是向255.255.255.255发送一个广播UDP数据包。但是,使用开放UDP端口收听的我的电台根本没有接收广播数据。是否需要在站点/AP上配置其他内容才能实现此功能 我做了一些阅读,看起来lwip/opt.h可能禁止检测广播数据包,但在设置IP SOF_broadcast和IP SOF_broadcast\u RECV之后,我没有看到任何区别 以下是我当前的电台UDP侦听任务: static void ud

我正试图通过单个ESP32 AP配置多个已连接的ESP32站点。对我来说,最简单的方法是向255.255.255.255发送一个广播UDP数据包。但是,使用开放UDP端口收听的我的电台根本没有接收广播数据。是否需要在站点/AP上配置其他内容才能实现此功能

我做了一些阅读,看起来lwip/opt.h可能禁止检测广播数据包,但在设置
IP SOF_broadcast
IP SOF_broadcast\u 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);
}
static void udp\u listen\u任务(void*pvParameters)
{
而(1){
dest\u addr中的结构sockaddr\u;
dest_addr.sin_addr.s_addr=htonl(在任何情况下);
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(port);
int addr_family=AF_INET;
int ip_协议=IPPROTO_ip;
内部地址(目的地址、地址、地址、大小(地址)-1);
int sock=socket(addr_系列、sock_DGRAM、ip_协议);
if(sock<0){
ESP日志(标记“无法创建套接字:错误号%d”,错误号);
打破
}
//ESP_LOGI(标记“已创建套接字”);
int err=bind(sock,(struct sockaddr*)和dest_addr,sizeof(dest_addr));
如果(误差<0){
ESP_LOGE(标记,“套接字无法绑定:错误%d”,错误);
}
而(1){
6源地址中的结构sockaddr\u;
socklen\u t socklen=sizeof(源地址);
int len=recvfrom(sock和controller\u msg,sizeof(controller\u msg),0,(struct sockaddr*)和source\u addr,&socklen);
//接收过程中发生错误
if(len<0){
ESP日志(标记“recvfrom失败:错误号%d”,错误号);
打破
}
//收到的数据
否则{
//以字符串形式获取发件人的ip地址
if(源地址sin6家庭==PF家庭){
inet_ntoa_r(((struct sockaddr_in*)和source_addr)->sin_addr.s_addr,addr_str,sizeof(addr_str)-1;
}else if(source\u addr.sin6\u family==PF\u INET6){
inet6\u ntoa\u r(源地址sin6\u地址,地址str,大小(地址str)-1);
}
//发布事件以根据消息进行操作
xEventGroupSetBits(连接evt、连接evt和接收UDP);
}
}
如果(袜子!=-1){
ESP日志(标签,“关闭插座并重新启动…”);
关机(sock,0);
关闭(袜子);
}
}
vTaskDelete(空);
}

看起来您的监听插座缺少
SO\u广播
选项。创建套接字后,您需要以下内容:

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;
}
intbc=1;
if(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&bc,sizeof(bc))<0){
ESP_LOGE(标记,“设置套接字选项失败:错误号%d”,错误号);
插座;
打破
}
看看这个


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

谢谢!出于某种原因,当我在谷歌上搜索时,很难找到这样一个简单的解决方案!很乐意帮忙。玩得高兴