鄧 凱,蘇凱雄,李芳芳
(福州大學 物理與信息工程學院,福建 福州 350100)
?
基于ONVIF的客戶端事件處理接口的設計與實現
鄧凱,蘇凱雄,李芳芳
(福州大學 物理與信息工程學院,福建 福州 350100)
在對ONVIF協議深入分析研究的基礎上,使用gsoap和VS2008等工具設計了一個高效的ONVIF事件處理庫,集成了通用的ONVIF事件處理接口。ONVIF事件處理庫中的接口被設計成自啟線程的模式,對用戶屏蔽了底層ONVIF協議的實現過程,允許用戶設計自己的事件響應方法,同時具有完備的錯誤處理機制,能夠快速方便地被頂層應用程序調用。ONVIF事件處理庫具有自身的獨立性,不依賴于某個工程,可以被不同的工程快速集成和調用。
ONVIF;視頻監控;告警;事件處理接口;線程
隨著網絡視頻監控市場規模的擴大,各種品牌型號的網絡攝像機紛紛涌入市場,推動了視頻監控應用領域的迅速擴展。但由于沒有統一的標準,各個廠商各自為營,按照各自的協議開發產品,并捆綁銷售各自軟硬件,從而導致了不同產品之間互不兼容,限制了視頻監控系統的互聯互通與規模應用[1]。為了打破這種局面,2008年5月,安訊士、博世和索尼三方宣布共同發起成立了一個國際開放型網絡視頻接口論壇,取名為ONVIF(Open Network Video Interface Forum),其目標是在世界范圍內推動不同廠商視頻監控產品的相互兼容。時至今日,ONVIF已經擁有500多家會員。國內攝像頭廠商海康威視和大華也已加入ONVIF,作為ONVIF會員,其產品完全支持ONVIF協議,同時具有多種事件處理功能。
盡管兼容ONVIF協議的網絡攝像頭越來越多,但目前沒有統一的專為ONVIF協議設計的客戶端軟件。各個廠商在設計自己的客戶端軟件時,雖然集成了ONVIF功能來支持自己的攝像頭,但不可分離、不可復用。而國內外的許多文獻雖然研究了ONVIF協議,也有提出庫的思想,但是針對事件處理的研究較少,更沒有具體的框架方案。基于上述狀況,本文設計了一個通用的ONVIF協議事件處理庫,并對用戶屏蔽了底層ONVIF協議的處理過程,使得用戶只需要將這個事件處理庫添加到自己的工程中,并在工作函數中設計自己的事件響應方法,就可以調用事件處理庫中的接口自動響應發生的事件。在這個過程中,用戶無需關心底層的處理機制,只需要提供攝像頭的地址,賬號和密碼以及自己設計的事件響應方法即可。
ONVIF將所有的設備功能定義為Web服務,使用基于XML的WSDL語言來描述這些服務,使用SOAP協議和HTTP協議來進行信息交互[2]。ONVIF協議實現機制是:ONVIF客戶端根據WSDL描述文件將請求封裝為SOAP消息,通過HTTP發送到包含對應Web Services的Web服務器上;Web Services解析SOAP請求并通過HTTP回復客戶端;客戶端解析SOAP,提取應答信息[3]。
ONVIF很大程度上支持現有的標準,因為它的目標是實現不同產品的互通性,而不是定義全新的標準[4]。其事件處理就使用了OASIS的WS-BaseNotification和WS-Topics規范[2,5]。WS-BaseNotification規范著重于訂閱和通知操作,規范了信息交互過程中的術語、概念、操作和交互語言的格式等,定義了生產者和消費者的角色[6]。WS-Topics規范定義了主題的概念來對事件進行組織和分類,并定義了對事件進行篩選的語法和表達式[7]。
根據WS-BaseNotification規范,ONVIF的事件處理機制定義了三種角色,即客戶端、事件服務器和訂閱管理器。ONVIF為他們之間的交互定義了兩種方式,第一種是監聽阻塞方式,第二種是實時Pull-Point方式[8]。第二種方式的實時性不如第一種,但具有防火墻友好通知的優勢,當事件服務器和客戶端不在同一個網絡內時,解決了事件服務器向客戶端發送通知被防火墻攔截的問題。本文采用實時Pull-Point方式,交互過程如圖1所示。

