gSOAP搭建ONVIF(C++)客户端开发框架--windows&ubuntu

发布日期:2024-10-14 11:35    点击次数:197

折腾几天,看了很多博客,终于弄出来了。 一:gSOAP搭建ONVIF (C++)客户端开发框架 --windows 二:gSOAP搭建ONVIF (C++)客户端开发框架 --linux

1. gSOAP工具下载

gSOAP里边的soapcpp2.exe和wsdl2.exe的版本是对应的 gSOAP下载

图片

2.搜集需要的文件 创建目录F:\onvifFrameworkC将F:\gsoap_2.8.112\gsoap-2.8\gsoap下的plugin,import,custom复制到F:\onvifFrameworkC换将wsdl2h.exe和soapcpp2.exe复制到F:\onvifFrameworkC目录下将F:\gsoap_2.8.112\gsoap-2.8\gsoap下的stdsoap2.cpp,stdsoap2.h,dom.cpp复制到F:\onvifFrameworkC将F:\gsoap_2.8.112\gsoap-2.8\gsoap下的typemap.dat复制到F:\onvifFrameworkC

以后的所有操作都在目录F:\onvifFrameworkC进行

3.修改一些文件 防止出现LONG64的错误和'SOAP_TYPE_xsd__duration’ was not declared in this scope错误,需要在typemap.dat中
 # xsd__duration = #import "custom/duration.h" | xsd__duration
改成
xsd__duration = #import "custom/duration.h" | xsd__duration
防止SOAP_ENV__Fault重复错误,修改F:\onvifFrameworkC\import下边的wsa5.h。这里把SOAP_ENV__Fault的名字改了

图片

4.生成onvif.h

(1)需要的wsdl文件和xsd文件http,每个用空格隔开。 windows下边的wsdl2h.exe不支持HTTPS下载,所以使用HTTP

wsdl2h -x -t typemap.dat -o onvif.h http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl http://www.onvif.org/onvif/ver10/search.wsdl http://www.onvif.org/onvif/ver10/display.wsdl http://www.onvif.org/onvif/ver10/deviceio.wsdl http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl http://www.onvif.org/onvif/ver10/receiver.wsdl http://www.onvif.org/onvif/ver10/recording.wsdl

(2)打开CMD,输入命令cd /d F:\onvifFrameworkC再输入上边这个命令得到onvif.h。

图片

此时会产生一个onvif.h文件,这个文件很大。 (3)因鉴权需要,修改onvif.h头文件,在onvif.h中添加
#import "wsse.h"

图片

此时F:\onvifFrameworkC下有这些文件

图片

5.使用gSOAP生成onvif开发框架代码

soapcpp2 命令如下

soapcpp2 -2 -x -C onvif.h  -L -Iimport

图片

此时F:\onvifFrameworkC下有这些文件

图片

6.创建新的目录F:\onvifApi放onvif开发框架的代码

(1)gSOAP生成的文件中提取以下几个放到F:\onvifApi

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

(2)再提取以下几个放到F:\onvifApi

dom.c
dom.h
duration.cpp
duration.h
mecevp.c
mecevp.h
smdevp.c
smdevp.h
stdsoap2.c
stdsoap2.h
threads.c
threads.h
wsa5.h
wsaapi.c
wsaapi.h
wsseapi.c
wsseapi.h
struct_timeval.h
struct_timeval.c

(3)把里边所有的c改为cpp。有的文件既有C也有CPP,在F:\onvifApi中只保留cpp 修改stdsoap2.cpp文件,添加#include "wsdd.nsmap"

图片

在soapStub.h文件中,列出了WEB服务的所有接口(Client-Side Call Stub Functions),我们的应用程序通过调用这些接口就成了,至于SOAP协议整个过程怎么实现的,都在soapC.c和soapClient.c中。 7.验证

在VS2017中创建新工程,添加目录,并把F:\onvifApi所有文件加入到工程。

图片

(1)因为文件太大,需要添加/bigobj

图片

(2)在预处理器中添加 _CRT_SECURE_NO_WARNINGS

图片

(3)出现错误 C1083 无法打开包括文件: “openssl/evp.h”: No such file or directory

图片

