在Novatek iVoT平台上使用gSOAP生成ONVIF框架程式碼

前言

過去,各廠商所推出的網路攝影機都是使用自行開發的私有連接協議,而這些協議通常是不被其他廠家的產品所相容,所以用戶不得不同時從同一廠家購買全部前端和後端產品,或者須待後端產品新增對特定廠家的協定支援,使得整個系統的安裝與設定變的異常複雜,為了解決這個問題,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

適用於進階影像串流

  • H.264 / H.265影片壓縮
  • Image設置
  • 移動警報和篡改事件
  • 元數據流
  • 雙向語音

Profile G

用於儲存與檢索

  • 配置,請求和控制錄製的影像
  • 接收聲音和元數據流

Profile M

用於分析類應用程序的元數據和事件

  • 用於元數據的分析配置和訊息查詢
  • 用於元數據配置和串流傳輸
  • 通用對象分類支持
  • 用於地理位置、車輛、車牌、人臉和人體的元數據定義
  • 用於對象計數、人臉和車牌識別分析,以及通過MQTT以JSON格式發送ONVIF事件的事件處理接口
  • 事件規則配置


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, gccautomake等套件。

執行完畢後便會安裝至系統資料夾中

gSOAP提供了兩個工具來協助生成ONVIF框架程式碼,分別為wsdl2hsoapcpp2

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的功能本身,毋須實作所有協議的細節,進而縮短產品開發時間。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論