声明:请使用gsoap2.8.3,不同版本产生的代码不一样
1、先通过wsdl2h把所有wsdl文件生成相应的onvif.h,请使用务必使用我修改后的
onvif-typemap.dat
注意:把deviceio.wsdl放在devicemgmt.wsdl和media.wsdl后面,因为deviceio.wsdl文
件import这两个文件,如果不放在后面,会导致devicemgmt.wsdl和media.wsdl的相关功能
函数缺失
如下:
wsdl2h -sck -t onvif-typemap.dat -o onvif.h analytics.wsdl
analyticsdevice.wsdl devicemgmt.wsdl display.wsdl event.wsdl imaging.wsdl
media.wsdl ptz.wsdl receiver.wsdl recording.wsdl remotediscovery.wsdl
replay.wsdl search.wsdl deviceio.wsdl
其中参数:
-s don't generate STL code (no std::string and no std::vector)
-c generate C source code
-k don't generate SOAP_ENV__Header mustUnderstand qualifiers
-tfile use type map file instead of the default file typemap.dat
-ofile output to file
2、在生成的onvif.h后,再#import "onvif-ext.h",onvif-ext.h文件是我自己写的,主要
实现以下功能:
(1)、增加wsse认证的
(2)、在struct SOAP_ENV__Header结构中增加struct d__AppSequenceType,discovery
时需要
(3)、wsdl2h产生onvif.h时,可以看到很多Error,如
Error: no wsdl:definitions/binding/operation/fault/soap:fault
'UnacceptableTerminationTimeFault'
就会导致SOAP_ENV__Detail结构会丢失部分,这个应该是gsoap的问题,所以在
onvif-ext.h定义了struct SOAP_ENV__Detail,来修正这个问题
3、通过soapcpp2产生C代码,
soapcpp2.exe -2 -L -c onvif.h -d..\ -Iimport
其中参数:
-2 generate SOAP 1.2 bindings
-L don't generate soapClientLib/soapServerLib
-c generate C source code
-dpath use path to save files
-Ipath use path(s) for #import
4、会产生N个的nsmap文件,其实每个都是相同,只需要一个就行了,然后这上nsmap文件的
namespaces中增加
{"ter", "http://www.onvif.org/ver10/error", NULL, NULL},
{"tns1", "http://www.onvif.org/ver10/topics", NULL, NULL},
5、从gsoap中copy相关文件到你的工程,需要的文件如下:
gsoap/dom.c
gsoap/stdsoap2.c
gsoap/stdsoap2.h
gsoap/custom/duration.c
gsoap/plugin/mecevp.c
gsoap/plugin/mecevp.h
gsoap/plugin/smdevp.c
gsoap/plugin/smdevp.h
gsoap/plugin/threads.c
gsoap/plugin/threads.h
gsoap/plugin/wsaapi.c
gsoap/plugin/wsaapi.h
gsoap/plugin/wsseapi.c
gsoap/plugin/wsseapi.h
注意:
1、编译wsseapi.c时需要需要openssl的支持,并且编译以上所有文件时,增加两个
宏CFLAGS+=-DWITH-DOM -DWITH-OPENSSL
2、如果是在windows上开发,不要使用VC6,否则编译或链接会有问题的,请使用VS2005或以上版本
已经预生成一个onvif.h文件,也可以使用这个直接去生成.c文件。如果使用C++的朋友,参
考以上说明通过wsdl2h和soapcpp2产生代码
有关event的流程
首先NVC先soap_call___denf__Subscribe,参数wsnt__Subscribe必须要指定
ConsumerReference,ConsumerReference为NVC侦听NVT报警的service endpoint,比
http://192.168.7.193/onvif_notify_server,这样当NVT有报警的时候就会通过
soap_send___denc__Notify发送到ConsumerReference指定的地址。
wsnt__Subscribe的InitialTerminationTime参数表示NVT创建的这个Subscribe在什么时候
自动结束,可以通过soap_call___depsm__Renew更新NVT的这个Subscribe,如果要手动结束
,NVC调用soap_call___depsm__Unsubscribe