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

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

ONVIF在一个网卡绑定多个IP多播扫描,未扫描到设备
多播参数:239.255.255.250:3702
超时为:3秒
搜索设备源码如下:

#define SOAP_MCAST_ADDR "soap.udp://239.255.255.250:3702"                       // onvif规定的组播地址

#define SOAP_ITEM       ""                                                      // 寻找的设备范围
#define SOAP_TYPES      "dn:NetworkVideoTransmitter"                            // 寻找的设备类型

#define SOAP_SOCK_TIMEOUT    (3)                                               // socket超时时间(单秒秒)

int onvif_comm::ONVIF_DetectDevice()
{
    int i;
    int result = 0;
    struct soap *soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT);                                                   // soap????????
    struct wsdd__ProbeType      req;                                            // ???????Probe???
    struct __wsdd__ProbeMatches rep;                                            // ???????Probe???
    struct wsdd__ProbeMatchType *probeMatch;

    //SOAP_ASSERT(NULL != (soap = ONVIF_soap_new(SOAP_SOCK_TIMEOUT)));

    ONVIF_init_header(soap);                                                    // ????????????
    ONVIF_init_ProbeType(soap, &req);                                           // ?????????豸???Χ??????
    result = soap_send___wsdd__Probe(soap, SOAP_MCAST_ADDR, NULL, &req);        // ???鲥?????Probe???
    while (SOAP_OK == result)                                                   // ???????????豸????????????
    {
        memset(&rep, 0x00, sizeof(rep));
        result = soap_recv___wsdd__ProbeMatches(soap, &rep);
        if (SOAP_OK == result) {
            if (soap->error) {
                soap_perror(soap, "ProbeMatches");
            } else {                                                            // ?????????豸????????
                if (NULL != rep.wsdd__ProbeMatches) {
                    count += rep.wsdd__ProbeMatches->__sizeProbeMatch;
                    for(i = 0; i < rep.wsdd__ProbeMatches->__sizeProbeMatch; i++) {
                        probeMatch = rep.wsdd__ProbeMatches->ProbeMatch + i;
                        IpVector.append(strdup(probeMatch->XAddrs));
                    }
                }
            }
        } else if (soap->error) {
            break;
        }
    }

    if (NULL != soap) {
        ONVIF_soap_delete(soap);
    }

    return result;
}

使用场景1:一个网卡一个IP,为192.168开头的IP时,可以正常扫描到设备

img

img

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

img

img

  • 写回答

3条回答 默认 最新

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

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

    从你提供的代码和场景来看,问题可能出现在网络配置或代码中的多播组管理上。当一个网卡上有多个IP地址时,系统可能不会自动选择正确的接口进行多播发送和接收,尤其是在不同子网的情况下。以下是一些可能的解决策略:

    1. 明确指定多播接口

    在你的代码中,当调用soap_send___wsdd__Probesoap_recv___wsdd__ProbeMatches时,尝试明确指定多播接口。这通常涉及到设置IP_MULTICAST_IF套接字选项,确保数据包从正确的接口发送并接收。

    #include <netinet/in.h>
    #include <sys/socket.h>
    
    void setMulticastInterface(struct soap *soap, const char* ip)
    {
        struct in_addr multiaddr;
        struct in_addr ifaddr;
        
        if (!inet_aton(ip, &ifaddr)) {
            std::cerr << "Invalid interface IP address." << std::endl;
            return;
        }
        
        if (setsockopt(soap->fd, IPPROTO_IP, IP_MULTICAST_IF, (char*)&ifaddr, sizeof(ifaddr)) < 0) {
            perror("Failed to set multicast interface");
        }
    }
    
    // 在发送前调用此函数
    setMulticastInterface(soap, "192.168.1.1"); // 使用你的IP地址
    

    2. 配置防火墙和网络策略

    检查你的防火墙设置和网络策略,确保它们允许多播流量通过。特别是在企业网络环境中,可能有策略阻止或限制多播通信。

    3. 检查多播路由

    确保你的网络环境正确支持多播路由。如果网络中有路由器,确认它是否被配置为转发多播流量。

    4. 使用不同的多播地址

    尽管ONVIF标准指定了多播地址,但在某些网络配置中,使用不同的多播地址可能会有所帮助。例如,尝试使用239.0.0.1224.0.1.12等地址。

    5. 检查网络设备配置

    检查网络设备(如交换机、路由器)的配置,确保它们没有阻止多播流量或对多播流量进行过滤。

    6. 代码优化建议

    • 确保在发送和接收多播数据之前,你已经正确地设置了所有必要的套接字选项。
    • 考虑增加错误处理逻辑,以便更清楚地了解失败的原因。
    • 在多播发送和接收循环中加入适当的延迟,给网络设备足够的时间来处理和响应多播消息。

    结论

    上述策略应能帮助你在具有多个IP地址的单一网卡上成功执行多播扫描。如果问题仍然存在,进一步的调试可能需要深入到网络堆栈的具体实现细节,或寻求网络管理员的帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 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报错