ONVIF開發---ONVIF框架代碼生成

目錄

下載wsdl源文件

編譯wsdl源文件、生成c/c++代碼

準備編譯環境

編譯

整理文件


 

下載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程序進行測試了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章