精华内容
下载资源
问答
  • ONVIF

    2020-06-17 13:52:30
    ONVIF相关学习 声明 什么是ONVIF ONVIF规范的作用和优势 规范的作用 规范的优势 ONVIF规范的实现机制 Web Services WSDL SOAP ONVIF规范的内容 ONVIF规范的应用 对...

    ONVIF相关学习

     

    声明

    该篇文章主要是参考了网络上的资料整合起来的,给自己做一个备份

    什么是ONVIF

    2005年由AXIS、BOSCH、SONY三个公司联手推出的一个[国际开放型网络视频产品标准网络接口开发论坛]
    Open Network Video Interface Forum 开放型网络接口论坛.
    ONVIF 标准将为网络视频设备之间的信息交换定义通用协议,即ONVIF规范包括装置搜寻、实时视频、音频、元数据和控制信息等!

    ONVIF规范的作用和优势

    规范的作用

    (1) ONVIF规范描述了网络视频的模型、接口、数据类型以及数据交互的模式.
    (2) ONVIF规范的目标是实现一个网络视频框架协议,使得不同厂商所生产的网络视频产品(包括摄录前端,录像设备等)完全互通.
    (3) ONVIF规范中设备管理和控制部分所定义的接口均以Web Services 的形式提供.
    (4) ONVIF规范涵盖了完全的XML和WSDL的定义.
    (5) 服务端和客户端的数据交互采用SOAP协议
    (6)ONVIF中的其他部分,比如音视频流,则通过RTP/RTSP进行

    规范的优势

    (1)协同性: 不同厂商所提供的产品,均可以通过一个统一的"语言"来进行交流,方便了系统的集成
    (2) 灵活性: 终端用户和集成用户不需要被某些设备的固有解决方案所束缚,大大降低了开发成本
    (3) 质量保证: 不断扩展的规范将由市场来导向,遵循规范的同时也满足主流的用户需求.
    (4) 由于采用WSDL+XML模式,使得ONVIF规范的后续扩展不会遇到太多的麻烦.
    (5) XML极强的扩展性和SOAP协议开发的便捷性将吸引更多的人来关注和使用ONVIF规范

    ONVIF规范的实现机制

    客户端根据WSDL描述文档,会生成一个SOAP请求消息,该请求会被嵌入在一个HTTP POST请求中,发送到Web Services所在的Web服务器.------>Web Services 请求处理器解析收到的SOAP请求,调用相应的Web Services.然后再生成相应的SOAP应答------>Web服务器 得到SOAP应答后,会再通过HTTP应答的方式把信息送回到客户端

    Web Services

    详细介绍了web serveces和soap等 https://www.cnblogs.com/fnng/p/5524801.html

       (1) Web Services 是基于网络的、分布式的模块化组件,执行特定的任务.
       (2) Web Services 主要利用HTTP和SOAP协议使数据在Web 上传输.
       (3) Web 用户能够使用SOAP和HTTP 通过Web调用的方法来调用远程对象.
       (4) Web Services 是基于XML和HTTP的一种服务,其通信主要基于SOAP.
       (5) 服务端和客户端,以传递符合XML的SOAP消息,实现服务的请求与回应.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    WSDL

    WSDL是Web Services 描述语言 (Web Services Description Language)的缩写.是一个用来描述Web服务和说明如何与Web服务通信的XML语言,为用户提供详细的接口说明书

    SOAP

    SOAP 是Simple Object Access Protocol 的缩写. 是基于XML的一种协议,是建立再HTTP基础上的.
    一条SOAP消息就是一个普通的XML 文档,包含下列元素

    (1)必须的 Envelope 元素, 可以把此XML文档标识为一条SOAP消息
    (2)可选的Header 元素,包含头部信息
    (3)必须的Body 元素,包含所有的调用和响应信息
    (4)可选的Fault 元素,提供有关在处理此消息所发生错误的信息
    
    • 1
    • 2
    • 3
    • 4

    在向Web Service 发送的SOAP请求中Body元素中的字段需要与 WSDL中数据类型相符合.在构建SOAP的过程中,必须从WSDL文件中获取并映射这一种对应关系.然后这样一个对应过程将是充满了重复性和机械性的,为了避免不必要的人工差错以及节约开发时间,一个名为gSOAP的编译工具应运而生.
    gSOAP利用编译器技术提供,了一组透明化的SOAP API 并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来.通过将WSDL文件解析序列化为C/C++文件,最小化了Web Service的开发过程

    ONVIF规范的内容

    设备发现
    设备管理
    设备输入输出服务
    图像配置
    媒体配置
    实时流媒体
    接收端配置
    显示服务
    事件处理
    PTZ控制
    其他
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    ONVIF规范的应用

    对本小节中用到的一些名词进行统一的说明

    CMU (center manager unit) ,中心管理单元
    PU (perfocus unit) ,监控前端单,负责在CMU的控制下:

    (1) 使用摄像机采集视频流
    (2) 使用麦克风采集音频流
    (3) 使用控制口采集报警信息
    (4) 对摄像机云台镜头进行控制
    
    • 1
    • 2
    • 3
    • 4

    CU (client unit) ,监控系统的监控客户端单元,负责将PU采集到的视频流、音频流、报警信息提交给监控用户,并且根据用户要求操作PU设备,如云台,镜头等.

    传统视频监控系统的一个局域网应用场景

        (1) PU设备上线后,向CMU注册,建立连接(长连接)
        (2) CMU与PU进行信令交互、请求能力集、获取配置等
        (3) CU上线,向CMU注册,建立连接
        (4) CMU与CU进行信令交互,传输设备列表
        (5) CU向PU请求码流
    
    • 1
    • 2
    • 3
    • 4
    • 5

    应用ONVIF规范后的场景

        (1) PU设备上线后,向CMU发送HELLO消息
        (2) CMU需要搜寻设备时,向PU发送proble消息
        (3) CMU与PU进行信令交互,请求能力集,获取配置
        (4) CU上线,向CMU注册,建立连接
        (5) CMU与CU进行信令交互,传输设备列表
        (6) 在CMU的协调下,CU同PU建立连接传输码流
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ONVIF规范的应用带来了什么变化

        (1) PU和CMU的连接方式改变,不再是长连接
        (2) 因为遵循了ONVIF规范,信令以及消息内容有了统一的标准
    
    • 1
    • 2

    生成ONVIF源码框架

    生成源码框架前,需要进行gsoap的安装
    这里介绍的是生成完整的ONVIF源码框架,根据项目要求的不同是可以生成对应的源码框架的,只需要修改typemap.dat 以及后面跟着的WSDL文件路径

    从wsdl生成c头文件

    输入命令

    wsdl2h -o onvif.h -c -s -t .\typemap.dat http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl http://www.onvif.org/onvif/ver10/display.wsdl http://www.onvif.org/onvif/ver10/deviceio.wsdl http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl  http://www.onvif.org/onvif/ver10/receiver.wsdl http://www.onvif.org/onvif/ver10/recording.wsdl  http://www.onvif.org/onvif/ver10/search.wsdl http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.onvif.org/onvif/ver10/replay.wsdl http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl  http://www.onvif.org/onvif/ver10/schema/onvif.xsd  http://www.onvif.org/ver10/actionengine.wsdl
    
    • 1

    从头文件生成源码框架

    soapcpp2 -c onvif.h -x -I /root/onvif/gsoap-2.8/gsoap/import -I /root/onvif/gsoap-2.8/gsoap/
    
    • 1

    ONVIF开发常用调试方法

    打开ONVIF调试开关,以便让ONVIF打印一些可用的调试信息

    在Makefile文件中添加CC = gcc -DEBUG
    打开调试宏后,默认在程序运行的目录产生三个文件
    RECV.log
    ONVIF接收到的SOAP数据,每接收一条,都会进行记录
    SENT.log
    ONVIF发送SOAP数据,每发送一条,都会进行记录
    TEST.log
    RECV.log和SENT.log可以通过wireshark工具抓包代替,但是TEST.log是代替不了的,
    TEST.log记录了ONVIF实时的工作状态,尤其是在出现segmentation fault 错误的时候
    TEST.log 几乎成为唯一的定位错误的手段

    一些常见的错误解决方法

    基本就是通过分析TEST.log进行错误位置定位,然后解决

    一些参考文档

    ONVIF Profile S Specification

    描述ProfileS是什么样的一个东西,如何实现

    Reference_of_ONVIF_Development_v1.01.02

    Onvif DVT设计参考,指明了一条道路,但没有具体内容

    ONVIF-Media-Service-Spec-v220

    Onvif Media的说明介绍

    http://www.onvif.org/onvif/ver20/util/operationIndex.html

    onvif几乎全部命令的详细说明,非常重要。该文档告诉我们结构体成员的意义和如何填充。Onvif开发其实就是各种结构体的填充。

    致谢

    十分感谢以下博主有关ONVIF的分享:
    max_min_
    许振坪
    ghostyu

    展开全文
  • Onvif

    2021-02-08 17:25:13
    网络摄像机的标准协议,国际标准上有三大类:ONVIF、PSIA和HDCCTV 每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。 拿IPC摄像头来说,IPC是Web Services服务端,其提供的WEB服务接口需符合ONVIF...

    网络摄像机是网络设备,需要有通讯协议
    网络摄像机的标准协议,国际标准上有三大类:ONVIF、PSIA和HDCCTV
    每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。
    拿IPC摄像头来说,IPC是Web Services服务端,其提供的WEB服务接口需符合ONVIF协议规范
    IPC的各种参数获取/配置都是通过ONVIF协议实现,而音视频流多媒体传输采用的是RTP/RTSP协议实现。

    怎么判断摄像机支不支持Onvif协议?
    方法1、用录像机扫描
    方法2、Onvif Device Test Tool检测工具
    当用NVR或Onvif Device Test Tool检测工具都无法检测到摄像机,摄像机就不一定不支持Onvif协议,通常有下面两种情况:
    情况1:摄像头支持Onvif协议,但默认关闭该功能
    情况2:摄像头不支持Onvif协议[那就换其他支持的]

    https://blog.csdn.net/benkaoya/article/details/72453403
    https://service.tp-link.com.cn/detail_article_4417.html

    展开全文
  • onvif

    2017-05-22 18:08:26
    说明:网上关于ONVIF开发的文章并不多,也更找不到具体的实例来入门学习。只能靠翻阅各种Specification摸索中前进,下面是最近几天的成果。调通了服务端(或者说设备端)的Discovery,使用OnvifTestTool12.06能够搜...
    
    

    目录(?)[+]

    说明:网上关于ONVIF开发的文章并不多,也更找不到具体的实例来入门学习。只能靠翻阅各种Specification摸索中前进,下面是最近几天的成果。调通了服务端(或者说设备端)的Discovery,使用OnvifTestTool12.06能够搜到我的设备。【来自http://blog.csdn.NET/ghostyu】

    1、在使用wsdl2h产生头文件前需要修改typemap.dat,

    修改的依据在这里:http://www.cs.fsu.edu/~engelen/soap.html,在FAQ页面下的How do I use gSOAP for the ONVIF specifications?

    [cpp] view plain copy
    1. #Use gSOAP 2.8.10 and up. In the typemap.dat file used by wsdl2h, add:  
    2. #   ONVIF recommended prefixes  
    3. tds = "http://www.onvif.org/ver10/device/wsdl"  
    4. tev = "http://www.onvif.org/ver10/events/wsdl"  
    5. tls = "http://www.onvif.org/ver10/display/wsdl"  
    6. tmd = "http://www.onvif.org/ver10/deviceIO/wsdl"  
    7. timg    = "http://www.onvif.org/ver20/imaging/wsdl"  
    8. trt = "http://www.onvif.org/ver10/media/wsdl"  
    9. tptz    = "http://www.onvif.org/ver20/ptz/wsdl"  
    10. trv = "http://www.onvif.org/ver10/receiver/wsdl"  
    11. trc = "http://www.onvif.org/ver10/recording/wsdl"  
    12. tse = "http://www.onvif.org/ver10/search/wsdl"  
    13. trp = "http://www.onvif.org/ver10/replay/wsdl"  
    14. tan = "http://www.onvif.org/ver20/analytics/wsdl"  
    15. tad = "http://www.onvif.org/ver10/analyticsdevice/wsdl"  
    16. tdn = "http://www.onvif.org/ver10/network/wsdl"  
    17. tt  = "http://www.onvif.org/ver10/schema"  
    18. #   OASIS recommended prefixes  
    19. wsnt    = "http://docs.oasis-open.org/wsn/b-2"  
    20. wsntw   = "http://docs.oasis-open.org/wsn/bw-2"  
    21. wsrfbf  = "http://docs.oasis-open.org/wsrf/bf-2"  
    22. wsrfr   = "http://docs.oasis-open.org/wsrf/r-2"  
    23. wsrfrw  = "http://docs.oasis-open.org/wsrf/rw-2"  
    24. wstop   = "http://docs.oasis-open.org/wsn/t-1"  
    25. #   WS-Discovery 1.0 remapping  
    26. wsdd10__HelloType       = | wsdd__HelloType  
    27. wsdd10__ByeType         = | wsdd__ByeType  
    28. wsdd10__ProbeType       = | wsdd__ProbeType  
    29. wsdd10__ProbeMatchesType    = | wsdd__ProbeMatchesType  
    30. wsdd10__ProbeMatchType      = | wsdd__ProbeMatchType  
    31. wsdd10__ResolveType     = | wsdd__ResolveType  
    32. wsdd10__ResolveMatchesType  = | wsdd__ResolveMatchesType  
    33. wsdd10__ResolveMatchType    = | wsdd__ResolveMatchType  
    34. #   SOAP-ENV mapping  
    35. SOAP_ENV__Envelope  = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope  
    36. SOAP_ENV__Header    = | struct SOAP_ENV__Header  
    37. SOAP_ENV__Fault     = | struct SOAP_ENV__Fault  
    38. SOAP_ENV__Detail    = | struct SOAP_ENV__Detail  
    39. SOAP_ENV__Code      = | struct SOAP_ENV__Code  
    40. SOAP_ENV__Subcode   = | struct SOAP_ENV__Subcode  
    41. SOAP_ENV__Reason    = | struct SOAP_ENV__Reason  

    2、根据onvif官网提供的remotediscovery.wsdl产生onvif.h头文件

    关于onvif所有的wsdl都在这里:http://www.onvif.org/Documents/Specifications.aspx中的ONVIF WSDL and XML Schemas Specifications一节,虽然可以全部下载为wsdl文件,但是wsdl文件中存在相互依赖的关系,并且是带有存储的依赖,所以最好直接使用url来产生头文件,不要下载下来。

    [html] view plain copy
    1. wsdl2h -o onvif.h -c -s -t ./typemap.dat http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl  

    3、使用onvif.h来产生骨架代码

    [html] view plain copy
    1. soapcpp2 -c onvif.h -x -I /root/onvif/gsoap-2.8/gsoap/import -I /root/onvif/gsoap-2.8/gsoap/  

    4、ProbeMatches代码

    这样就创建了基本的服务端和客户端的代码了,下面需要添加具体的代码了。

    其中包括:

    (1)创建组播用的udp socket,绑定组播地址为239.255.255.250,端口为3702,因为ws-discovery的组播地址和端口就是为239.255.255.250和3702

    (2)在产生的Probe函数中添加ProbeMatches代码
    首先是udp socket

    [cpp] view plain copy
    1. int bind_server_udp1(int server_s)  
    2. {  
    3.     struct sockaddr_in local_addr;  
    4.     memset(&local_addr,0,sizeof(local_addr));  
    5.     local_addr.sin_family = AF_INET;  
    6.     local_addr.sin_addr.s_addr = htonl(INADDR_ANY);  
    7.     local_addr.sin_port = htons(3702);  
    8.     return bind(server_s,(struct sockaddr*)&local_addr,sizeof(local_addr));  
    9.   
    10. }  
    11. static int create_server_socket_udp(void)  
    12. {  
    13.     int server_udp;  
    14.     unsigned char one = 1;  
    15.     int sock_opt = 1;  
    16.       
    17.     //server_udp = socket(PF_INET, SOCK_DGRAM, 0);  
    18.     server_udp = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);  
    19.     if (server_udp == -1) {  
    20.         printf("unable to create socket\n");  
    21.     }  
    22.   
    23.     /* reuse socket addr */  
    24.     if ((setsockopt(server_udp, SOL_SOCKET, SO_REUSEADDR, (void *) &sock_opt,  
    25.                     sizeof (sock_opt))) == -1) {  
    26.         printf("setsockopt\n");  
    27.     }  
    28.     if ((setsockopt(server_udp, IPPROTO_IP, IP_MULTICAST_LOOP,  
    29.                        &one, sizeof (unsigned char))) == -1) {  
    30.         printf("setsockopt\n");  
    31.     }  
    32.   
    33.     struct ip_mreq mreq;  
    34.     mreq.imr_multiaddr.s_addr = inet_addr("239.255.255.250");  
    35.     mreq.imr_interface.s_addr = htonl(INADDR_ANY);  
    36.   
    37.     if(setsockopt(server_udp,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))==-1){  
    38.         perror("memberchip error\n");  
    39.     }  
    40.   
    41.     return server_udp;  
    42. }  
    需要注意几点:1/设置socket属性SO_REUSEADDR,2、设置socket属性IP_ADD_MEMBERSHIP,目的是让3702的端口能够重复绑定,一家加入组播组。

    其次是添加ProbeMatches代码
    (1)首先复制client的soap_send___wsdd__ProbeMatches函数到服务端来,因为soap_send___wsdd__ProbeMatches已经写好了用于响应Probe消息的框架了,不用白不用啊。
    (2)编写__wsdd__Probe函数,添加如下内容

    [cpp] view plain copy
    1. int  __wsdd__Probe(struct soap* soap, struct wsdd__ProbeType *wsdd__Probe)  
    2. {  
    3.     DBG("__wsdd__Probe\n");  
    4.     char macaddr[6];  
    5.     char _IPAddr[INFO_LENGTH];  
    6.     char _HwId[1024];  
    7.       
    8.     wsdd__ProbeMatchesType ProbeMatches;  
    9.     ProbeMatches.ProbeMatch = (struct wsdd__ProbeMatchType *)soap_malloc(soap, sizeof(struct wsdd__ProbeMatchType));  
    10.     ProbeMatches.ProbeMatch->XAddrs = (char *)soap_malloc(soap, sizeof(char) * INFO_LENGTH);  
    11.     ProbeMatches.ProbeMatch->Types = (char *)soap_malloc(soap, sizeof(char) * INFO_LENGTH);  
    12.     ProbeMatches.ProbeMatch->Scopes = (struct wsdd__ScopesType*)soap_malloc(soap,sizeof(struct wsdd__ScopesType));  
    13.     ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceProperties = (struct wsa__ReferencePropertiesType*)soap_malloc(soap,sizeof(struct wsa__ReferencePropertiesType));  
    14.     ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceParameters = (struct wsa__ReferenceParametersType*)soap_malloc(soap,sizeof(struct wsa__ReferenceParametersType));  
    15.     ProbeMatches.ProbeMatch->wsa__EndpointReference.ServiceName = (struct wsa__ServiceNameType*)soap_malloc(soap,sizeof(struct wsa__ServiceNameType));  
    16.     ProbeMatches.ProbeMatch->wsa__EndpointReference.PortType = (char **)soap_malloc(soap, sizeof(char *) * SMALL_INFO_LENGTH);  
    17.     ProbeMatches.ProbeMatch->wsa__EndpointReference.__any = (char **)soap_malloc(soap, sizeof(char*) * SMALL_INFO_LENGTH);  
    18.     ProbeMatches.ProbeMatch->wsa__EndpointReference.__anyAttribute = (char *)soap_malloc(soap, sizeof(char) * SMALL_INFO_LENGTH);  
    19.     ProbeMatches.ProbeMatch->wsa__EndpointReference.Address = (char *)soap_malloc(soap, sizeof(char) * INFO_LENGTH);  
    20.   
    21.     macaddr[0]=0x01;macaddr[1]=0x01;macaddr[2]=0x01;macaddr[3]=0x01;macaddr[4]=0x01;macaddr[5]=0x01;  
    22.     sprintf(_HwId,"urn:uuid:2419d68a-2dd2-21b2-a205-%02X%02X%02X%02X%02X%02X",macaddr[0], macaddr[1], macaddr[2], macaddr[3], macaddr[4], macaddr[5]);  
    23.   
    24.     sprintf(_IPAddr, "http://%03d.%03d.%1d.%03d/onvif/device_service", 192, 168, 1, 233);  
    25.     ProbeMatches.__sizeProbeMatch = 1;  
    26.     ProbeMatches.ProbeMatch->Scopes->__item =(char *)soap_malloc(soap, 1024);  
    27.     memset(ProbeMatches.ProbeMatch->Scopes->__item,0,sizeof(ProbeMatches.ProbeMatch->Scopes->__item));    
    28.   
    29.     //Scopes MUST BE  
    30.     strcat(ProbeMatches.ProbeMatch->Scopes->__item, "onvif://www.onvif.org/type/NetworkVideoTransmitter");  
    31.   
    32.     ProbeMatches.ProbeMatch->Scopes->MatchBy = NULL;  
    33.     strcpy(ProbeMatches.ProbeMatch->XAddrs, _IPAddr);  
    34.     strcpy(ProbeMatches.ProbeMatch->Types, wsdd__Probe->Types);  
    35.     DBG("wsdd__Probe->Types=%s\n",wsdd__Probe->Types);  
    36.     ProbeMatches.ProbeMatch->MetadataVersion = 1;  
    37.     //ws-discovery规定 为可选项  
    38.     ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceProperties->__size = 0;  
    39.     ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceProperties->__any = NULL;  
    40.     ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceParameters->__size = 0;  
    41.     ProbeMatches.ProbeMatch->wsa__EndpointReference.ReferenceParameters->__any = NULL;  
    42.       
    43.     ProbeMatches.ProbeMatch->wsa__EndpointReference.PortType[0] = (char *)soap_malloc(soap, sizeof(char) * SMALL_INFO_LENGTH);  
    44.     //ws-discovery规定 为可选项  
    45.     strcpy(ProbeMatches.ProbeMatch->wsa__EndpointReference.PortType[0], "ttl");  
    46.     ProbeMatches.ProbeMatch->wsa__EndpointReference.ServiceName->__item = NULL;  
    47.     ProbeMatches.ProbeMatch->wsa__EndpointReference.ServiceName->PortName = NULL;  
    48.     ProbeMatches.ProbeMatch->wsa__EndpointReference.ServiceName->__anyAttribute = NULL;  
    49.     ProbeMatches.ProbeMatch->wsa__EndpointReference.__any[0] = (char *)soap_malloc(soap, sizeof(char) * SMALL_INFO_LENGTH);  
    50.     strcpy(ProbeMatches.ProbeMatch->wsa__EndpointReference.__any[0], "Any");  
    51.     strcpy(ProbeMatches.ProbeMatch->wsa__EndpointReference.__anyAttribute, "Attribute");  
    52.     ProbeMatches.ProbeMatch->wsa__EndpointReference.__size = 0;  
    53.     strcpy(ProbeMatches.ProbeMatch->wsa__EndpointReference.Address, _HwId);  
    54.   
    55.     /*注释的部分为可选,注释掉onvif test也能发现ws-d*/  
    56.     //soap->header->wsa__To = "http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous";  
    57.     //soap->header->wsa__Action = "http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches";  
    58.     soap->header->wsa__RelatesTo = (struct wsa__Relationship*)soap_malloc(soap, sizeof(struct wsa__Relationship));  
    59.     //it's here  
    60.     soap->header->wsa__RelatesTo->__item = soap->header->wsa__MessageID;  
    61.     soap->header->wsa__RelatesTo->RelationshipType = NULL;  
    62.     soap->header->wsa__RelatesTo->__anyAttribute = NULL;  
    63.   
    64.     soap->header->wsa__MessageID =(char *)soap_malloc(soap, sizeof(char) * INFO_LENGTH);  
    65.     strcpy(soap->header->wsa__MessageID,_HwId+4);  
    66.   
    67.     /* send over current socket as HTTP OK response: */  
    68.     /*测试过,第二参数必须http,action随意*/  
    69.     soap_send___wsdd__ProbeMatches(soap, "http://", NULL, &ProbeMatches);  
    70.     return SOAP_OK;  
    71.   
    72. }  
    想要写出上述代码,是一定要了解SOAP格式的,在WS-Discovery中描述了discovery所用的soap格式

    1首先是了解消息头header和ProbeMatches中的内容,非常重要,可以参考这里http://www.w3.org/Submission/ws-addressing/  最好详细的学习一下,里面的内容非常重要。

    2其次需要理解的是,其实当你看完ws-addressing后你会发现,骨架代码中的结构体和SOAP消息中的内容是一一对应的,例如:

    结构体osap->header对应SOAP消息的<SOAP-ENV:Header></SOAP-ENV:Header>中的内容,包含在header里的内容当然会包含在SOAP的header内。例如:

    结构体soap->header->wsa__RelatesTo对应的是<wsa:RelatesTo></wsa:RelatesTo>。

    3最后需要理解的是,在代码中的"__"双下划线一般对应xml中的命名空间的":",下划线前是命名空间,后是具体内容。

    4最后的最后是要详细的阅读ONVIF Core Specification

    下图为响应OnvifTestTool的Probe命令的SOAP消息


    结合上图再分析代码就亲切多了。在ONVIF Core Specification的7.3.2.2  Scopes 一节描述了onvif需要的Scopes,这个是需要在程序里填充,具体填充什么,文档里说的很明确:


    注意点是在太多,随便漏掉一个都可能会导致搜不到设备,下图是非常重要的一个:

    SOAP1.1和SOAP1.2所使用的SOAP-ENV是不同的,ONVIF使用的是SOAP1.1,如果soapcpp2产生的nsmap文件中的SOAP-ENV是SOAP1.2版本的话,那么OnvifTestTool是不会识别设备发出的SOAP消息的。

    5、该main函数登场了

    [cpp] view plain copy
    1. int main()  
    2. {  
    3.     int server_udp;  
    4.       
    5.     int retval=0;  
    6.     struct soap *soap_udp;  
    7.     int fault_flag = 0;  
    8.       
    9.     server_udp = create_server_socket_udp();  
    10.     bind_server_udp1(server_udp);  
    11.     while(1){  
    12.         soap_udp=soap_new();  
    13.         soap_init1(soap_udp, SOAP_IO_UDP);  
    14.         soap_udp->master = server_udp;  
    15.         soap_udp->socket = server_udp;  
    16.         soap_udp->errmode = 0;  
    17.         soap_udp->bind_flags = 1;  
    18.         if (!soap_valid_socket(soap_bind(soap_udp, NULL, 3702, 100)))  
    19.         {      
    20.             soap_print_fault(soap_udp, stderr);  
    21.         }  
    22.         fprintf(stderr,"soap_serve starting..\n");  
    23.         retval = soap_serve(soap_udp); //阻塞在这里  
    24.         fprintf(stderr,"retval=%d\n",retval);  
    25.         if(retval && !(fault_flag))  
    26.         {  
    27.             fault_flag = 1;  
    28.         }  
    29.         else if(!retval)  
    30.         {  
    31.             fault_flag = 0;  
    32.         }  
    33.         soap_destroy(soap_udp);  
    34.         soap_end(soap_udp);  
    35.         soap_done(soap_udp);  
    36.         free(soap_udp);  
    37.     }  
    38. }  
    soap_server函数会一直阻塞,直到接收到SOAP消息,并且该处理是一次性的,所以要将将soap_server放到while里或者独立的线程中。
    最后编译运行

    make server

    ./discovery.tmp

    单击OnvifTestTool的Discover Devices,运行discovery.tmp的中会打印调试信息,如图


    然后,在OnvifTestTool中会搜索到我的设备


    响应Discover Devices的SOAP消息如下:

    [html] view plain copy
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <SOAP-ENV:Envelope   
    3.     xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"   
    4.     xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"   
    5.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    6.     xmlns:xsd="http://www.w3.org/2001/XMLSchema"   
    7.     xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"   
    8.     xmlns:wsdd="http://schemas.xmlsoap.org/ws/2005/04/discovery"   
    9.     xmlns:ns1="http://www.onvif.org/ver10/network/wsdl/RemoteDiscoveryBinding"   
    10.     xmlns:ns2="http://www.onvif.org/ver10/network/wsdl/DiscoveryLookupBinding"   
    11.     xmlns:ns3="http://www.onvif.org/ver10/network/wsdl/DiscoveryLookupBinding"   
    12.     xmlns:tdn="http://www.onvif.org/ver10/network/wsdl">  
    13.   
    14.     <SOAP-ENV:Header>  
    15.         <wsa:MessageID>uuid:2419d68a-2dd2-21b2-a205-010101010101</wsa:MessageID>  
    16.         <wsa:RelatesTo>uuid:88a3958a-6155-4510-8279-69aeafd31681</wsa:RelatesTo>  
    17.         <wsa:To SOAP-ENV:mustUnderstand="true">urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To>  
    18.         <wsa:Action SOAP-ENV:mustUnderstand="true">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action>  
    19.     </SOAP-ENV:Header>  
    20.   
    21.     <SOAP-ENV:Body>  
    22.         <wsdd:ProbeMatches>  
    23.             <wsdd:ProbeMatch xmlns:_0="http://www.onvif.org/ver10/device/wsdl">  
    24.                 <wsa:EndpointReference>  
    25.                 <wsa:Address>urn:uuid:2419d68a-2dd2-21b2-a205-010101010101</wsa:Address>  
    26.                 <wsa:ReferenceProperties></wsa:ReferenceProperties>  
    27.                 <wsa:ReferenceParameters></wsa:ReferenceParameters>  
    28.                 <wsa:PortType>ttl</wsa:PortType>  
    29.                 </wsa:EndpointReference>  
    30.                 <wsdd:Types>_0:Device</wsdd:Types>  
    31.                 <wsdd:Scopes>onvif://www.onvif.org/type/NetworkVideoTransmitter</wsdd:Scopes>  
    32.                 <wsdd:XAddrs>http://192.168.1.233/onvif/device_service</wsdd:XAddrs>  
    33.                 <wsdd:MetadataVersion>1</wsdd:MetadataVersion>  
    34.             </wsdd:ProbeMatch>  
    35.         </wsdd:ProbeMatches>  
    36.     </SOAP-ENV:Body>  
    37. </SOAP-ENV:Envelope>  

    资料下载

    上述完整的代码包在这里,有需要的就去下载吧:http://download.csdn.Net/detail/ghostyu/4766025

    另外我参考的部分文档可以再这里下载

    ONVIF-Core-Spec-v210.pdf:http://download.csdn.net/detail/ghostyu/4766067

    gSOAP手册:http://download.csdn.net/detail/ghostyu/4766075

    OnvifTestTool12.06测试工具网上有的,我就不上传了。

    展开全文
  • onvif demo

    2017-05-24 15:54:00
    onvif
  • ONVIF协议解读

    万次阅读 多人点赞 2017-10-23 19:21:18
    一、什么是ONVIF? 1.1形成 2008年5月,由安讯士(AXIS)联合博世(BOSCH)及索尼(SONY)公司三方宣布携手共同成立一个国际开放型网络视频产品标准网络接口开发论坛,取名为ONVIF(Open Network Video Interface...

    一、什么是ONVIF?

    1.1 形成
    2008年5月,由安讯士(AXIS)联合博世(BOSCH)及索尼(SONY)公司三方宣布携手共同成立一个国际开放型网络视频产品标准网络接口开发论坛,取名为ONVIF(Open Network Video Interface Forum,开放型网络视频接口论坛),并以公开、开放的原则共同制定开放性行业标准。ONVIF标准将为网络频设备之间的信息交换定义通用协议,包括装置搜寻、实时视频、音频、元数据和控制信息等。截止到2011年3月,已有279个公司加入ONVIF成为会员。

    2008年11月,论坛正式发布了ONVIF第一版规范。

    2010年11月,论坛发布了ONVIF第二版规范。规范涉及设备发现、实时音视频、摄像头PTZ控制、录像控制、视频分析等方面。

    1.2 规范作用
    ONVIF规范描述了网络视频的模型、接口、数据类型以及数据交互的模式。并复用了一些现有的标准,如WS系列标准等。ONVIF规范的目标是实现一个网络视频框架协议,使不同厂商所生产的网络视频产品(包括摄录前端、录像设备等)完全互通。

    ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供,设备作为服务提供者为服务端。ONVIF规范涵盖了完全的XML及WSDL的定义。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。服务端与客户端的数据交互采用SOAP协议。ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行 。

    1.3 规范优势

    • 协同性:不同厂商所提供的产品,均可以通过一个统一的“语言”来进行交流。方便了系统的集成。

    • 灵活性:终端用户和集成用户不需要被某些设备的固有解决方案所束缚。大大降低了开发成本。

    • 质量保证:不断扩展的规范将由市场来导向,遵循规范的同时也满足主流的用户需求。

    由于采用WSDL+XML模式,使ONVIF规范的后续扩展不会遇到太多的麻烦。XML极强的扩展性与SOAP协议开发的便捷性将吸引更多的人来关注和使用ONVIF规范。

    ONVIF组织日益扩大,与同领域的PSIA,HDCCTV相比,占据了绝对的人员优势。会员企业不乏国内外著名的设备制造商与集成商。一套规范、协议的生命周期,与市场占有率是息息相关的。而ONVIF规范的发展则正是由市场来导向,由用户来充实的。每一个成员企业都拥有加强、扩充ONVIF规范的权利。ONVIF规范所涵盖的领域将不断增大。目前门禁系统的相关内容也即将被纳入ONVIF规范之中。在安防、监控系统急速发展的今天,效率和质量的领先所带来的价值不言而喻。ONVIF协议提供了这样的潜质。

    二、ONVIF规范的实现机制

    2.1 Web Service
    Web Service是基于网络的、分布式的模块化组件,执行特定的任务。Web Service 主要利用HTTP 和SOAP 协议使数据在Web上传输。Web 用户能够使用 SOAP 和 HTTP通过 Web 调用的方法来调用远程对象。

    Web Service是基于XML和HTTPS的一种服务,其通信协议主要基于SOAP。服务端、客户端以传递符合XML的SOAP消息实现服务的请求与回应。

    客户端根据 WSDL 描述文档,会生成一个 SOAP 请求消息,该请求会被嵌入在一个HTTP POST请求中,发送到 Web Services 所在的Web 服务器。Web Services 请求处理器解析收到的SOAP 请求,调用相应的 Web Services。然后再生成相应的 SOAP 应答。Web 服务器得到SOAP 应答后,会再通过 HTTP应答的方式把信息送回到客户端。
    在这里插入图片描述

    2.2 WSDL
    WSDL是Web services 描述语言(Web Service Description Language)的缩写。是一个用来描述Web服务和说明如何与Web服务通信的XML语言,为用户提供详细的接口说明书。

    2.3 SOAP
    SOAP是Simple Object Access Protocol的缩写。是基于XML的一种协议。一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:

    • 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息

    • 可选的 Header 元素,包含头部信息

    • 必需的 Body 元素,包含所有的调用和响应信息

    • 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

    在向Web Service发送的SOAP请求中,Body元素中的字段需与WSDL中数据类型的相符合。在构建SOAP的过程中,必须从WSDL文件中获取并映射这一种对应关系。然而这样一个对应过程将是充满了重复性和机械性的,为了避免不必要的人工差错以及节约开发时间,一个名为gSOAP的编译工具应运而生。

    gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。通过将WSDL文件解析序列化为C/C++文件,最小化了Web Service的开发过程。

    在这里插入图片描述
    2.4 ONVIF规范
    ONVIF规范向视频监控引入了Web Service的概念。 设备的实际功能均被抽象为了Web Service的服务,视频监控系统的控制单元以客户端的身份出现,通过Web请求的形式完成控制操作。

    在这里插入图片描述
    2.4.1 Web Service能为视频监控什么?
    a) 设备的无关性,任何一个设备接入系统,不会对其他系统造成影响。

    b) 设备的独立性,每一个设备只负责对接收到的请求做出反馈,甚至不需要知晓控制端的存在。

    c) 管理的集中性,所有的控制由客户端来发起。

    在这里插入图片描述
    2.4.2 ONVIF规范能为视频监控带来什么?
    a) 抽象了功能的接口。统一了对设备的配置以及操作的方式。

    b) 控制端关心的不是设备的型号,而是设备所提供的Web Service。

    c) 规范了视频系统中Web Service范围之外的行为。

    d) ONVIF提供了各个模块的WSDL,拥有效率非常高的开发方式。

    在这里插入图片描述

    三、ONVIF规范的内容

    a) 设备发现

    b) 设备管理

    c) 设备输入输出服务

    d) 图像配置

    e) 媒体配置

    f) 实时流媒体

    g) 接收端配置

    h) 显示服务

    i) 事件处理

    j) PTZ控制

    k) 其他

    四、ONVIF的应用

    4.1 名词说明
    CMU(Center Manager Unit),即中心管理单位。

    PU(Prefocus Unit),即监控前端单元,负责在CMU的控制下使用摄像机采集视频流、使用麦克风采集音频流、使用控制口采集报警信息、对摄像机云台镜头进行控制。

    CU(Client Unit),监控系统的监控客户端单元,负责将PU采集到的视频流、音频流、报警信息提交给监控用户,并根据用户要求操作PU设备,如云台、镜头等。

    4.2 传统视频监控系统的一个局域网应用场景
    a) PU设备上线后,向CMU注册,建立连接。

    b) CMU与PU进行信令交互,请求能力集,获取配置。

    c) CU上线,向CMU注册,建立连接。

    d) CMU与CU进行信令交互,传输设备列表。

    e) CU向PU请求码流。

    在这里插入图片描述

    4.3 应用ONVIF规范后对应的场景
    a) PU设备上线后,向CMU发送HELLO消息。

    b) CMU需要搜寻设备时,向PU发送PROBE消息。

    c) CMU与PU进行信令交互,请求能力集,获取配置。

    d) CU上线,向CMU注册,建立连接。

    e) CMU与CU进行信令交互,传输设备列表。

    f) 在CMU的协调下,CU同PU建立连接传输码流。

    在这里插入图片描述

    上述场景中,ONVIF带来了什么变化?

    a) PU与CMU的交互方式发生了改变,CMU不再与PU保持长连接。
    b) 遵循ONVIF规范,信令以及消息内容有了统一的标准。

    展开全文
  • ONVIF工具(ONVIF Device Manager,ONVIF Device Test Tool).rar 供各位使用
  • 找了很久的一个OnVif协议的模拟器,可以用来开发Onvif Client,解压缩后用VirtualBox直接加载,系统类型选择Ubuntu就可以,比直接用Onvif的摄像头好,因为会有控制台输出状态
  • Onvif wsdl

    2017-07-18 15:30:28
    Onvif wsdl
  • onvif头文件

    2018-08-09 20:27:08
    onvif协议,通过gsoap框架实现的代码 设备端或者服务端在或者说NVT端的RTSP Video Stream,能够与OnvifDeviceManager成功对接,对想要实现onvif视频对接的人来说有一定的参考意义 只上传了最重要的文件:onvif.c是...
  • onvif全套代码onvif-code.rar onvif全套代码onvif-code.rar
  • Onvif QT服务器和客户端 Onvif QT Server客户端是使用QT C++创建Onvif Server和Onvif Client的示例。 程序已在IDE Qt Creator 3.4.2上使用Qt 5.5.0(MSVC 2013, 32 bit)构建。 在程序中,已使用 c ++ api创建服务器端...
  • ONVIF Device Manager是一款专业的onvif对接软件,可以用于对接支持onvif协议的IPC厂家进行设置,有了ONVIF Device Manager就可以轻松搜索查看相应的视频设备,配置视频服务器和配置采集信息等等,同时还拥有设置...
  • Onvif客户端源码

    2020-09-15 08:01:59
    Onvif 客户端获取设备地址,ptz地址,Io地址 Onvif 客户端获取设备地址,ptz地址,Io地址 Onvif 客户端获取设备地址,ptz地址,Io地址 Onvif 客户端获取设备地址,ptz地址,Io地址
  • onvif discovery

    热门讨论 2012-11-12 11:11:07
    完整的onvif discovery部分。 包括server、client。 还包含多线程处理的onvif server端程序。 主要用于学习onvif流程,了解discovery的具体实现。
  • ONVIF2.0中文协议+开源库onvif,学习中,欢迎下载。。
  • 若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 本文章博客地址:... 目录 前言 Onvif协议框架介绍 Onvif Profile A Onvif Profile Q Onvif Profile G O...
  • Onvif入门之什么是Onvif

    2020-10-23 11:52:31
    什么是onvif
  • onvif 官方测试手册,高清 详细说明了如何测试onvif!!! ONVIF_Conformance_Test_Report
  • 设备端或者服务端在或者说NVT端的RTSP Video Stream,能够与OnvifDeviceManager成功对接,对想要实现onvif视频对接的人来说有一定的参考意义 只上传了最重要的文件:onvif.c是自己写的代码实体,其他的代码都是自动...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,991
精华内容 1,196
关键字:

onvif