1. onvif是啥?
攝像頭在我們的日常生活中可以說時隨處可見。而在當(dāng)下的時代,大多數(shù)攝像頭都已經(jīng)網(wǎng)絡(luò)化,早期的網(wǎng)絡(luò)攝像機硬件提供商都采用私有協(xié)議進行通訊。但隨著時代的發(fā)展,攝像頭的應(yīng)用場景越來越多,各個攝像頭的廠商也是百花齊放。私有協(xié)議終究會被淘汰。
為了解決這一困境,安訊士聯(lián)合博世及索尼公司,共同制定了onvif(Open Network Video Interface Forum,開放型網(wǎng)絡(luò)視頻接口論壇)協(xié)議。
2. onvif可以做什么?
onvif協(xié)議涵蓋了設(shè)備發(fā)現(xiàn)、設(shè)備配置、事件、PTZ控制、視頻分析和實時流媒體直播功能,以及搜索,回放和錄像錄音管理功能。
3. onvif開發(fā)技術(shù)框架
ONVIF規(guī)范中設(shè)備管理和控制部分所定義的接口均以Web Services的形式提供。每一個支持ONVIF規(guī)范的終端設(shè)備均須提供與功能相應(yīng)的Web Service。ONVIF中的其他部分比如音視頻流則通過RTP/RTSP進行。
總結(jié)onvif協(xié)議的開發(fā)公式:ONVIF = 服務(wù)端 + 客戶端 =(Web Services + RTSP)+ 客戶端 = ((WSDL + SOAP) + RTSP) + 客戶端
所以我們先來看看onvif開發(fā)中涉及到的一些技術(shù)框架
Web Services
Web Services是一種跨編程語言和跨操作系統(tǒng)平臺的遠(yuǎn)程調(diào)用技術(shù) ,可采用Http、SMTP等協(xié)議來在客戶端和服務(wù)端之間傳輸數(shù)據(jù)。其中XML被用做數(shù)據(jù)描述的語法,SOAP用于消息傳遞,WSDL用來描述服務(wù)。
onvif是建立在Web Services標(biāo)準(zhǔn)上的,定義在onvif標(biāo)準(zhǔn)里的所有配置服務(wù)都表示為Web Services操作,并在WSDL中定義,使用HTTP作為通信機制。
WSDL
WSDL(Web Service Description Language),Web services 描述語言。用于描述Web服務(wù)和說明如何與Web服務(wù)通信的XML語言,為用戶提供詳細(xì)的接口說明書。
WSDL 文檔是利用這些主要的元素來描述某個 web service 的:
<portType>: web service 執(zhí)行的操作,可以把 <portType> 元素比作傳統(tǒng)編程語言中的一個函數(shù)庫(或一個模塊、或一個類)。
<message>: web service 使用的消息,通信消息的數(shù)據(jù)結(jié)構(gòu)的抽象類型化定義。使用Types所定義的類型來定義整個消息的數(shù)據(jù)結(jié)構(gòu)。message 用來定義每個soap服務(wù)的入?yún)⒑统鰠?,包括參?shù)名,參數(shù)類型信息。(有點類似函數(shù)簽名)。
<types>: web service 使用的數(shù)據(jù)類型定義,為了最大程度的平臺中立性,WSDL 使用 XML Schema 語法來定義數(shù)據(jù)類型。
<binding>: web service 使用的通信協(xié)議。
wsdl實例:
<message name="getTermRequest">
<part name="term" type="xs:string"/>
</message>
<message name="getTermResponse">
<part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
<operation name="getTerm">
<input message="getTermRequest"/>
<output message="getTermResponse"/>
</operation>
</portType>
對比傳統(tǒng)的編程,glossaryTerms 是一個函數(shù)庫,而 "getTerm" 是帶有輸入?yún)?shù) "getTermRequest" 和返回參數(shù) getTermResponse 的一個函數(shù)。
上文提到的onvif的各個功能模塊的接口都有相對應(yīng)的WSDL文檔進行描述,可以在ONVIF官網(wǎng)「Network Interface Specifications」中查閱:https://www.onvif.org/profiles/specifications/
SOAP
SOAP(Simple Object Access Protoco) 是一種基于 XML 的應(yīng)用層協(xié)議,允許應(yīng)用程序通過 HTTP、SMPT 來交換信息。
一條 SOAP 消息就是一個普通的 XML 文檔,包含下列元素:
- 必需的 Envelope 元素, Envelope 元素是 SOAP 消息的根元素,它可把 XML 文檔定義為 SOAP 消息。
- 可選的 Header 元素,包含頭部信息,Header 元素可包含有關(guān) SOAP 消息的應(yīng)用程序?qū)S眯畔ⅲū热缯J(rèn)證、支付等)。
- 必需的 Body 元素, Body 元素可包含打算傳送到消息最終端點的實際 SOAP 消息,包含所有的調(diào)用和響應(yīng)信息。
- 可選的 Fault 元素,提供有關(guān)在處理此消息所發(fā)生錯誤的信息。
SOAP 方法指的是遵守 SOAP 編碼規(guī)則的 HTTP 請求/響應(yīng)。
HTTP + XML = SOAP
SOAP 請求可能是 HTTP POST 或 HTTP GET 請求。
HTTP POST 請求規(guī)定至少兩個 HTTP 頭:Content-Type 和 Content-Length。
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
使用WSDL+XML的模式使得onvif協(xié)議具有良好的擴展性。
4. onvif協(xié)議規(guī)范

