onvif度我

声明:请使用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

你可能感兴趣的:(c++)