如何解决ESP32 无法接收广播 UDP 数据包 (ESP IDF)
我正在尝试通过单个 ESP32 AP 配置多个连接的 ESP32 站。对我来说,最简单的方法是向 255.255.255.255 发送一个广播 UDP 数据包。但是,我使用开放 UDP 端口侦听的站点根本没有接收广播数据。我还需要在工作站/AP 上配置其他什么东西才能实现这一点吗?
我读了一点,似乎 lwip/opt.h 可能一直在禁止检测广播数据包,但在设置 IP_SOF_BROADCAST
和 IP_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),(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,sizeof(addr_str) - 1);
} else if (source_addr.sin6_family == PF_INET6) {
inet6_ntoa_r(source_addr.sin6_addr,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 数据包。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。