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