朱耀麟,李 倩,王昊星
(1.西安工程大學電子信息學院,陜西西安 710048;2.中煤科工集團西安研究院有限公司,陜西西安 710055)
隨著網(wǎng)絡的迅速發(fā)展,各種各樣與網(wǎng)絡相關的技術和產(chǎn)品應運而生,目前備受矚目的網(wǎng)絡視頻監(jiān)控產(chǎn)品就是其中一種。它一般包括網(wǎng)絡攝像機,視頻編碼器,網(wǎng)絡視頻錄像機(NVR)等。但是,現(xiàn)在大部分的視頻監(jiān)控系統(tǒng)還需要手動添加服務端(網(wǎng)絡攝像機),并且對服務端的配置等都是手動操作,同時在網(wǎng)絡監(jiān)控系統(tǒng)中,各種產(chǎn)品會由很多公司生產(chǎn),不同品牌的設備間的互通問題迫切需要解決。在2008年由SONY等企業(yè)創(chuàng)建的ONVIF組織,該組織制訂的協(xié)議標準目標是解決設備互通等問題,重點關注客戶端與服務端的接口通信,并且以Web Services為基礎,其中設備發(fā)現(xiàn)與設備管理模塊是搭建網(wǎng)絡視頻監(jiān)控系統(tǒng)的首要步驟。目前,已經(jīng)有一批視頻監(jiān)控工作者對符合ONVIF的產(chǎn)品進行了研究與設計[1-5]。文獻[1]是對開放式網(wǎng)絡視頻接口協(xié)議ONVIF的研究,先對ONVIF協(xié)議進行描述與分析,然后設計客戶端,并對客戶端訪問目標設備的情況進行測試,主要完成了設備查找、管理及實時流傳輸?shù)臋z測;文獻[2]設計了基于ONVIF的NVR軟件平臺,是對具體的網(wǎng)絡視頻監(jiān)控設備的設計,主要完成了NVR的基本功能,并對設計的NVR軟件進行測試;文獻[3]主要對基于ONVIF協(xié)議的設備發(fā)現(xiàn)功能進行了研究與設計,對發(fā)現(xiàn)過程進行詳細分析;文獻[4]重點描述 gSOAP軟件在符合ONVIF協(xié)議的網(wǎng)絡視頻監(jiān)控系統(tǒng)中的應用,主要對gSOAP工具包進行介紹以及對媒體服務功能進行研究;文獻[5]是對符合ONVIF協(xié)議的網(wǎng)絡攝像機應用接口的研究與設計,和文獻[2]相比,均屬于具體的設備設計,不同點在于文獻[5]重點研究ONVIF協(xié)議制定的幾項服務功能,而文獻[2]設計的NVR選擇了ONVIF服務功能中的重要功能,還設計了NVR需要的解碼器、Web客戶端等。上述文獻基本都涉及到ONVIF協(xié)議中的設備發(fā)現(xiàn)服務功能,也有對設備管理功能的研究。但是,對實時視頻流地址的獲取以及轉(zhuǎn)發(fā)實現(xiàn)還有待研究。
本文根據(jù)ONVIF協(xié)議,進行網(wǎng)絡視頻監(jiān)控客戶端接口的服務功能設計,做到客戶端能夠自動發(fā)現(xiàn)并連接服務端,同時對服務端進行配置,在上述兩項功能的基礎之上能夠獲取實時視頻流地址,并通過VLC播放,實現(xiàn)視頻流轉(zhuǎn)發(fā)。該設計基于2012年7月更新的ONVIF標準的WSDL文檔和一些核心規(guī)范文檔,根據(jù)規(guī)范里的服務功能— —設備發(fā)現(xiàn)和設備管理以及媒體配置(只利用視頻流實時轉(zhuǎn)發(fā)部分)進行接口設計,形成小的客戶端,然后通過與符合ONVIF標準的網(wǎng)絡攝像機(服務端)的通信,測試接口服務的實際應用情況。整個設計過程需要用到gSOAP工具,并且在設計前需對gSOAP文件夾中的typemap.dat文件進行必要的空間前綴添加,同時對WSDL文件的空間前綴進行必要修改。
本文設計的網(wǎng)絡視頻監(jiān)控客戶端接口需要完成發(fā)現(xiàn)服務端,并對服務端進行設備管理、實時視頻流地址獲取,實現(xiàn)轉(zhuǎn)發(fā)觀看。基于上述目標,對客戶端接口進行模塊劃分,首先需要對客戶端與服務端在網(wǎng)絡視頻監(jiān)控系統(tǒng)中的通信方式進行分析。
基于ONVIF協(xié)議的設備間具體通信情況如圖1所示:

