1. 程式人生 > >使用gSOAP工具生成onvif框架代碼

使用gSOAP工具生成onvif框架代碼

目錄 div org 就會 耗時 eap ext 目前 本地

<工具產生背景> 由於SOAP是一種基於xml的文件,手動編寫SOAP文件太機械耗時,在這種背景下產生了gSAOP 這個工具,用於生成各種類型的代碼,目前支持C/C++,如果索引ONVIF框架代碼就會發現,代碼中最主要的工作是將程序中的數據生成xml文件,或者是將xml文件中的數據解析成程序中的數據。<準備工作>?工具下載 到網站https://www.genivia.com/dev.html下載相應工具,目前最新的版本是gSOAP 2.8.53 但是該官網需要密匙才能下載,所以還是到csdn上面去找。 技術分享 或者到gsoap官網https://sourceforge.net/projects/gsoap2/
下載最新版gsoap(本次版本為gsoap_2.8.17)並解壓。技術分享 ?下載wsdl文件 到ONVF官網https://www.onvif.org/profiles/specifications/下載最新的wsdl文件。技術分享 該官網上面沒有具體的下載鏈接,所以有一個技巧,如果想要查看該wsdl文件中各個數據的含義,可以單擊該文件鏈接。
技術分享 下載wsdl文件,根據業務需要,選擇相應的wsdl文件,右擊該文件鏈接——>選擇另存為——>保存到本地的某個文件夾中就行了。

?新建工作空間

新建一個文件夾叫wsdl2h.exe soapcpp2.exe,解壓的gsoap_2.8.17文件夾,

(1)goap_2.8.17\gsoap-2.8\gsoap 路徑下的typemap.dat

(2)gsoap_2.8.17\gsoap-2.8\gsoap\bin\win32 路徑下的wsdl2h.exe soapcpp2.exe

(3)將下載的wsdl文件放在和wsdl2h.exe soapcpp2.exe同一路徑下(註意:其中包含文件 onvif.xsd ,types.xsd ,b-2.xsd ,bf-2.xsd,r-2.xsd,t-1.xsd ,ws-addr.xsd ,ws-discovery.xsd 。這些文件和wsdl文件一樣從官網上下載)。

<生成框架代碼>?生成onvif.h文件

打開windows平臺的cmd(win+r) ,通過cmd進入到新建的文件夾下面(wsdl2h.exe soapcpp2.exe),然後執行以下命令:
wsdl2h -o onvif.h -c -s -t ./typemap.dat remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl media.wsdl deviceio.wsdl display.wsdl event.wsdl imaging.wsdl recording.wsdl replay.wsdl search.wsdl receiver.wsdl ptz.wsdl
註意:根據業務需求選擇wsdl文件,如果對文件不熟悉,可以全部包含進去,防止出現函數找不到的情況,弊端是導致代碼量過大,編譯時間過長。
remotediscovery.wsdl :用於發現設備devicemgmt.wsdl :用於獲取設備參數media.wsdl:用於獲取視頻流地址ptz.wsdl:用於設備的PTZ控制
我這裏只使用了以上4個文件,所以執行命令如下
wsdl2h -o onvif.h -c -s -t ./typemap.dat remotediscovery.wsdl devicemgmt.wsdl media.wsdl  ptz.wsdl
?參數解析-c : 生成c風格代碼(註:後綴名還是.cpp ,但實際上是.c)-c++:生成c++風格代碼(註 : 默認是生成c++代碼)-x : 表示不生成xml 文件(註:生成的xml文件,有助於了解發送是SOAP是怎樣的結構,建議不使用-x)-l : 表示指定導入路徑-C : 表示生成客戶端代碼-S : 表示生成服務端代碼-s : 不使用STL代碼-o: 生成.h文件叫什麽名字-t : 後面緊跟“typemap.dat”這個批處理文件
執行完該命令後,可以在當前目錄變成如下,其中增加了onvif.h文件,該文件是接下來生成框架代碼的前提:技術分享?正式生成框架代碼 在項目開發過程中,往往需要使用“鑒權”這項功能(訪問或修改設備參數,需要用戶名跟密碼,在數據傳輸過程中,密碼是進行了加密處理的),所以在正式生成代碼之前在onvif.h文件中加上下面的代碼:
#import "wsse.h"
這樣在接下生成的框架代碼中才有相應的加密函數接口(註意:在Linux環境下,一定要安裝openssl庫)。?準備工作
(1)將gsoap_2.8.14\gsoap-2.8\gsoap\import拷貝到同gsoapcpp2.exe文件夾下 (2)將gsoap_2.8.14\gsoap-2.8\gsoap\custom拷貝到同gsoapcpp2.exe文件夾下
通過cmd進入到gsoapcpp2.exe所在文件夾,執行一下命令:
soapcpp2 -2 -c onvif.h -I .\custom -I .\import -I .\import
?參數解析
-c : 生成c風格的代碼,因為默認是c++風格的代碼-2:采用SOAP1.2,和SOAP1.0版本不同,會導致搜索工具搜索不到-I : 指定路徑-x : 不產生xml 文件(不建議是用該選項,xml在開發中具有參考意義)註意:可以是用以下命令查看各個參數的詳細作用
gsoapcpp2  -help
執行完以上命令後,可以看見當前文件夾下出現了很多.h文件.c文件.nsmap文件.xml文件(因為.xml文件太多,剪切到xml文件夾下面了) 技術分享?提取需要的文件 將soapC.c , soapH.h , soapClient.c , soapClientLib.c , soapServer.c(用於服務端/設備端的開發) , soapServerLib.c(用於服務端/設備段的開發) soapStub.h , onvif.h(該文件基本已經沒有用處了)拷貝到一個單獨的文件夾"ONVIF"下面。 將文件gsoap-2.8\gsoap\dom.c拷貝到ONVIF中(該文件好像沒什麽作用)
將文件gsoap-2.8\gsoap\custom\duration.c拷貝到ONVIF中
將文件gsoap-2.8\gsoap\custom\duration.h拷貝到ONVIF中
將文件gsoap-2.8\gsoap\plugin\mecevp.c拷貝到ONVIF中
將文件gsoap-2.8\gsoap\plugin\mecevp.h拷貝到ONVIF中
將文件gsoap-2.8\gsoap\plugin\smdevp.c拷貝到ONVIF中
將文件gsoap-2.8\gsoap\plugin\smdevp.h拷貝到ONVIF中
將文件gsoap-2.8\gsoap\stdsoap2.h拷貝到ONVIF中
將文件gsoap-2.8\gsoap\stdsoap2.c拷貝到ONVIF中
將文件gsoap-2.8\gsoap\plugin\threads.c拷貝到ONVIF中
將文件gsoap-2.8\gsoap\plugin\threads.h拷貝到ONVIF中
將文件gsoap-2.8\gsoap\plugin\wsaapi.c拷貝到ONVIF中
將文件gsoap-2.8\gsoap\plugin\wsaapi.h拷貝到ONVIF中
將文件gsoap-2.8\gsoap\plugin\wsseapi.h拷貝到ONVIF中
將文件gsoap-2.8\gsoap\plugin\wsseapi.c拷貝到ONVIF中
將生成的.nsmap文件中的任意一個(因為生成的.nsmap文件中的內容都是一樣的)拷貝到ONVIF中ONVIF文件中所有文件如下所示:技術分享利用以上框架代碼,新建main.c就可以開始項目開發了。

來自為知筆記(Wiz)

使用gSOAP工具生成onvif框架代碼