Gsoap下載地址1:https://zh.osdn.net/projects/sfnet_gsoap2/releases/
Gsoap下載地址2:https://sourceforge.net/projects/gsoap2/
Gsoap安裝說明:https://www.genivia.com/downloads.html
ONVIF官網WSDL:https://www.onvif.org/profiles/specifications/
ONVIF官網API:https://www.onvif.org/onvif/ver20/util/operationIndex.html
文章出處:http://blog.csdn.net/zerolity/article/details/76442564
二、linux下安裝
1、soap下載最新soap,此處gsoap2.8.50版本
2、在linux下解壓,然後進入到解壓後的目錄gsoap-2.8;
① ./configure
② make
③ sudo make install
如果以上失敗,請驗證您是否擁有:
三、生成ONVIF框架
1、建立一個新目錄
①把/usr/local/bin/ 下剛纔生成的wsdl2h 和 soapcpp2拷貝到當前目錄下
②把gsoap-2.8/gsoap/typemap.dat也拷貝到當前目錄下
③把gsoap-2.8/gsoap/WS/WS-Discovery.wsdl拷貝至當前目錄下
2、執行命令,生成onvif.h:
兩種方法:在線生成和離線生成
a、在線生成快捷,但是,一般網絡不好的會斷開。此處小方法解決:自己手機開個wifi給筆記本。速度槓槓的!(我用的這種)
命令:./wsdl2h -o onvif.h
-c -s -t ./typemap.dat http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl
https://www.onvif.org/ver10/events/wsdl/event.wsdl https://www.onvif.org/ver10/pacs/accesscontrol.wsdl https://www.onvif.org/ver10/pacs/accessrules.wsdl
https://www.onvif.org/ver10/actionengine.wsdl https://www.onvif.org/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl http://www.onvif.org/ver10/credential/wsdl/credential.wsdl https://www.onvif.org/ver10/deviceio.wsdl https://www.onvif.org/ver10/display.wsdl
https://www.onvif.org/ver10/pacs/doorcontrol.wsdl https://www.onvif.org/ver20/imaging/wsdl/imaging.wsdl https://www.onvif.org/ver10/media/wsdl/media.wsdl https://www.onvif.org/ver20/media/wsdl/media.wsdl https://www.onvif.org/ver10/provisioning/wsdl/provisioning.wsdl
https://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl https://www.onvif.org/ver10/receiver.wsdl https://www.onvif.org/ver10/recording.wsdl https://www.onvif.org/ver10/search.wsdl https://www.onvif.org/ver10/replay.wsdl http://www.onvif.org/ver10/schedule/wsdl/schedule.wsdl
https://www.onvif.org/ver10/thermal/wsdl/thermal.wsdl https://www.onvif.org/ver10/analyticsdevice.wsdl
b、離線,到onvif官網wsdl去把所有的或者你想要的,右鍵,下載下來。
(這個注意還要下xsd文件,下了還要改wdml裏面schemaLocation元素,把他的路徑改爲你下載的xsd文件位置,我弄過一次,巨麻煩。
還是建議在線生成方便。)
命令:./wsdl2h -o onvif.h -c -s
-t ./typemap.dat *wsdl
生成過程有錯的,網上百度,這兒是一番風順,估計版本新的原因吧。
3、生成框架文件
①生成onvif.h成功後,打開生成的onvif.h
在#import 那加入一行代碼 #import "wsse.h"用於鑑權
②運行:./soapcpp2
-2 -c -x onvif.h -I ../gsoap-2.8/gsoap/:../gsoap-2.8/gsoap/import/:../gsoap-2.8/gsoap/custom/:../gsoap-2.8/gsoap/plugin/
-I 後面的gsoap路徑自己對應修改。
如果直接生成對應C的庫文件會發生重複定義錯誤,可以修改該文件。
wsa5.h(288): **ERROR**: remote method name clash: struct/class 'SOAP_ENV__Fault' already declared at line 274
打開文件gsoap_2.8.16/gsoap-2.8/gsoap/import/ wsa5.h
將277行int SOAP_ENV__Fault修改爲int SOAP_ENV__Fault_alex
或是將這個結構體直接註釋的方式(別用if 0方法註釋,還是會報錯)
,最後的結果是,都可以使用。
同時上一步生成的onvif.h文件中沒有打開wsse.h, 導致最後生成代碼中SOAP_ENV__Header 結構體中缺少定義 wsse__Security數據段,無法進行鑑權命令。
生成成功!
所有擴展名nsmap都是一樣的,留下一個更名爲wsdd.nsmap,其餘nsmap刪掉。再把soap-2.8下面的一些文件拷貝過來,最後所需文件如下所示:
duration.c soapClient.c soapH.h soapStub.h stdsoap2.h wsdd.nsmap duration.h soapC.c soapServer.c stdsoap2.c