圖1 Pull-Point交互過程
ONVIF使用的SOAP協議是用于信息交互的一種輕量級協議[9]。客戶端與服務器的交互信息最終需要按照SOAP協議進行結構化填充。根據WSDL文檔進行ONVIF協議的開發可以有兩種方法:第一種是手動的根據WSDL文檔進行SOAP協議的封裝和解析,第二種是通過第三方工具對WSDL進行自動解析編譯,提供自動封裝和解析SOAP協議的接口。對WSDL進行解析的第三方工具有很多,例如gsoap,Apache Axis2/C,WSF/C和Staff等。綜合對比,gsoap具有更優秀的能力,能夠最大化的屏蔽底層通信協議的封裝和解析,提供優良的接口,簡化開發過程[10]。本文使用gsoap2.8.19作為開發工具。
2.1框架代碼的生成
ONVIF的大多數功能都需要進行鑒權,即在soap消息的header部分添加WS-Security標簽。在ONVIF核心規范中,鑒權屬于設備管理服務下的安全部分,有關鑒權的接口被定義在devicemgmt.wsdl中,事件處理服務的相關接口被定義在event.wsdl中[8]。
使用gsoap的wsdl2h.exe工具將event.wsdl和devicemgmt.wsdl編譯成中間頭文件,然后在頭文件中添加#import "wsse.h",打開鑒權功能后再使用soapcpp2.exe生成框架代碼。Event開發的相關接口在soapStub.h中聲明,在soapClient.cpp中實現。根據實時Pull-Point方式的交互過程,開發中實際用到的基本接口有:GetCapabilities用于判斷攝像頭是否支持事件處理功能,CreatePullPointSubscription,PullMessages和Unsubscribe用于事件的訂閱、獲取和注銷,UsernameTokenDigest用于鑒權,new,delete和destroy等用于對象的實例化和銷毀。本文使用VS2008創建一個動態鏈接庫工程,將生成的基本接口文件以及鑒權相關文件和其他所需文件(例如跟soap接口相關的stdsoap2.h和stdsoap2.cpp等)添加到工程中,并以此為基礎,對基本接口進行合理的規劃和封裝,創建面向用戶的簡潔接口,以庫的形式提供給用戶使用。
2.2接口的總體設計
基本接口通過封裝成類的方式對用戶進行屏蔽,方便用戶的操作。在封裝的過程中對返回的錯誤信息進行了處理,并向上層報告。event類成員函數設計如下:
public:
event ():構造函數,封裝了各種基本的new接口;
~event ():析構函數,封裝了各種基本的delete和destroy等接口;
InitUserToken():初始化用戶名和密碼;
InitDeviceReference():初始化網絡攝像頭服務入口地址;
GetDeviceEventCapability():封裝基本接口GetCapabilities,判斷是否支持事件處理功能[11];
InitCallbackFunc():初始化用戶回調函數;
RenewCallbackFunc():更新用戶回調函數;
Start():啟動事件處理服務;
private:
mCreatPullPointSubscription():封裝基本接口CreatePullPointSubscription,創建訂閱管理器;
mPullMessages():封裝基本接口PullMessages,獲取事件通知;
mThreadFunc():事件處理服務線程方法函數;
mDestroyPullPointSubscription():封裝基本接口Unsubscribe,注銷訂閱管理器。
Start()是事件處理服務面向用戶的核心部分,封裝了事件處理服務線程的創建,線程方法函數為ThreadFunc()。在ThreadFunc()中會調用一次mCreatPullPointSubscription()接口,向網絡攝像頭中的服務器申請創建訂閱管理器,之后不停地調用mPullMessages()接口請求并處理事件通知。mPullMessages()是事件處理服務面向ONVIF協議的底層核心部分,以函數指針的形式關聯用戶的事件處理方法。經過一系列的初始化后,用戶只需調用Start()即可開啟獨立線程開始事件處理服務,而不需理解底層事件處理的具體流程和操作。用戶唯一需要關心的就是編寫自己的事件處理方法,通過InitCallbackFunc()接口將其入口地址告知事件處理服務線程,同時可以在任何時候通過RenewCallbackFunc()更換事件處理方法。事件處理服務頂層工作流程如圖2所示,Strat()調用底層接口的過程如圖3所示。

圖2 事件處理服務頂層工作機制

