一、使用wsdl2h 生成.h文件
http://www.onvif.org/Documents/Specifications.aspx
下载另存wsdl文件
使用wsdl2h -t typemap.dat -o onvif.h advancedsecurity.wsdl analytics.wsdl devicemgmt.wsdl event.wsdl receiver.wsdl replay.wsdl analyticsdevice.wsdl deviceio.wsdl display.wsdl media.wsdl remotediscovery.wsdl
发现一直报找不到../../../onvif.xsd文件
打开wsdl文件,发现里面schemaLocation=“”居然是相对路径,也是醉了,改成绝对路径,schemaLocation="./onvif.xsd",解决问题。
二、利用生成的.h文件,生成框架代码
打开生成的onvif.h 在#import 那加入一行代码 #import "wsse.h"用于鉴权
soapcpp2 -j -2 -x onvif.h -I ../gsoap-2.8/gsoap/
(soapcpp2 -2 -L -x -i -d ../onvif_2.8.21_source/ -I../gsoap-2.8.21/gsoap/ -I../gsoap-2.8.21/gsoap/import/ onvif.h)
结果报一个错
wsa5.h(288): **ERROR**: remote method name clash: struct/class 'SOAP_ENV__Fault' already declared at line 274
google一下发现有很多网友遇到同样的问题,直接注释掉就可以了。
生成的代码:
52025 soapAdvancedSecurityServiceBindingProxy.cpp
14852 soapAdvancedSecurityServiceBindingProxy.h
48254 soapAdvancedSecurityServiceBindingService.cpp
9668 soapAdvancedSecurityServiceBindingService.h
46419 soapAnalyticsDeviceBindingProxy.cpp
13994 soapAnalyticsDeviceBindingProxy.h
43336 soapAnalyticsDeviceBindingService.cpp
9196 soapAnalyticsDeviceBindingService.h
14975504 soapC.cpp*
357069 soapDeviceBindingProxy.cpp
88897 soapDeviceBindingProxy.h
311090 soapDeviceBindingService.cpp
44207 soapDeviceBindingService.h
68699 soapDeviceIOBindingProxy.cpp
19977 soapDeviceIOBindingProxy.h
62653 soapDeviceIOBindingService.cpp
11925 soapDeviceIOBindingService.h
28246 soapDisplayBindingProxy.cpp
8626 soapDisplayBindingProxy.h
27159 soapDisplayBindingService.cpp
6710 soapDisplayBindingService.h
6257079 soapH.h
376633 soapMediaBindingProxy.cpp
105679 soapMediaBindingProxy.h
332397 soapMediaBindingService.cpp
51273 soapMediaBindingService.h
47180 soapPullPointSubscriptionBindingProxy.cpp
13964 soapPullPointSubscriptionBindingProxy.h
41356 soapPullPointSubscriptionBindingService.cpp
8846 soapPullPointSubscriptionBindingService.h
23338 soapReceiverBindingProxy.cpp
7175 soapReceiverBindingProxy.h
22841 soapReceiverBindingService.cpp
6053 soapReceiverBindingService.h
12585 soapRemoteDiscoveryBindingProxy.cpp
4438 soapRemoteDiscoveryBindingProxy.h
13726 soapRemoteDiscoveryBindingService.cpp
4824 soapRemoteDiscoveryBindingService.h
15269 soapReplayBindingProxy.cpp
5411 soapReplayBindingProxy.h
15928 soapReplayBindingService.cpp
5205 soapReplayBindingService.h
30344 soapRuleEngineBindingProxy.cpp
9061 soapRuleEngineBindingProxy.h
28994 soapRuleEngineBindingService.cpp
6933 soapRuleEngineBindingService.h
18613 soapwsddProxy.cpp
10336 soapwsddProxy.h
12328 soapwsddService.cpp
6002 soapwsddService.h
其中的.nsmap都是一样的,留一个,改名为nsmap.h(名字随意)其他全删了。
三、添加gsoap包内需要用到的代码
在gsoap包内找到stdsoap2.cpp,stdsoap2.h,wsaapi.c,wsaapi.h,wsddapi.d,wsddapi.h