gsoap2.8生成onvif C++11客户端开发框架的问题及解决

xingyun86 8天前 40

1.下载gsoap_2.8.109.zip

2.解压gsoap_2.8.109.zip

3.进入gsoap2.8/gsoap/bin/win64目录

a.拷贝gsoap/wsdl/目录下的typemap.dat文件到当前目录

b.创建脚本auto_code_h_c++11.bat

@ECHO OFF
CD /D "%~dp0"
mkdir output
wsdl2h.exe -o output\onvif.h -c++11 -s -t .\typemap.dat http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl http://www.onvif.org/onvif/ver10/display.wsdl http://www.onvif.org/onvif/ver10/deviceio.wsdl http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.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/receiver.wsdl http://www.onvif.org/onvif/ver10/recording.wsdl  http://www.onvif.org/onvif/ver10/search.wsdl http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.onvif.org/onvif/ver10/replay.wsdl http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl  http://www.onvif.org/onvif/ver10/schema/onvif.xsd  http://www.onvif.org/ver10/actionengine.wsdl  
@ECHO &PAUSE

c.创建脚本auto_code_cpp_c++11.bat

@ECHO OFF
CD /D "%~dp0"
mkdir output
soapcpp2.exe -2 -c++11 -j -x output\onvif.h -I%CD%/../../../../gsoap-2.8/gsoap;%CD%/../../../../gsoap-2.8/gsoap/import; -d output
@ECHO &PAUSE

d.创建脚本auto_code_client_c++11.bat

@ECHO OFF
CD /D "%~dp0"
mkdir output
soapcpp2 -a -x -L -pwsdd -d output -I%CD%/../../../../gsoap-2.8/gsoap/import; %CD%/../../../../gsoap-2.8/gsoap/import/wsdd5.h
@ECHO &PAUSE

4.运行脚本auto_code_h_c++11.bat

在output目录生成onvif.h文件

在onvif.h中添加#import "wsse.h"(鉴权使用)

5.运行脚本auto_code_cpp_c++11.bat

在output目录生成许多文件:


6.运行脚本auto_code_client_c++11.bat

在output目录生成许多文件:


7.使用方法:

新建gsoap-lib目录,三个子目录plugin、custom、stub

拷贝6步骤output目录下所有文件到stub目录。

拷贝

dom.cpp  

stdsoap2.h stdsoap2.cpp

到gsoap-lib目录。

拷贝

chrono_duration.cpp  chrono_time_point.cpp duration.c struct_timeval.c

chrono_duration.h    chrono_time_point.h duration.h struct_timeval.h

到gsoap-lib目录(将后缀.c全部修改为.cpp)。

拷贝

mecevp.c  smdevp.c  threads.c  wsaapi.c  wsseapi.c wsse2api.c

mecevp.h    smdevp.h    threads.h    wsaapi.h    wsseapi.h  wsse2api.c

到gsoap-lib目录(将后缀.c全部修改为.cpp)。

8.编译

编译时添加标志:

-DWITH_NONAMESPACES 

-DWITH_OPENSSL

-DWITH_DOM

9.头文件引入

#include <stdsoap2.h>

#include <wsaapi.h>

#include <wsddStub.h>

#include <wsseapi.h>

#include <wsdd.nsmap>

#include <soapStub.h>

#include <httpda.h>

#include <soapPTZBindingProxy.h>

#include <soapDeviceBindingProxy.h>

#include <soapMediaBindingProxy.h>


FAQ常见问题及解决

问题1及解决:

wsa5.h(288): **ERROR**: service operation name clash: struct/class 'SOAP_ENV__Fault' already declared at wsa.h:273

则修改wsa5.h中的SOAP_ENV__Fault 为 SOAP_ENV__Fault_WSA5即可。

问题2及解决:

error LNK2001: unresolved external symbol namespaces

则引入头文件#include <wsdd.nsmap>(根据你实际的项目nsmap文件修改即可)

问题3及解决:

返回400/401,Bad Request/Unauthorized

鉴权方式问题,请参阅另一篇文章《onvif 鉴权最佳实践


上传的附件:
×
打赏作者
最新回复 (0)
只看楼主
全部楼主
返回