Onvif无法扫描IPC设备的问题解决

一、多网卡选择问题

解决方案:

1.获取本机的各网卡的IP地址

可通过ioctl机制或者getifaddrs方法获取网卡信息

2.在soap中设置网卡的IP地址

组播选项IP_MULTICAST_IF用于设置组播的默认默认网络接口,会从给定的网络接口发送,另一个网络接口会忽略此数据。例如:

struct in_addraddr; 
setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr))
参数addr是希望多播输出接口的IP地址,使用INADDR_ANY地址回送到默认接口。

由于soap内部做了封装,我们只需设置soap的ipv4_multicast_if参数,代码如下:

setScanfIp(soap, "eth0");

void setScanfIp(struct soap *soap, char * name)
{
    int sockfd;
    struct ifreq ifr;

    if(name == NULL)
    {
        DPRINT(ONVIF_ERR, "get ip error, name is NULL\n");
        return;
    }

    strncpy(ifr.ifr_name, name, IFNAMSIZ-1);

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd == -1)
    {
        DPRINT(ONVIF_ERR, "create socket error:%s\n", strerror(errno));
        return;
    }
    if(ioctl(sockfd, SIOCGIFADDR, &ifr) == -1)
    {
        DPRINT(ONVIF_ERR, "get scanf ip error:%s\n", strerror(errno));
        close(sockfd);
        return;
    }

    struct sockaddr_in *myaddr;
    myaddr = (struct sockaddr_in*) &(ifr.ifr_addr);
    struct in_addr if_req;
    if_req.s_addr = inet_addr(inet_ntoa(myaddr->sin_addr));  // 想绑定的IP地址  
    soap->ipv4_multicast_if = (char*) soap_malloc(soap, sizeof(struct in_addr));  
    memset(soap->ipv4_multicast_if, 0, sizeof(struct in_addr));  
    memcpy(soap->ipv4_multicast_if, (char*)&if_req, sizeof(if_req));
    close(sockfd);
}
二、 多播组数据的TTL问题

多播选项IP_MULTICAST_TTL允许设置超时TTL,范围为0~255之间的任何值,例如:

unsigned char ttl = 255; 
setsockopt(s,IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));

该ttl参数设置数据报最多可以跨过多少个网络,当ttl为0时,指定数据报应停留在本地主机;当ttl的值为1时,指定数据报发送到本地局域网;当ttl的值为32时,意味着只能发送到本站点的网络上;当ttl为64时,意味着数据报应保留在本地区;当ttl的值为128时,意味着数据报应保留在本大洲;当ttl为255时,意味着数据报可发送到所有地方;默认情况下,该ttl的值为1。

解决方案:

我们 只需 设置soap 的ipv4_multicast_ttl参数,代码如下:

soap->ipv4_multicast_ttl = 64;

如果是通过java层的MulticastSocket实现扫描,可调用setTimeToLive(int ttl)方法:

InetAddress inetAddress = InetAddress.getByName("239.255.255.250");
String probeMessage = UtilTools.getProbeMessage();
byte[] buf = probeMessage.getBytes();
mMulticastSocket = new MulticastSocket(port);
mMulticastSocket.setTimeToLive(64);
mMulticastSocket.joinGroup(inetAddress);
DatagramPacket post = new DatagramPacket(buf, buf.length);
post.setPort(3702);
post.setAddress(inetAddress);
mMulticastSocket.send(post);

参考资料:

http://blog.chinaunix.net/uid-28458801-id-5085099.html

