前言
過去,各廠商所推出的網路攝影機都是使用自行開發的私有連接協議,而這些協議通常是不被其他廠家的產品所相容,所以用戶不得不同時從同一廠家購買全部前端和後端產品,或者須待後端產品新增對特定廠家的協定支援,使得整個系統的安裝與設定變的異常複雜,為了解決這個問題,ONVIF協議因而誕生。
ONVIF(Open Network Video Interface Forum,開放式網路視訊介面論壇)是由Axis Communications、Bosch Security Systems以及Sony Corporation等三家公司在2008年合作建立的全球開放性論壇,是目前安防產業的重要國際標準,ONVIF協議的出現很好的解決了各個廠家產品不能相互相容的問題。
本文旨在介紹如何在聯詠平台上,使用gSOAP這套工具來產生ONVIF協議的框架程式碼。
ONVIF簡介
ONVIF規範
ONVIF定義了許多profiles,客戶端與設備若支援相同profile,便可以彼此溝通,執行特定功能,客戶端與設備可以支援多個profile,例如本地存儲功能的網路攝影機可以同時符合Profile S和G協議。在諸profile協議中,與安防影像系統相關的有:
名稱 |
描述 |
Profile S |
用於基本影像串流
|
Profile T |
適用於進階影像串流
|
Profile G |
用於儲存與檢索
|
Profile M |
用於分析類應用程序的元數據和事件
|
Web Services
ONVIF協議中,設備管理與控制部分所定義的接口均以Web Services的形式提供。每一個支持ONVIF協議的設備均須提供與功能相應的Web Service。ONVIF中影音串流的部分則通過RTP/RTSP進行。
Web Service是以Web的標準為基礎,其中最基本的是HTTP+XML。Web Service 由四個核心元件所組成,分別是XML&HTTP、SOAP、WSDL和UDDI,如下圖所示
UDDI
註冊與查詢服務
WSDL
Web Service的描述,敘述服務的內容與說明如何與服務通信的XML語言,作用類似C語言的header檔案,下圖為ONVIF協議中新增設備使用者之API描述範例,定義了呼叫時需至少需要攜帶一個tt:User為參數。
SOAP
SOAP (Simple Object Access Protocol) 是一種基於XML的應用層協議,允許程式透過HTTP來交換訊息,一個SOAP訊息就是一個XML文件,包含Envelope、Header、Body或Fault等數種元素,下圖範例為ONVIF協議中新增設備使用者的訊息格式:
XML&HTTP
讓不同程式透過HTTP通訊協定,以XML格式互相交換彼此的資料,使其與程式語言、平台和硬體無關,實現跨平台、跨語言、跨Internet的整合目的。
核心元件間彼此的關係圖如下
使用gSOAP生成ONVIF框架程式碼
gSOAP是由GENIVIA提供的SOAP/XML開源工具,可以將WSDL文件轉換成對應的C/C++程式碼,包含WSDL中所定義的函式與變數結構體,讓開發者從SOAP細節的實作中解脫,得以專注在API功能的實現。
更詳細的gSOAP介紹可以參考官方網站https://www.genivia.com/
在官方網頁的說明文件中,建議使用gSOAP 2.8.62以上的版本來開發ONVIF專案,本文所使用的開發環境為Ubuntu 18.04,由apt取得的gSOAP版本僅為2.8.60版,因此需手動下載最新版gSOAP 2.8.117自行編譯,必須先安裝bison, flex, gcc與automake等套件。
執行完畢後便會安裝至系統資料夾中
gSOAP提供了兩個工具來協助生成ONVIF框架程式碼,分別為wsdl2h與soapcpp2
wsdl2h
wsdl2h的功能是根據提供的wsdl文件產生下一階段所需要的頭文件,wsdl文件的來源可以是在本地端,或者是直接輸入網址來下載,範例中我們使用media, device management兩個WSDL連結來產生相對應的頭文件。使用指令如下:
wsdl2h會自動根據輸入的網址去抓取wsdl文件與相關的xsd檔案,並產生onvif.h頭文件,指令所使用的參數意義如下:
參數 |
敘述 |
-O4 |
最佳化程式碼並移除沒有使用到的元件 |
-c |
產生C語言檔案而非預設的C++ |
-P |
移除ONVIF未使用的xsd__anyType類別以減少程式碼體積 |
-x |
不產生沒有使用到的xsd:any元素與xsd:anyAttribue屬性 |
-o onvif.h |
輸出文件名稱為onvif.h |
soapcpp2
產生onvif.h檔案後,接下來要使用另一個應用程式soapcpp2來生成真正要編譯的c程式碼檔案,指令使用方式如下:
參數 |
敘述 |
-2 |
使用ONVIF需要的SOAP 1.2版規範 |
-c |
產生C語言檔案而非預設的C++ |
-S |
由於是在設備上執行,因此只產生Server端的原始碼 |
-x |
不產生XML訊息範本文件 |
-I |
指定要匯入的資料夾 |
至此,ONVIF的框架程式碼便生成完畢,資料夾中的檔案列表如下
其中,onvif.h已不再需要,而nsmap檔案的內容是相同的,因此只需保留一個,後續程式中再include進去,其中在soapStub.h中定義了相關API的函式原型,需要開發者自行實作與設備間的資訊取得與設定,可搜尋Server-Side Operations區塊,下方所列出的就是在devicemanagement.wsdl與media.wsdl中所定義的API,此兩份文件約有170個API,開發者可根據要支援的profie增減相關的wsdl檔案
後續的流程,便是將產生的soapC.c、soapH.h、soapServer.c與soapStub.h,加上gsoap原始碼中的stdsoap2.c與stdsoap2.h,連同API的實作部分一同在聯詠的iVoT開發平台中編譯,可以選擇將輸出檔案編譯為CGI格式,或是使用soapServerLib.c將結果編譯為lib的樣式,經由設備中的http server來呼叫並回應。
結語
使用gSOAP產生ONVIF的框架程式碼,可以讓開發者可以專注在實作API的功能本身,毋須實作所有協議的細節,進而縮短產品開發時間。
評論