天天看點

Onvif協定用戶端開發(2)--Window下Onvif開發環境搭建(C++)

1、前期準備

需要使用到的内容:
Gsoap
XML Schemas Specifications
           

1、下載下傳Gsoap

從Gsoap官網下載下傳最新版gsoap(部落客用的是gsoap_2.8.36)。gsoap有三個版本:Open Source gSOAP、Commercial gSOAP Edition、Commercial gSOAP Edition。我們下載下傳開源版本即可。(如下圖)

Onvif協定用戶端開發(2)--Window下Onvif開發環境搭建(C++)

2、下載下傳XML Schemas Specifications

從Onvif官網的ONVIF WSDL and XML Schemas Specifications頁面中下載下傳wsdl(右鍵-将連結另存為即可),下載下傳下來的wsdl如下圖

Onvif協定用戶端開發(2)--Window下Onvif開發環境搭建(C++)

3、按照規則建立檔案夾

建立一個OnvifFramework檔案夾,在該檔案夾下再建立兩個檔案夾,分别命名為:level1和ver10。在level1檔案夾下建立一個檔案夾,命名為:level2。在level2檔案夾下建立三個檔案夾,分别命名為:FrameworkSource、GenerateSource、ver10。在ver10檔案夾下建立三個檔案夾,分别命名為:device、media、schema。在device和media檔案夾下建立一個檔案夾,命名為wsdl。在ver10檔案夾下建立一個檔案夾,命名為schema。檔案夾請務必按這個順序建立。

Onvif協定用戶端開發(2)--Window下Onvif開發環境搭建(C++)

可以使用腳本建立檔案夾,腳本代碼如下:

@echo off
echo ***************************
echo Start Create Direction
echo ***************************
md .\level1\level2
md .\level1\level2\FrameworkSource
md .\level1\level2\GenerateSource
md .\level1\level2\ver10\device
md .\level1\level2\ver10\media
md .\level1\level2\ver10\schema
md .\level1\level2\ver10\device\wsdl
md .\level1\level2\ver10\media\wsdl
md .\ver10
md .\ver10\schema
pause
           

2、初始化環境

1、将下載下傳下來的wsdl放在GenerateSource檔案夾内。拷貝devicemgmt.wsdl到OnvifFramework\level1\level2\ver10\device\wsdl路徑下,拷貝media.wsdl到OnvifFramework\level1\level2\ver10\media\wsdl路徑下,拷貝onvif.xsd、common.xsd到OnvifFramework\level1\level2\ver10\schema路徑下,拷貝onvif.xsd、common.xsd到OnvifFramework\ver10\schema路徑下

Onvif協定用戶端開發(2)--Window下Onvif開發環境搭建(C++)

2、将OnvifFramework\gsoap-2.8\gsoap路徑下的typemap.dat和OnvifFramework\gsoap-2.8\gsoap\bin\win32路徑下的wsdl2h.exe、soapcpp2.exe 拷貝到GenerateSource檔案夾下。

3、将下載下傳下來的gsoap_2.8.36.zip解壓到GenerateSource檔案夾中

3、 編譯生成onvif.h

Onvif.h生成方式分為線上生成和本地生成兩種,鑒于線上生成的不穩定性,部落客采用本地生成方式

用管理者權限打開cmd進入GenerateSource目錄下,在控制台中輸入

wsdl2h.exe -t typemap.dat  -o onvif.h 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間用一個空格隔開),執行後會生成onvif.h的檔案

追加鑒權

有些前端裝置的操作需要鑒權,是以需要在onvif.h的頭檔案中追加鑒權的内容

1、修改onvif.h頭檔案,加入#import “wsse.h”

2、将 OnvifFramework\gsoap-2.8\gsoap\import路徑下的wsa5.h中的SOAP_ENV__Fault結構體注釋掉或改為其他名字,如SOAP_ENV__Fault_alex

4、編譯生成用戶端的代碼

cmd控制台中,GenerateSource目錄下,生成用戶端代碼的指令:

soapcpp2 -C -L onvif.h -x -I ../../../gsoap-2.8/gsoap/import:../../../gsoap-2.8/gsoap
           

編譯過程中如果遇到Critical error: #import: Cannot open file “xop.h” for reading.

Hint: use option -I

(for example -Igsoap;gsoap/import;gsoap/custom:.)等錯誤,隻要把報錯的頭檔案複制到GenerateSource的檔案夾中即可

5、整理需要使用到的代碼

編譯完的代碼會生成很多的中間檔案,還有很多字尾名為.nsmap的檔案,但是真正使用到的檔案就隻有以下這些

soapC.c
soapClient.c
soapH.h
soapStub.h
wsdd.nsmap
           

wsdl2h指令彙總

經常使用的一些指令如下:

  -o filename.h   将wsdl轉化為filename.h頭檔案。

  -s         不生成STL代碼

  -c         生成純C風格的頭檔案,這将去除C++的一些特性

  -n name      使用name代替預設字首ns

  -t filename.dat  使用filename.dat代替預設的typemap.dat檔案

  -zX        相容之前的X版本

  

soapcpp2

經常使用的一些指令如下:

  -i     生成server的proxy和object,這種object繼承于soap struct。

  -j     和-i類似,差別在于生成的代理類不繼承于soap struct,而是包含了包含了一個soap結構的指針。此種方式生存的代理類便于互相通信

  -C    僅生成用戶端client代碼

  -S    僅生成服務端server代碼

  -x    不生成xml檔案。不用此項的話,将對頭檔案中定義的每個operation生成一個描述性的xml檔案

  -L    不生成soapClientLib檔案和soapServerLib檔案

  -p name 修改檔案名字首,代替soap

  -q name 指定代理類和對象使用的名空間name,包含檔案名字首

繼續閱讀