http://www.cs.fsu.edu/~engelen/soap.html
可以下载到最新的版本,windows的版本带有编译好的exe文件不需要重新编译
根据http://www.cs.fsu.edu/~engelen/soap.html下FAQ的描述,添加gSOAP中typemap.dat对Onvif协议的支持。在gSOAP 2.8.19版本中typemap.dat已经对onvif的支持了。
# ONVIFrecommended prefixes
tds ="http://www.onvif.org/ver10/device/wsdl"
tev ="http://www.onvif.org/ver10/events/wsdl"
tls ="http://www.onvif.org/ver10/display/wsdl"
tmd ="http://www.onvif.org/ver10/deviceIO/wsdl"
timg ="http://www.onvif.org/ver20/imaging/wsdl"
trt ="http://www.onvif.org/ver10/media/wsdl"
tptz ="http://www.onvif.org/ver20/ptz/wsdl"
trv ="http://www.onvif.org/ver10/receiver/wsdl"
trc ="http://www.onvif.org/ver10/recording/wsdl"
tse ="http://www.onvif.org/ver10/search/wsdl"
trp ="http://www.onvif.org/ver10/replay/wsdl"
tan ="http://www.onvif.org/ver20/analytics/wsdl"
tad ="http://www.onvif.org/ver10/analyticsdevice/wsdl"
tdn ="http://www.onvif.org/ver10/network/wsdl"
tt ="http://www.onvif.org/ver10/schema"
# OASISrecommended prefixes
wsnt ="http://docs.oasis-open.org/wsn/b-2"
wsntw ="http://docs.oasis-open.org/wsn/bw-2"
wsrfbf ="http://docs.oasis-open.org/wsrf/bf-2"
wsrfr ="http://docs.oasis-open.org/wsrf/r-2"
wsrfrw = "http://docs.oasis-open.org/wsrf/rw-2"
wstop ="http://docs.oasis-open.org/wsn/t-1"
# WS-Discovery1.0 remapping
wsdd10__HelloType = | wsdd__HelloType
wsdd10__ByeType = | wsdd__ByeType
wsdd10__ProbeType = | wsdd__ProbeType
wsdd10__ProbeMatchesType = | wsdd__ProbeMatchesType
wsdd10__ProbeMatchType = | wsdd__ProbeMatchType
wsdd10__ResolveType = | wsdd__ResolveType
wsdd10__ResolveMatchesType = | wsdd__ResolveMatchesType
wsdd10__ResolveMatchType = | wsdd__ResolveMatchType
# SOAP-ENVmapping
SOAP_ENV__Envelope = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header*SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope
SOAP_ENV__Header = | struct SOAP_ENV__Header
SOAP_ENV__Fault = | struct SOAP_ENV__Fault
SOAP_ENV__Detail = | struct SOAP_ENV__Detail
SOAP_ENV__Code = | struct SOAP_ENV__Code
SOAP_ENV__Subcode = | struct SOAP_ENV__Subcode
SOAP_ENV__Reason = | struct SOAP_ENV__Reason
所需的wsdl文件
# 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
根据所需的要问wsdl生成h文件,命令如下:
Wsdl2h –P –x –c –o onvif.hhttp://.../..wsdl http://../..wsdl
其中–c 是为了生成纯c的头文件,如果生成c和 c++的头文件结构会很混乱
-o onvif.h是生成所需要的头文件
-P 和 –x 是为了不生成一些其他的东西
http://../.wsdl就是你所需要的实现的功能的wsdl可以多选
为了增加对加密过程——openssl的支持,需修改onvif.h在其增加#import “wsse.h”
根据生成的onvif.h的头文件生成相应的c文件。命令如下:
soapcpp2 -2 -x-I../../;../../import onvif.h
其中:-x是不生成xml文件
-I增加所需文件的路径
-2生成1.2 版本的文件。因为如果有多个wsdl同时生成的时候产生的namspace为1.1版本的nsmap文件中SOAP-ENV和SOAP-ENC会有所不同,如下:
1.1版本中:
{"SOAP-ENV","http://schemas.xmlsoap.org/soap/envelope/","http://www.w3.org/*/soap-envelope", NULL},
{"SOAP-ENC","http://schemas.xmlsoap.org/soap/encoding/","http://www.w3.org/*/soap-encoding", NULL},
而1.2版本中为
{"SOAP-ENV","http://www.w3.org/2003/05/soap-envelope","http://schemas.xmlsoap.org/soap/envelope/", NULL},
{"SOAP-ENC","http://www.w3.org/2003/05/soap-encoding","http://schemas.xmlsoap.org/soap/encoding/", NULL},
主要是这两处不同,如果使用1.1版本的会在后续的开发中出现错误,因此使用1.2版本的。如果单独一个wddl文件生成的自动就是1.2版本的。(一定要改过来,折磨我了好几天才发现)。
生成的文件有:
soapC.c 、soapClient.c、soapClientLib.c 、sopH.h 、soapServer.c 、soapServerLib.c 、soapStub.h和许多nsmap文件
其中soapClientLib.c 、soapServerLib.c没有用可以删除;
Nsmap文件内容一样。保留一个wsdd.namsp文件就行,可以将该文件重命名为nsmp.h
根据以上生成的文件,新建工程将上述soapC.c 、soapClient.c 、sopH.h 、soapServer.c 、soapStub.h 、nsmap.h拷贝到工程目录
并从gsoap的根目录中拷入stdsoap2.h 、stdsoap2.c文件可能还需要custom下的duration.h 和 duration.c文件。
此时就可以根据接口进行开发,还有一点要注意如果开发客户端 不要引入soapServer.c因为里面有许多接口需要在开发server端时进行实现。