m0_61770108 2024-06-14 09:05 采纳率: 13.5%
浏览 9
已结题

ONVIF在一个网卡绑定多个IP多播扫描,未扫描到设备

ONVIF在一个网卡绑定多个IP多播扫描,未扫描到设备
多播参数:239.255.255.250:3702
超时为:3秒
使用场景1:一个网卡一个IP,为192.168开头的IP时,可以正常扫描到设备

img

img

使用场景2:一个网卡多个IP:分别为192.168开头 和 128.0.100开头,不能正常扫描到设备
在此场景下,可以ping同摄像头IP,但就是多播扫描不到

img

img

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-14 09:05
    关注

    引自免费微信小程序:皆我百晓生

    针对你所描述的问题,在一个网卡上绑定多个IP进行ONVIF多播扫描时未能发现设备,这可能是由于网络配置、多播组成员资格或应用程序设置的问题。在C++环境下解决此类问题,需要检查以下几个方面:

    网络配置检查

    确保你的系统正确配置了多播功能。在Windows系统中,可以通过ipconfig /all命令查看是否启用了多播功能。如果未启用,可能需要通过网络接口的高级设置手动开启。

    多播组成员资格

    当一个网卡有多个IP时,必须明确指定要加入哪个IP的多播组。在C++中,你可以使用setsockopt函数来设置IP_ADD_MEMBERSHIP选项,这通常涉及创建一个struct ip_mreq结构体并将其传递给setsockopt

    示例代码如下:

    #include <winsock2.h>
    // ...
    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    struct ip_mreq mreq;
    mreq.imr_multiaddr.s_addr = inet_addr("239.255.255.250");
    mreq.imr_interface.s_addr = inet_addr("192.168.1.1"); // 或者 "128.0.100.1"
    int ret = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mreq, sizeof(mreq));
    

    多播TTL与接口选择

    确保多播数据包的TTL(Time To Live)设置正确,以便数据包可以在网络中传播到目标设备。同时,使用正确的接口发送多播数据包,这通常涉及到设置IP_MULTICAST_IF选项。

    // 设置TTL
    int ttl = 1; // 或者更大的数字,取决于你的网络结构
    ret = setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl, sizeof(ttl));
    
    // 设置发送接口
    mreq.imr_interface.s_addr = inet_addr("192.168.1.1"); // 或者 "128.0.100.1"
    ret = setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, (char*)&mreq.imr_interface, sizeof(mreq.imr_interface));
    

    应用程序逻辑检查

    确认你的应用程序正确处理了多播接收和发送。对于ONVIF协议,你需要发送正确的Discovery请求,并监听来自设备的响应。这通常涉及解析SOAP消息和处理HTTP/UDP包。

    路由与防火墙规则

    检查网络路由表和防火墙规则,确保它们不会阻止多播数据包的传输。特别是在有多个IP的情况下,路由规则可能会导致数据包被错误地丢弃或转发。

    调试建议

    • 使用Wireshark或类似工具捕获网络流量,检查是否有数据包丢失或被错误地处理。
    • 确认摄像头和其他设备是否配置为接受并响应多播Discovery请求。
    • 检查是否有其他网络设备(如交换机或路由器)阻止或过滤多播流量。

    通过上述步骤,你应该能够定位并解决在多IP环境下ONVIF多播扫描失败的问题。如果问题仍然存在,进一步的调试可能需要更深入的网络知识或专业工具。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月6日
  • 创建了问题 6月14日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错