这是因为鉴权需要OPEN-SSL支持。 选择Win32

图片

这里安装好以后把目录和库添加到项目设置,(平台可以看到是win32所以开发的程序是Win32)

图片

预处理器添加WITH_OPENSSL 链接器的输入添加libcrypto.lib,libssl.lib (4)

图片

这是因为没有添加struct_timeval.cpp和struct_timeval.h,把两个文件添加到F:\onvifApi目录,并且加入到工程。 (5)

图片

这是因为没有添加duration.cpp和duration.h,把两个文件添加到F:\onvifApi目录,并且加入到工程。 完整的工程目录如下:

图片

此时编译可以通过且可以F11进入soap_new()单步调试。

图片

到此,大工告成!

主要借鉴:https://blog.csdn.net/weixin_44517656/article/details/115120199 https://blog.csdn.net/benkaoya/article/details/72424335

一:编译gSoapg

(1)安装依赖库

sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install openssl

(2)gSoapg源码下载https://sourceforge.net/projects/gsoap2/

(3)编译:支持鉴权。

 cd gsoap-2.8/
 sudo ./configure --with-openssl=/usr/local/OpenSSL
 sudo make
 sudo make install
2.搜集需要的文件 创建目录 mkdir /home/usr/onvif将gsoap_2.8.112/gsoap-2.8/gsoap下的plugin,import,custom复制到/home/usr/onvif换将wsdl2h和soapcpp2复制到/home/usr/onvif目录下将gsoap_2.8.112/gsoap-2.8/gsoap下的stdsoap2.cpp,stdsoap2.h,dom.cpp复制到/home/usr/onvif将gsoap_2.8.112/gsoap-2.8/gsoap下的typemap.dat复制到/home/usr/onvif

以后的所有操作都在目录/home/usr/onvif进行

3.修改一些文件 防止出现LONG64的错误和'SOAP_TYPE_xsd__duration’ was not declared in this scope错误,需要在typemap.dat中
 # xsd__duration = #import "custom/duration.h" | xsd__duration
改成
xsd__duration = #import "custom/duration.h" | xsd__duration
防止SOAP_ENV__Fault重复错误,修改F:\onvifFrameworkC\import下边的wsa5.h。这里把SOAP_ENV__Fault的名字改了

图片

4.生成onvif.h

(1)wsdl下载命令。

./wsdl2h -x -t typemap.dat -o onvif.h http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl http://www.onvif.org/onvif/ver10/search.wsdl http://www.onvif.org/onvif/ver10/display.wsdl http://www.onvif.org/onvif/ver10/deviceio.wsdl http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl http://www.onvif.org/onvif/ver10/receiver.wsdl http://www.onvif.org/onvif/ver10/recording.wsdl

(2)此时会产生一个onvif.h文件,这个文件很大。 因鉴权需要,修改onvif.h头文件,在onvif.h中添加

#import "wsse.h"
5.使用gSOAP生成onvif开发框架代码
./soapcpp2 -2 -x -C onvif.h  -L -Iimport
6.创建新的目录/home/usr/onvif_dev放onvif开发框架的代码

(1)gSOAP生成的文件中提取以下几个放到/home/usr/onvif_dev,其他的文件全部舍弃

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

(2)再提取以下几个放到/home/usr/onvif_dev

dom.c
dom.h
duration.cpp
duration.h
mecevp.c
mecevp.h
smdevp.c
smdevp.h
stdsoap2.c
stdsoap2.h
threads.c
threads.h
wsa5.h
wsaapi.c
wsaapi.h
wsseapi.c
wsseapi.h
struct_timeval.h
struct_timeval.c

(3)把里边所有的c改为cpp。有的文件既有C也有CPP,在/home/usr/onvif_dev中只保留cpp (4)修改stdsoap2.cpp文件,添加#include "wsdd.nsmap"

图片

在soapStub.h文件中,列出了WEB服务的所有接口(Client-Side Call Stub Functions),我们的应用程序通过调用这些接口就成了,至于SOAP协议整个过程怎么实现的,都在soapC.c和soapClient.c中。 到此, ubuntu环境下的onvif搭建成功,步骤基本和windows下一致! 本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。