onvif定制了一系列的協(xié)議規(guī)范profiles,profiles協(xié)議協(xié)議要求客戶端和設(shè)備彼此必須支持一組功能:
- Profile A:用于門禁控制配置,適用于電子門禁系統(tǒng)中使用的產(chǎn)品。
- Profile C:用于門控和事件管理,適用于電子門禁系統(tǒng)中使用的產(chǎn)品。
- Profile D – 候選版:用于訪問控制周邊設(shè)備,適用于周邊設(shè)備的輸入界面,例如令牌讀取器(用于讀取卡,鑰匙,移動電話或條形碼),生物識別讀取器(用于指紋識別),相機(用于虹膜,面部或車牌識別),按鍵,傳感器(用于識別鎖狀態(tài),門狀態(tài),溫度或動作)和部分輸出設(shè)備(例如鎖,顯示器和LED)。
- Profile G:用于存儲和檢索,專為基于IP的視頻系統(tǒng)而設(shè)計,支持元數(shù)據(jù)的分析配置和信息查詢,以及元數(shù)據(jù)的過濾和流式傳輸。
- Profile Q: 用于快速安裝,基于IP的視頻系統(tǒng),其目的是在網(wǎng)絡(luò)上提供Profile Q一致產(chǎn)品(例如,網(wǎng)絡(luò)攝像機,網(wǎng)絡(luò)交換機,網(wǎng)絡(luò)監(jiān)視器)的快速發(fā)現(xiàn)和基本配置。
- Profile S:用于基本視頻流,專為基于IP的視頻系統(tǒng)而設(shè)計。
- Profile T:適用于高級視頻流,專為基于IP的視頻系統(tǒng)而設(shè)計。
詳情可見:https://www.onvif.org/ch/profiles/
5. onvif通訊原理
服務(wù)供應(yīng)者(設(shè)備)負(fù)責(zé)提供Web Services(如各種onvif功能服務(wù)),這些服務(wù)通過WSDL進行描述,然后,服務(wù)請求(客戶端)將WSDL文檔將作為服務(wù)實現(xiàn)的基礎(chǔ)。WSDL編譯工具能通過WSDL文件生成與平臺相關(guān)的代碼,如可將WSDL文件轉(zhuǎn)化為c/c++代碼的gsoap。
服務(wù)端和客戶端采用soap消息來進行數(shù)據(jù)通訊。對Web Services請求和應(yīng)答都會以soap消息的形式進行傳輸。soap消息獨立于任何的操作系統(tǒng)或協(xié)議,而且可以使用各種不同的網(wǎng)絡(luò)傳輸協(xié)議進行傳送(也就是說onvif協(xié)議是應(yīng)用層協(xié)議)。onvif定義了一致的soap消息傳輸協(xié)議,用于描述Web Services。

上圖對onvif基于Web Services開發(fā)的基本原理進行了一個概括。
6. 一般的onvif協(xié)議開發(fā)流程
- 獲取所需要的wsdl;
- WSDL編譯工具能通過WSDL文件生成與平臺相關(guān)的代碼;
- 封裝實現(xiàn)客戶端業(yè)務(wù)邏輯;