1. 程式人生 > >基於ONVIF協議的攝像頭開發總結

基於ONVIF協議的攝像頭開發總結

方式 遠程 object amp 利用 構建 bin ide code

<什麽是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 調用的方法來調用遠程對象

技術分享

Web Service是基於XML和HTTPS的一種服務,其通信協議主要基於SOAP。服務端、客戶端以傳遞符合XML的SOAP消息實現服務的請求與回應。

技術分享

客戶端根據 WSDL 描述文檔,會生成一個 SOAP 請求消息,該請求會被嵌入在一個HTTP POST請求中,發送到Web Services 所在的Web 服務器。Web Services 請求處理器解析收到的 SOAP 請求,調用相應的 Web Services。然後再生成相應的SOAP 應答。Web 服務器得到 SOAP 應答後,會再通過 HTTP應答的方式把信息送回到客戶端。

技術分享

<ONVIF規範>

ONVIF規範向視頻監控引入了Web Service的概念。設備的實際功能均被抽象為了Web Service的服務,視頻監控系統的控制單元以客戶端的身份出現,通過

Web請求的形式完成控制操作。

技術分享

A:Web Service能為視頻監控什麽

a) 設備的無關性,任何一個設備接入系統,不會對其他系統造成影響。

b) 設備的獨立性,每一個設備只負責對接收到的請求做出反饋,甚至不需要知曉控制端的存在。

c) 管理的集中性,所有的控制由客戶端來發起。

技術分享

B:ONVIF規範能為視頻監控帶來什麽

a) 抽象了功能的接口。統一了對設備的配置以及操作的方式。

b) 控制端關心的不是設備的型號,而是設備所提供的Web Service

c) 規範了視頻系統中Web Service範圍之外的行為。

d) ONVIF提供了各個模塊的WSDL,擁有效率非常高的開發方式。

技術分享

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的開發過程。

技術分享

SOAP協議位置

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



來自為知筆記(Wiz)



基於ONVIF協議的攝像頭開發總結