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++)_第1张图片

2、下载XML Schemas Specifications
从Onvif官网的ONVIF WSDL and XML Schemas Specifications页面中下载wsdl(右键-将链接另存为即可),下载下来的wsdl如下图
Onvif协议客户端开发(2)--Window下Onvif开发环境搭建(C++)_第2张图片
3、按照规则创建文件夹
创建一个OnvifFramework文件夹,在该文件夹下再新建两个文件夹,分别命名为:level1和ver10。在level1文件夹下新建一个文件夹,命名为:level2。在level2文件夹下新建三个文件夹,分别命名为:FrameworkSource、GenerateSource、ver10。在ver10文件夹下建立三个文件夹,分别命名为:device、media、schema。在device和media文件夹下新建一个文件夹,命名为wsdl。在ver10文件夹下新建一个文件夹,命名为schema。文件夹请务必按这个顺序建立。
Onvif协议客户端开发(2)--Window下Onvif开发环境搭建(C++)_第3张图片
可以使用脚本创建文件夹,脚本代码如下:

@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++)_第4张图片
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,包含文件名前缀

你可能感兴趣的:(Onvif协议)