天天看點

onvif生成方式

wsdl下載下傳方式

通過onvif test tool,debug下GetServices,可以看到所有支援的服務,都有

<tds:Namespace>http://www.onvif.org/ver10/search/wsdl</tds:Namespace>

這樣的wsdl連接配接,打開這個連結,網頁另存為wsdl檔案即可!

參考連結 http://www.xuebuyuan.com/1723413.html

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

繼續閱讀