http://blog.csdn.net/jiangxinyu/article/details/8158329


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
敬告:该系列的课程在抓紧录制更新中,敬请大家关注。敬告:本课程项目仅供学习参考,请不要直接商用,概不负责任何法律责任。 该系列的课程涉及:FFmpeg,WebRTC,SRS,Nginx,Darwin,Live555,等。包括:音视频、流媒体、直播、Android、视频监控28181、等。 我将带领大家一起来学习使用FFmpeg开发视频监控项目,并动手操练。具体内容包括: 一、视频监控的架构和流程二、FFmpeg4.3+SDL2+Qt5开发环境的搭建三、FFmpeg的SDK编程回顾总结并操练四、SDL2.0的编程回顾总结并操练五、颜色空间转换RGB和YUV的原理与实战六、Qt5+FFmpeg本地摄像头采集预览实战七、代码封装:摄像头h264/5编码并存储八、Qt5+FFmpeg单路网络摄像头采集预览九、Qt5+FFmpeg单路网络摄像头采集预览录制会看十、onvif与GB/T-28181的简介  音视频与流媒体是一门很复杂的技术,涉及的概念、原理、理论非常多,很多初学者不学 基础理论,而是直接做项目,往往会看到c/c++的代码时一头雾水,不知道代码到底是什么意思,这是为什么呢?   因为没有学习音视频和流媒体的基础理论,就比如学习英语,不学习基本单词,而是天天听英语新闻,总也听不懂。 所以呢,一定要认真学习基础理论,然后再学习播放器、转码器、非编、流媒体直播、视频监控、等等。   梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国Harris广播事业部等公司就职,经验丰富;曾亲手主导广电直播全套项目,精通h.264/h.265/aac,曾亲自参与百度app上的网页播放器等实战产品。  目前全身心自主创业,主要聚焦音视频+流媒体行业,精通音视频加密、流媒体在线转码快编等热门产品。  
### 回答1: ONVIF是开放网络视频接口论坛(Open Network Video Interface Forum)的简称,是由一群网络视频设备制造商共同组成的一个开放性标准组织,旨在为网络视频设备制造商提供共同的标准和协议,使设备之间更加互通、兼容和易于部署。而在ONVIF生态圈中,IPC设备服务端则是指IPC设备提供的HTTP API接口,以便于设备接入ONVIF网络系统。 IPC设备服务端主要包括基本设备管理、视频独享、音频数据、运动检测、智能分析、元数据、事件、存储与再生、信令流管理、设备信息、网络配置等方面。通过ONVIF协议,用户可以通过设备服务端进行设备管理、视频监控、事件告警等操作,并可以与其他ONVIF兼容的厂商的设备集成。 ONVIF-IPC设备服务端的实现可以依据ONVIF协议和API文档,基于设备提供商提供的SDK或者API完成开发,或通过第三方开发人员提供的开发包进行实现。同时IPC设备也要支持ONVIF协议的规范和相关标准,才能保证其ONVIF-IPC设备服务端的正常运行。 总之,通过ONVIF-IPC设备服务端的实现,可以使得设备厂商提供的设备可以与其他ONVIF兼容的设备集成,为用户提供更为灵活、高效、可扩展的视频监控解决方案。 ### 回答2: ONVIF是一种标准化协议,用于IP视频监控设备之间的互通性。IPC设备是指网络摄像机,包括网络球机、固定枪机和卡口摄像机等。ONVIF-IPC设备服务端是指网络摄像机作为服务端(即提供服务)使用ONVIF协议与其他设备通信。 ONVIF协议是由IP视频监控行业的领导厂商共同制定的,旨在解决设备之间的互联互通问题。使用ONVIF协议的IPC设备可以与其他厂商的设备和软件进行互联,不受品牌限制,实现方便的互联互通。 ONVIF-IPC设备服务端需要实现ONVIF协议的各项功能,包括设备管理、媒体管理、事件管理等。同时,服务端需要支持视频编码格式、视频分辨率和码率等参数配置,以适应不同场景的需求。此外,服务端还需要支持网络设置、用户管理和安全防范等功能,为用户提供完整的安全保障和智能化管理。 总之,ONVIF-IPC设备服务端是一种遵循ONVIF协议的网络摄像机,可以作为服务端与其他设备进行通信,实现设备互联互通和智能化管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值