基于ONVIF协议的摄像头开发总结

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

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

 

<web service>

 

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

 

ONVIF协议解读

 

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

 

ONVIF协议解读

 

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

ONVIF协议解读

 

 

 

<ONVIF规范>

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

ONVIF协议解读

 

A:Web Service能为视频监控什么

a)    设备的无关性,任何一个设备接入系统,不会对其他系统造成影响。

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

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

ONVIF协议解读

 

B:ONVIF规范能为视频监控带来什么

a)    抽象了功能的接口。统一了对设备的配置以及操作的方式。

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

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

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

ONVIF协议解读

 

C:ONVIF规范的内容

a)       设备发现

b)       设备管理

c)       设备输入输出服务

d)       图像配置

e)       媒体配置

f)        实时流媒体

g)       接收端配置

h)       显示服务

i)        事件处理

j)        PTZ控制

k)       其他

<WSDL>

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

<span data-wiz-span="data-wiz-span" style="font-size: 1rem;"><?xml version='1.0' encoding='UTF-8'?>
<wsdl:definitions name="HelloWorld" 
    targetNamespace="http://server.cxf.webservice.web.apps.lucl.com/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:tns="http://server.cxf.webservice.web.apps.lucl.com/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:ns1="http://schemas.xmlsoap.org/soap/http"
    >
    <!-- 定义数据类型 -->
    <wsdl:types>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:tns="http://server.cxf.webservice.web.apps.lucl.com/"
            elementFormDefault="unqualified" 
            targetNamespace="http://server.cxf.webservice.web.apps.lucl.com/"
            version="1.0">
            <xs:element name="sayHi" type="tns:sayHi" />
            <xs:element name="sayHiResponse" type="tns:sayHiResponse" />
            <xs:complexType name="sayHi">
                <xs:sequence>
                    <xs:element minOccurs="0" name="arg0" type="xs:string" />
                </xs:sequence>
            </xs:complexType>
            <xs:complexType name="sayHiResponse">
                <xs:sequence>
                    <xs:element minOccurs="0" name="return" type="xs:string" />
                </xs:sequence>
            </xs:complexType>
        </xs:schema>
    </wsdl:types>
    <!-- 定义消息分组 -->
    <wsdl:message name="sayHiResponse">
        <wsdl:part element="tns:sayHiResponse" name="parameters" />
    </wsdl:message>
    <wsdl:message name="sayHi">
        <wsdl:part element="tns:sayHi" name="parameters" />
    </wsdl:message>
    <!-- 定义port type -->
    <wsdl:portType name="HelloWorldPortType">
        <wsdl:operation name="sayHi">
            <wsdl:input message="tns:sayHi" name="sayHi" />
            <wsdl:output message="tns:sayHiResponse" name="sayHiResponse" />
            <!-- 指定当 Web 服务设法响应客户机的请求时所发生的任何消息级异常 -->
            <!-- 
            <wsdl:fault name="" message=""></wsdl:fault>  
            -->
        </wsdl:operation>
    </wsdl:portType>
    <!-- binding操作到特定协议,即关联portType到协议,这里为SOAP -->
    <!-- W3C 推荐了三个 Web 服务的绑定:
            HTTP 上的 SOAP(SOAP over HTTP)
            HTTP GET/POST 
            SOAP/MIME
    -->
    <wsdl:binding name="HelloWorldSoapBinding" type="tns:HelloWorldPortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="sayHi">
            <soap:operation soapAction="" style="document" />
            <wsdl:input name="sayHi">
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output name="sayHiResponse">
                <soap:body use="literal" />
            </wsdl:output>
            <!-- 应用portType处的fault -->
            <!-- 
            <wsdl:fault name="">
            <soap:fault name="" use="literal"/>
            </wsdl:fault>  
            -->
        </wsdl:operation>
    </wsdl:binding>
    <!-- 
        描述binding的连接信息,根据绑定所实现的 portType 来处理请求。
        对于 HTTP 上的 SOAP,这就是指向那个进程的 URL。
    -->
    <wsdl:service name="HelloWorld">
        <wsdl:port binding="tns:HelloWorldSoapBinding" name="HelloWorldPort">
            <soap:address location="http://localhost:9000/helloWorld" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions></span>

 <SOAP>

        SOAPSimple 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的开发过程。

ONVIF协议解读

SOAP协议位置

 

 

 

 

 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





   

   

   

posted @ 2017-10-04 16:16  流浪的Coder  阅读(22068)  评论(0编辑  收藏  举报