圖1 客戶端與服務端的通信方式Fig.1 Client and server communication
根據(jù)圖1所示,ONVIF客戶端與ONVIF服務端的通信情況可以看成是由4部分組成:第一部分是設備發(fā)現(xiàn)模塊;第二部分是設備管理模塊;第三部分和第四部分是媒體配置模塊中的實時流轉(zhuǎn)發(fā)內(nèi)容。
ONVIF協(xié)議中的設備發(fā)現(xiàn)模塊,采用WSDiscovery文檔描述的WS-Discovery方案,能夠?qū)崿F(xiàn)自動搜索服務端,發(fā)現(xiàn)其IP地址等一些信息。這個設備發(fā)現(xiàn)方案,采用的是SOAP通信方式和UDP消息傳輸格式,使用 Hello—Probe—Probe-Match—Bye的方式,其中,由加入網(wǎng)絡監(jiān)控系統(tǒng)的每個服務端向客戶端所在的網(wǎng)絡多播發(fā)送Hello,客戶端則多播發(fā)送Probe,能夠匹配Probe報文中的Types和Scopes內(nèi)容的服務端攝像機單播回復ProbeMatch;當服務端攝像機離開該網(wǎng)絡時,則需要多播發(fā)送Bye消息。在整個過程中,攝像機可以隨意加入或離開網(wǎng)絡,但不影響客戶端對攝像機的搜索發(fā)現(xiàn),這是WS-Discovery的特點,也是本設計中做到自動搜索的前提。WS-Discovery方案中還有一種Discovery Proxy方式,在這種方式中,一個DP或多個DP加入客戶端與服務端所在的網(wǎng)絡,單播發(fā)送Hello;當客戶端接收到DP的Hello,就不會顧及服務端發(fā)送的任何信息,只向DP單播發(fā)送Probe。服務端也向DP發(fā)送單播Probe,在這種情況下,客戶端與服務端就利用DP進行通信,當在同一局域網(wǎng)或者只有少量相機的環(huán)境中可以不使用網(wǎng)絡代理服務這種方式。
在本設計中,由于網(wǎng)絡攝像機數(shù)量有限,不考慮代理方式。
設備管理,用于獲取設備的功能和信息。根據(jù)ONVIF-Core-Specification-v220文檔,該模塊被劃分為5類,分別是 Capabilities(功能),Network(網(wǎng)絡),System(系統(tǒng)),Security(安全),I/O(輸入輸出)。在本文中,主要涉及功能和系統(tǒng)兩部分。
根據(jù)設備發(fā)現(xiàn)模塊得到的服務端的IP(XAddrs)地址,從而可以獲取服務端的功能信息。當進行獲取信息操作時,根據(jù)本文的設計,需要得到Media URL,該URL對下面要進行的視頻流轉(zhuǎn)發(fā)起前提作用。
對于系統(tǒng)部分,可以對網(wǎng)絡攝像機本身進行管理和配置,比如網(wǎng)絡攝像機信息的獲取,系統(tǒng)時間的獲取和設置等。對設備的配置,不是任意的行為,必須先利用ONVIF device test tool對網(wǎng)絡攝像機進行測試,根據(jù)得到的報文分析判斷該設備是否可以進行日期時間設置。根據(jù)判定,本文用到的網(wǎng)絡攝像機可以進行對系統(tǒng)日期時間的重新設置。
在ONVIF協(xié)議中,媒體是利用 media profiles進行控制的。media profiles的獲取需要依靠Media URL,這是在設備管理模塊中的功能部分中得到的。
媒體文件中的配置有很多種,比如音頻編碼配置,視頻編碼配置等,并且在服務端設備支持的情況下,還可以對媒體文件進行新建、修改、刪除。一般網(wǎng)絡攝像機中都會有默認的媒體文件,根據(jù)這個文件,就可以對媒體進行配置。本文即采用默認媒體文件對視頻流地址進行獲取。
由于設備等條件限制,本文利用VLC播放器能夠播放網(wǎng)絡地址文件的特點,對得到的視頻流StreamUri進行轉(zhuǎn)發(fā)播放。
ONVIF規(guī)范采用Web services架構,客戶端與服務端要利用SOAP協(xié)議進行數(shù)據(jù)交互。Web services是基于網(wǎng)絡的、分布式的模塊化組件,利用HTTP和SOAP協(xié)議使數(shù)據(jù)在Web上傳輸。所以實現(xiàn)客戶端的接口設計,需要搭建Web服務框架,然后將具體的Web服務進行實現(xiàn)。
ONVIF服務功能的開發(fā)大致流程如圖2所示:

