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


<工具產生背景>
          由於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_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM