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