圖2 Web服務開發(fā)流程Fig.2 Development process ofWeb service
WSDL文件,實際上就是用XML語言描述的ONVIF不同的服務功能內(nèi)容,根據(jù)WSDL內(nèi)容,可以制定相應的Web services,同時,Web services的實現(xiàn)要使用Java或者C++語言。根據(jù)實際情況,本文為了簡化開發(fā)工作,使用gSOAP-2.8.9工具包,選擇C++語言進行開發(fā)。通過gSOAP工具包將ONVIF服務轉(zhuǎn)換成C++框架代碼后,將進行具體的服務功能的代碼實現(xiàn)。
在本文設計的開始部分,即在進行解析WSDL文件前,必要的步驟是在gsoap文件夾中找到typemap.dat文件并向其添加一些配置,即ONVIF recommended prefixes,WS-Discovery 1.0 remapping,SOAP-ENV mapping,OASIS recommended prefixes等項,這些配置的內(nèi)容是一些空間前綴地址,如 tds=http://www.onvif.org/ver10/device/wsdl,添加的意義在于進行WSDL文件解析為C++文件時需要用到這部分內(nèi)容。并且,從ONVIF官網(wǎng)下載的WSDL文件也需要對其schema-Location進行修改。在本文中,需要改為schema-Location="onvif.xsd"。
1)利用wsdl2h.exe進行頭文件編譯。
在電腦的cmd.exe程序中,輸入命令,以設備發(fā)現(xiàn)服務為例,如
wsdl2h-c-o remotediscovery.h-s remotediscovery.wsdl-IE:onvifgsoap;E:onvifgsoapimport,運行后可得到頭文件remotediscovery.h。
2)利用soapcpp2.exe生成相應的可用于編譯的代碼。
根據(jù)得到的頭文件,輸入soapcpp2-L-C-x remotediscovery.h-IE:onvifgsoap;E:onvifgsoapimport,可得到編譯所需的文件,DiscoveryLookup-Binding.nsmap,soapC.c,soapClient.c,soapH.h,soapStub.h。
使用Microsoft Visual Studio 2008工具,根據(jù)wsdl2h.exe和soapcpp2.exe得到的編譯所需頭文件和源文件,建立工程,實現(xiàn)設備發(fā)現(xiàn),設備管理及視頻流轉(zhuǎn)發(fā)。
2.2.1 設備發(fā)現(xiàn) 該功能模塊中,首先需要進行初始化。
用到的初始化函數(shù)是:
soap-default-SOAP-ENV--Header(soap,&header);
soap-default-d--ScopesType (soap,&sScope);soap-default-d--ProbeType(soap,&req);在同一局域網(wǎng)中,多播發(fā)送Probe,調(diào)用的函數(shù)是:
soap-call---dndl--Probe(soap,"soap.udp://239.255.255.250:3702/",NULL,&req,&resp)。
2.2.2 設備管理 根據(jù)設計需要,該模塊需要設計Get services功能,該功能可以得到網(wǎng)絡攝像機所支持服務的服務地址。本文中需要用到media服務地址。
工程需要進行結(jié)構體聲明,構建soap-new(),然后調(diào)用函數(shù):
soap-call---tds--GetServices(soap,"http://192.168.100.168/onvif/device-service",NULL,& GetServices& GetServicesResponse)獲取服務。
輸出的運行結(jié)果,可以根據(jù)struct-trt--Get-ServicesResponse GetServicesResponse的定義進行選擇。
根據(jù)設計要求,本文用的是:
GetServicesResponse.Services-> XAddr。.
c)獲取rtsp地址,進行視頻流轉(zhuǎn)發(fā)
工程需要進行結(jié)構體聲明,GetStreamUri.ProfileToken取值 "Profile-token-0";在調(diào)用函數(shù)soap-call---trt--GetStreamUri時,soap-endpoint地址是http://192.168.100.168:80/onvif/services。
輸出結(jié)果選用 GetStreamUriResponse.MediaUri-> Uri,即 printf("StreamUri=%s ",Get-StreamUriResponse.MediaUri->Uri)。
使用筆記本電腦,與符合ONVIF的網(wǎng)絡攝像機相連(本次實驗使用一臺攝像機),對利用VS 2008工具建立的工程進行編譯運行。為驗證設計的客戶端接口,利用ONVIF device test tool對同一臺IP攝像機進行測試。
如圖3所示,獲取的攝像機IP地址是http://192.168.100.168:80/onvif/device-service。