圖3 Strat()內部機制
2.3ThreadFunc()線程方法函數的設計
由于本文使用實時Pull-Point方式,所以在線程中需要將mPullMessages()放到while循環里,連續并主動地去獲取事件通知并進行處理。這就需要考慮線程的退出問題。雖然Windows提供了一些終止線程的方法,例如ExitThread()和TerminateThread (),但這些方法都有內存泄露和死鎖等風險。線程的最佳停止方法就是能夠自行退出,而不是簡單地使用ExitThread()或TerminateThread ()等來強行終止線程。本文根據實際應用情況,使用了一個事件對象,在while循環體中,每次調用mPullMessages()后,對這個事件對象進行超時等待。而事件的觸發位于類的析構函數中,當該類的對象完成任務被析構時,就會觸發該事件使線程正常退出。
2.4mPullMessages()的設計
mPullMessages()作為底層最核心的部分,決定了整個事件處理服務的框架和方法。mPullMessages()的主要功能是獲取并分析網絡攝像頭發生的事件,并通過回調函數實現用戶的響應方法。網絡攝像頭的異常事件有很多,例如移動、遮擋、越界、區域切換、外部IO觸發和硬盤滿等異常事件。這些事件可以通過主題和內容進行區分。CreatPullPointSubscription基本接口的請求參數列表中有一個Filter參數,根據主題填充該參數可以向事件服務器訂閱專一的消息。例如,可以專門訂閱移動偵測或者遮擋偵測,這樣當各自的訂閱管理器返回事件通知時,不必判斷是哪一種事件就可以迅速作出處理。同樣,可以訂閱所有事件,然后對訂閱管理器返回的事件類型進行判斷后再做對應的處理。根據不同主題訂閱專門的事件通知在實時性上占有很大的優勢,但這種優勢是體現在創建多線程的基礎上。而多線程帶來的是程序和資源分配的復雜性上升。對于實時性要求不是很高的場合,可以通過訂閱所有事件,然后通過分析事件類型的方法來進行處理。本文實現的移動偵測和遮擋偵測在民用領域的實時性要求不是很高,有1 s左右的延時完全不影響結果,故采用訂閱所有事件的方法。
mPullMessages()通過調用基本接口PullMessages向訂閱管理器請求獲取事件通知,然后根據返回的信息判斷屬于哪種類型的事件。根據海康威視和大華的網絡攝像頭返回結果,本文在Event類中定義Motion="tns1:RuleEngine/CellMotionDetector/Motion"和Tamper="tns1:RuleEngine/TamperDetector/Tamper"兩個字符串常量,用于匹配移動偵測和遮擋偵測。
Event類中通過定義一個函數指針EventCallbackFunc來允許用戶設計自己的事件響應方法。用戶通過InitCallbackFunc()接口將自己的處理函數入口地址賦給EventCallbackFunc。mPullMessages()在分析判斷出PullMessage基本接口的返回結果后,通過函數指針來調用用戶的處理函數。這樣在設計事件處理接口時不必考慮事件發生時該怎么處理,使得事件處理能夠獨立于頂層應用開發工程,而不與用戶行為耦合在一起。Event類中還設計了一個RenewCallbackFunc()方法用于用戶在事件處理過程中更換處理方法,同時mPullMessages()中對函數指針的調用進行加鎖保護,為用戶帶來了極大的方便。mPullMessages()內部處理流程如圖4所示。

圖4 mPullMessages()內部機制
由于海康威視和大華是國內權威的ONVIF攝像頭廠商,所以使用海康威視DS-2CD3Q10FD-IW、DS-2CD3210D-I3和大華dh-ipc-kw12w-ce攝像頭進行測試,開啟攝像頭的移動偵測功能和遮擋偵測功能。使用VS2008創建一個控制臺應用工程,在工程中導入生成的庫和類的頭文件聲明后,設計用戶處理函數為Func1和Func2。在main函數中首先實例化一個event對象,接著依次調用InitUserToken()和InitDeviceReference()初始化用戶名、密碼和攝像頭服務入口地址。然后調用GetDeviceEventCapability()判斷攝像頭是否支持事件處理,若支持則調用InitCallbackFunc(),初始化用戶函數為Func1,最后調用Start()。啟動程序后,當用硬紙板在攝像頭前晃動時,迅速回顯Func1的Motion字符串,如圖5和圖6所示;當用硬紙板擋在攝像頭上時,迅速回顯Func1的Tamper字符串,同時因為有移動,所以也會回顯Func1的Motion字符串,如圖7和圖8所示。當調用RenewCallbackFunc()切換用戶函數為Func2時,迅速回顯Func2的相關字符串,如圖9所示。每一次偵測到移動或者遮擋都會返回七八條事件通知。在測試過程中,每次回顯間隔1 s左右,符合程序中設計的延時。

