目錄
下載wsdl源文件
wsdl文件官網: https://www.onvif.org/profiles/specifications/
可以選擇將各個wsdl文件下載下來,也可以不下載, 本文采用不下載方式。
編譯wsdl源文件、生成c/c++代碼
準備編譯環境
新建目錄onvif-wsdl, 將gSOAP安裝目錄下的custom、import、typemap.dat、wsdl2h、soapcpp2拷貝過來,效果如下:
gSOAP的安裝過程參考:gSOAP編譯安裝
編譯
編譯過程分爲兩步:
第一步: 生成頭文件
./wsdl2h -P -x -c -s -t typemap.dat -o onvif.h https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl https://www.onvif.org/ver10/events/wsdl/event.wsdl https://www.onvif.org/ver10/actionengine.wsdl https://www.onvif.org/ver20/analytics/wsdl/analytics.wsdl https://www.onvif.org/ver10/authenticationbehavior/wsdl/authenticationbehavior.wsdl https://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/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 https://www.onvif.org/ver10/schedule/wsdl/schedule.wsdl https://www.onvif.org/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl https://www.onvif.org/ver10/thermal/wsdl/thermal.wsdl https://www.onvif.org/ver10/uplink/wsdl/uplink.wsdl
-c 產生c語言的代碼,否則產生C++(默認)
-s 不使用STL代碼
-t 指定typemap.dat文件
-o 指定生成的頭文件名
命令執行成功後,生成onvif.h文件
第二步:編譯生成c/c++源碼
有些ONVIF接口調用時需要攜帶認證信息,要使用soap_wsse_add_UsernameTokenDigest函數進行授權,所以要在onvif.h頭文件開頭加入
#import "wsse.h"
如果onvif.h不加入#import "wsse.h"
,使用soap_wsse_add_UsernameTokenDigest函數會導致編譯出錯(錯誤信息如下):
wsse2api.c(183): error C2039: “wsse__Security”: 不是“SOAP_ENV__Header”的成員
執行如下命令:
./soapcpp2 -2 -C -L -c -x -Iimport -Icustom onvif.h
//soapcpp2命令的相關命令參數如下:(可以根據自己的實際需要添加不同參數,通過soapcpp2 -h來查看幫助信息)
-2 //採用SOAP1.2,和SOAP1.0版本不同,會導致搜索工具搜索不到
-x //不產生xml文件(可用可不用,xml有一定幫助,但是太多)
-I //爲引入路徑
-C //只產生客戶端代碼(注意:C是大寫,不推薦有次命令)
當打印出Compilation successful,則編譯成功,生成代碼目錄如下:
其中的*.nsmap爲命名空間「namespaces變量」的定義,內容都是一樣的,我們將其中一個命名爲wsdd.h,後續會用到
整理文件
編譯完成後的代碼還不能直接使用,需要做進一步整理
1. 拷貝其他用到的源碼文件到當前目錄
cp stdsoap2.c stdsoap2.h plugin/wsaapi.c plugin/wsaapi.h custom/duration.c custom/duration.h ./onvif-wsdl/
以上文件可以在gSOAP的編譯目錄中找到。
2. 關聯命名空間
在stdsoap2.h中有命名空間變量的聲明,
extern SOAP_NMAC struct Namespace namespaces[];
而命名空間的實現是在wsdd.h文件中,所以,將wsdd.h包含進stdsoap2.c文件即可,在stdsoap2.c中添加:
#include "wsdd.h"
至此, wsdl框架源碼準備完畢,可以編寫onvif程序進行測試了。