圖3 設備發(fā)現(xiàn)Fig.3 Device discovery
根據(jù)設備發(fā)現(xiàn)功能獲取的地址,可順利完成設備管理模塊,得到 Media服務地址:http://192.168.100.168:80/onvif/services,如圖4所示。

圖4 服務地址Fig.4 Service address
根據(jù)設備管理獲取的地址,進而獲取Media Profile。根據(jù)以上信息,獲取StreamUri,為rtsp://192.168.100.168:554/0。由圖5所示。

圖5 視頻流地址Fig.5 StreamUriaddress
最后利用 VLC播放器可連接該地址實現(xiàn)轉(zhuǎn)發(fā)攝像機拍攝內(nèi)容,視頻截圖如圖6所示。

圖6 轉(zhuǎn)發(fā)的URI內(nèi)容Fig.6 Transmit the conten of URI
根據(jù)獲取的視頻流地址可進行VLC播放可知,本文獲取的StreamUri是正確的。
完成上述測試后,使用ONVIF device test tool對同一臺IP攝像機進行設備發(fā)現(xiàn)、設備管理、實時視頻流地址獲取3種服務功能的測試,其測試結(jié)果與上述工程運行結(jié)果相同。
綜合上述測試結(jié)果可知,本文設計的客戶端接口能夠完成ONVIF協(xié)議的設備發(fā)現(xiàn)、設備管理、實時視頻流地址獲取服務功能,并能夠通過VLC播放器對IP攝像機拍攝的視頻進行播放,基本達到設計目標。
本文研究了ONVIF協(xié)議的網(wǎng)絡視頻監(jiān)控客戶端,根據(jù)最新的ONVIF協(xié)議內(nèi)容進行了網(wǎng)絡視頻監(jiān)控客戶端的設備發(fā)現(xiàn)和設備管理服務功能的接口研究,并完成視頻流實時轉(zhuǎn)發(fā),解決了設備間的互通問題。設計用到的設備與工具有Microsoft visual studio 2008,ONVIF device test tool,VLC 播放器,MiniSniffer抓包工具以及gSOAP-2.8.9工具包,其中對gSOAP-2.8.9的一些配置和ONVIF的WSDL文件進行了必要修改。結(jié)果顯示網(wǎng)絡攝像機IP地址,StreamUri等可以獲取,表明利用WS-Discovery方式可實現(xiàn)自動搜索網(wǎng)絡攝像機的IP,并且可以獲得并配置攝像機信息,視頻流Uri也可得到,并利用VLC播放器實現(xiàn)轉(zhuǎn)發(fā)。
[1] 金巍.開放式網(wǎng)絡視頻接口協(xié)議研究[D].南京:南京大學,2011.
[2] 徐飛明.基于ONVIF協(xié)議的NVR軟件平臺的設計與開發(fā)[D].杭州:浙江大學,2012.
[3] 馬宇昌,沈蘇彬,歐陽志友.基于ONVIF標準的設備發(fā)現(xiàn)的設計與實現(xiàn)[J].計算機技術與發(fā)展,2013,23(11):224-228.
[4] 肖路歡,謝燦,何策.gSOAP在基于ONVIF協(xié)議的網(wǎng)絡視頻監(jiān)控系統(tǒng)中的應用[J].數(shù)字技術與應用,2013(6):128-129.
[5] 馬宇昌.網(wǎng)絡攝像機應用接口的研究與實現(xiàn)[D].南京:南京郵電大學,2013.
[6] ONVIF.ONVIF Core Specification ver2.1[EB/OL].[2011-06-01].http://www.onvif.org/.
[7] Microsaft Coporation.Web Services Dynamic Discovery(WS-Discovery)[S].2005-04.
[8] ONVIF.ONVIF-WG-APG-Application-Programmer's-Guide[EB/OL].[2011-05-02].http://www.onvif.org/.