圖5 移動(截圖)

圖6 移動回顯(截圖)

圖7 遮擋(截圖)

圖8 遮擋回顯(截圖)

圖9 用戶函數切換回顯(截圖)
本文論述了基于ONVIF協議的事件處理接口的設計和實現方法。通過使用訂閱所有事件分析返回結果判斷事件類型的方法,實現了移動偵測和遮擋偵測。在工程中導入事件處理庫和必要的聲明文件后,用戶只需要專注地設計自己的事件處理函數,然后經過非常簡單的初始化和判斷,就能調用Start()接口進行事件的偵測處理。這種事件處理庫的設計模式不僅向用戶屏蔽了ONVIF底層的處理過程,并且與用戶行為高度分離,大大簡化了應用程序的開發過程,縮短了開發周期。
[1]陳少尉,蔡東升,黃琦,等.基于ONVIF協議的變電站網絡攝像機測試系統設計與實現[J].電測與儀表,2014,51(16):117-123.
[2]李校林,肖路歡,何策.基于ONVIF協議的NVR系統中網絡視頻接口的設計[J].電視技術,2014,38(11):166-169.
[3]文凱,張潤.基于ONVIF的網絡視頻監控告警系統的實現[J].電視技術,2014,38(21):90-93.
[4]馬宇昌,沈蘇彬,歐陽志友.基于ONVIF標準的設備發現的設計與實現[J].計算機技術與發展,2013 (11):224-228.
[5]黃方靖.ONVIF協議在IPCam系統中的設計與實現[J].電子測量技術,2015,38(5):139-142.
[6]OASIS.Web services base notification 1.3 [EB/OL].[2015-10-16].http://docs.oasis-open.org/wsn.
[7]OASIS.Web services topics 1.3 [EB/OL].[2015-10-16].http://docs.oasis-open.org/wsn.
[8]ONVIF.ONVIF core specification ver2.6[EB/OL].[2015-10-16].http://www.onvif.org/specs/DocMap-2.6.html.
[9]W3C.SOAP version 1.2 part 1: messaging framework (second edition)[EB/OL].[2015-10-16].http://www.w3.org/TR/soap12-part1.
[10]LOPES S F,SILVA S,MENDES J,et al.Development of a library for clients of ONVIF video cameras: challenges and solutions [C]//2013 IEEE International Conference on Industrial Technology.[S.l.]:IEEE,2013:1260-1266.
[11]朱耀麟,李倩,王昊星.ONVIF協議的網絡視頻監控客戶端接口研究[J].西北大學學報(自然科學版),2014,44(3):392-396.
責任編輯:閆雯雯
Design and implementation of event handing interfaces for clients based on ONVIF protocol
DENG Kai,SU Kaixiong,LI Fangfang
(CollegeofPhysicsandInformationEngineering,FuzhouUniversity,Fuzhou350100,China)
On the basis of in-depth analysis and research to ONVIF protocol, using tools such as gsoap and VS2008 designed an efficient ONVIF event handing library, integrating general ONVIF event handling interfaces. These interfaces in ONVIF event handing library are designed to start threads automatically, hide underlying ONVIF protocol implementation process from the user and allow users design themselves event response functions. These interfaces have complete error handling mechanism and can be called by the top application quickly and easily. This ONVIF event handing library is independent and doesn’t rely on a certain project. So it can be integrated and called by different projects rapidly.
ONVIF; video surveillance; alarm; event handing interface; thread
TN915
A
10.16280/j.videoe.2016.09.026
福建省產學重大項目(2015H6014);福建省發改委科技創新項目(閩發改投資【2014】168號)
2015-11-16
文獻引用格式:鄧凱,蘇凱雄,李芳芳. 基于ONVIF的客戶端事件處理接口的設計與實現[J].電視技術,2016,40(9):127-131.
DENG K,SU K X,LI F F. Design and implementation of event handing interfaces for clients based on ONVIF protocol[J]. Video engineering,2016,40(9):127-131.