Onvif開發代碼

向大家介紹下如何通過gsoap生成需要的代碼,以及代碼中需要注意的問題[基於Linux平臺 C開發]

生成Onvif相關源代碼(我現在使用的gsoap版本是gsoap2.8.14,下面有下載地址)

  在下載的gsoap文件下,在/gsoap-2.8/gsoap的目錄下有有個typemap.dat文件,後面就是通過此文件來生成onvif.h文件的。在這裏說明下

利用gsoap-2.8.8的版本的話,需要稍微修改下typemap.dat文件,在其後面添加如下內容:

[cpp]
  1. tds  = "http://www.onvif.org/ver10/device/wsdl"  
  2. tev  = "http://www.onvif.org/ver10/events/wsdl"  
  3. tls  = "http://www.onvif.org/ver10/display/wsdl"  
  4. tmd  = "http://www.onvif.org/ver10/deviceIO/wsdl"  
  5. timg = "http://www.onvif.org/ver20/imaging/wsdl"  
  6. trt  = "http://www.onvif.org/ver10/media/wsdl"  
  7. tptz = "http://www.onvif.org/ver20/ptz/wsdl"  
  8. trv  = "http://www.onvif.org/ver10/receiver/wsdl"  
  9. trc  = "http://www.onvif.org/ver10/recording/wsdl"  
  10. tse  = "http://www.onvif.org/ver10/search/wsdl"  
  11. trp  = "http://www.onvif.org/ver10/replay/wsdl"  
  12. tan  = "http://www.onvif.org/ver20/analytics/wsdl"  
  13. tad  = "http://www.onvif.org/ver10/analyticsdevice/wsdl"  
  14. tdn  = "http://www.onvif.org/ver10/network/wsdl"  
  15. tt   = "http://www.onvif.org/ver10/schema"  
  16.   
  17. #   OASIS recommended prefixes   
  18. wsnt    = "http://docs.oasis-open.org/wsn/b-2"  
  19. wsntw   = "http://docs.oasis-open.org/wsn/bw-2"  
  20. wsrfbf  = "http://docs.oasis-open.org/wsrf/bf-2"  
  21. wsrfr   = "http://docs.oasis-open.org/wsrf/r-2"  
  22. wsrfrw  = "http://docs.oasis-open.org/wsrf/rw-2"  
  23. wstop   = "http://docs.oasis-open.org/wsn/t-1"  
  24.   
  25. #   WS-Discovery 1.0 remapping     
  26. wsdd10__HelloType           = | wsdd__HelloType    
  27. wsdd10__ByeType             = | wsdd__ByeType    
  28. wsdd10__ProbeType           = | wsdd__ProbeType    
  29. wsdd10__ProbeMatchesType    = | wsdd__ProbeMatchesType    
  30. wsdd10__ProbeMatchType      = | wsdd__ProbeMatchType    
  31. wsdd10__ResolveType         = | wsdd__ResolveType    
  32. wsdd10__ResolveMatchesType  = | wsdd__ResolveMatchesType    
  33. wsdd10__ResolveMatchType    = | wsdd__ResolveMatchType    
  34.   
  35. #   SOAP-ENV mapping     
  36. SOAP_ENV__Envelope  = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope    
  37. SOAP_ENV__Header    = | struct SOAP_ENV__Header    
  38. SOAP_ENV__Fault     = | struct SOAP_ENV__Fault    
  39. SOAP_ENV__Detail    = | struct SOAP_ENV__Detail    
  40. SOAP_ENV__Code      = | struct SOAP_ENV__Code    
  41. SOAP_ENV__Subcode   = | struct SOAP_ENV__Subcode    
  42. SOAP_ENV__Reason    = | struct SOAP_ENV__Reason    
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"

#   OASIS recommended 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-Discovery 1.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-ENV mapping  
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  

注意:gsoap-2.8.14版本則不需要更改
現在就開始對typemap.dat操作來生生頭文件了,一般情況都有有兩種方法:鏈接網絡生成和本地生成
在下載gsoap文件中,在gsoap-2.8/gsoap/bin/linux386/目錄下,有一個wsdl2h命令,可以將此命令和typemap.dat文件放在同一個測試文件夾中
wsdl2h命令的相關參數包括,可以根據實際開發需要來生成代碼:

[cpp]
  1. -c   產生c語言的代碼,否則產生C++(默認)  
  2.      -s   不使用STL代碼  
  3.      -t   指定typemap.dat文件  
  4.      -o   指定生成的頭文件名  
  -c   產生c語言的代碼,否則產生C++(默認)
       -s   不使用STL代碼
       -t   指定typemap.dat文件
       -o   指定生成的頭文件名
鏈接網絡生成的基本命令如下(各個URL用空格隔開):
 
[cpp]
  1.  wsdl2h  -c  -s  -t  typemap.dat  -o  onvif.h http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl   
  2. http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl   
  3. http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl   
  4. http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl   
  5. http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl   
  6. http://www.onvif.org/onvif/ver10/deviceio.wsdl   
  7. http://www.onvif.org/onvif/ver10/display.wsdl   
  8. http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl   
  9. http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl   
  10. http://www.onvif.org/onvif/ver10/recording.wsdl   
  11. http://www.onvif.org/onvif/ver10/replay.wsdl   
  12. http://www.onvif.org/onvif/ver10/search.wsdl   
  13. http://www.onvif.org/onvif/ver10/receiver.wsdl   
  14. http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl  
 wsdl2h  -c  -s  -t  typemap.dat  -o  onvif.h http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl
http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.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/media/wsdl/media.wsdl
http://www.onvif.org/onvif/ver10/deviceio.wsdl
http://www.onvif.org/onvif/ver10/display.wsdl
http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl
http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl
http://www.onvif.org/onvif/ver10/recording.wsdl
http://www.onvif.org/onvif/ver10/replay.wsdl
http://www.onvif.org/onvif/ver10/search.wsdl
http://www.onvif.org/onvif/ver10/receiver.wsdl
http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl

此方法因爲和網絡環境有很大的關係,所以中間很容易因爲網絡問題斷掉重新開始,所以不建議使用此方法.

本地生成的基本命令(先在官網下載好wsdl文件,然後和前面wsdl2h命令放在同一個文件下,執行命令時各個wsdl文件之間用空格分開):
  
[cpp]
  1. wsdl2h  -c  -s  -t  typemap.dat  -o  onvif.h remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl  
  2. edia.wsdl deviceio.wsdl display.wsdl event.wsdl imaging.wsdl recording.wsdl replay.wsdl search.wsdl receiver.wsdl ptz.wsdl  
 wsdl2h  -c  -s  -t  typemap.dat  -o  onvif.h remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl
media.wsdl deviceio.wsdl display.wsdl event.wsdl imaging.wsdl recording.wsdl replay.wsdl search.wsdl receiver.wsdl ptz.wsdl
wsdl的下載地址: wsdl文件

通過onvif.h生成需要的源代碼框架
在使用命令通過onvif.h生成代碼之前,得先確認下是否需要做安全驗證,也就是所謂的鑑權(樓主就在開始就是不知道了),如果不需要的話,那就可以直接使用命令了,
如果需要做鑑權的話,則需要修改onvif.h ,在onvif.h中需要加上 (98行的樣子)

[cpp]
  1. import "wsse.h"   // 安全驗證  
import "wsse.h"   // 安全驗證

修改好onvif.h後,在gsoap-2.8.14/gsoap-2.8/gsoap/bin/linux386下把soapcpp2也拷貝到當前生成onvif.h的目錄下,
行如下命令:
  1. soapcpp2 -2 –c  onvif.h  -x -I ./gsoap-2.8.14/gsoap-2.8/gsoap/import -I ./gsoap-2.8.14/gsoap-2.8/gsoap/  
soapcpp2 -2 –c  onvif.h  -x -I ./gsoap-2.8.14/gsoap-2.8/gsoap/import -I ./gsoap-2.8.14/gsoap-2.8/gsoap/
  1. //soapcpp2命令的相關命令參數如下:(可以根據自己的實際需要添加不同參數)   
  2.    -2    //採用SOAP1.2,和SOAP1.0版本不同,會導致搜索工具搜索不到   
  3.    -x    //不產生xml文件(可用可不用,xml有一定幫助,但是太多)   
  4.    -I   //爲引入路徑   
  5.    -C   //只產生客戶端代碼(注意:C是大寫,不推薦有次命令)  
//soapcpp2命令的相關命令參數如下:(可以根據自己的實際需要添加不同參數)
   -2    //採用SOAP1.2,和SOAP1.0版本不同,會導致搜索工具搜索不到
   -x    //不產生xml文件(可用可不用,xml有一定幫助,但是太多)
   -I   //爲引入路徑
   -C   //只產生客戶端代碼(注意:C是大寫,不推薦有次命令)
生成的文件如下:
  1. -rw-r--r-- 1      3634 2013-12-25 10:14 AnalyticsDeviceBinding.nsmap  
  2. -rw-r--r-- 1      3634 2013-12-25 10:14 AnalyticsEngineBinding.nsmap  
  3. -rw-r--r-- 1      3634 2013-12-25 10:14 CreatePullPointBinding.nsmap  
  4. -rw-r--r-- 1      3634 2013-12-25 10:14 DeviceBinding.nsmap  
  5. -rw-r--r-- 1      3634 2013-12-25 10:14 DeviceIOBinding.nsmap  
  6. -rw-r--r-- 1      3634 2013-12-25 10:14 DiscoveryLookupBinding.nsmap  
  7. -rw-r--r-- 1      3634 2013-12-25 10:14 DisplayBinding.nsmap  
  8. -rw-r--r-- 1      3634 2013-12-25 10:14 EventBinding.nsmap  
  9. -rw-r--r-- 1      3634 2013-12-25 10:14 ImagingBinding.nsmap  
  10. -rw-r--r-- 1      3634 2013-12-25 10:14 MediaBinding.nsmap  
  11. -rw-r--r-- 1      3634 2013-12-25 10:14 NotificationConsumerBinding.nsmap  
  12. -rw-r--r-- 1      3634 2013-12-25 10:14 NotificationProducerBinding.nsmap  
  13. -rw-r--r-- 1   2410694 2013-12-25 10:07 onvif.h  
  14. -rw-r--r-- 1      3634 2013-12-25 10:14 PausableSubscriptionManagerBinding.nsmap  
  15. -rw-r--r-- 1      3634 2013-12-25 10:14 PTZBinding.nsmap  
  16. -rw-r--r-- 1      3634 2013-12-25 10:14 PullPointBinding.nsmap  
  17. -rw-r--r-- 1      3634 2013-12-25 10:14 PullPointSubscriptionBinding.nsmap  
  18. -rw-r--r-- 1      3634 2013-12-25 10:14 ReceiverBinding.nsmap  
  19. -rw-r--r-- 1      3634 2013-12-25 10:14 RecordingBinding.nsmap  
  20. -rw-r--r-- 1      3634 2013-12-25 10:14 RemoteDiscoveryBinding.nsmap  
  21. -rw-r--r-- 1      3634 2013-12-25 10:14 RuleEngineBinding.nsmap  
  22. -rw-r--r-- 1      3634 2013-12-25 10:14 SearchBinding.nsmap  
  23. -rw-r--r-- 1  11308204 2013-12-25 10:14 soapC.c  
  24. -rw-r--r-- 1    713192 2013-12-25 10:14 soapClient.c  
  25. -rw-r--r-- 1       741 2013-12-25 10:14 soapClientLib.c  
  26. -rw-r--r-- 1   4882158 2013-12-25 10:14 soapH.h  
  27. -rw-r--r-- 1    636427 2013-12-25 10:14 soapServer.c  
  28. -rw-r--r-- 1       741 2013-12-25 10:14 soapServerLib.c  
  29. -rw-r--r-- 1    855676 2013-12-25 10:14 soapStub.h  
  30. -rw-r--r-- 1      3634 2013-12-25 10:14 SubscriptionManagerBinding.nsmap  
  31. -rw-r--r-- 1      3634 2013-12-25 10:14 wsdd.nsmap  
-rw-r--r-- 1      3634 2013-12-25 10:14 AnalyticsDeviceBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 AnalyticsEngineBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 CreatePullPointBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 DeviceBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 DeviceIOBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 DiscoveryLookupBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 DisplayBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 EventBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 ImagingBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 MediaBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 NotificationConsumerBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 NotificationProducerBinding.nsmap
-rw-r--r-- 1   2410694 2013-12-25 10:07 onvif.h
-rw-r--r-- 1      3634 2013-12-25 10:14 PausableSubscriptionManagerBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 PTZBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 PullPointBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 PullPointSubscriptionBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 ReceiverBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 RecordingBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 RemoteDiscoveryBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 RuleEngineBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 SearchBinding.nsmap
-rw-r--r-- 1  11308204 2013-12-25 10:14 soapC.c
-rw-r--r-- 1    713192 2013-12-25 10:14 soapClient.c
-rw-r--r-- 1       741 2013-12-25 10:14 soapClientLib.c
-rw-r--r-- 1   4882158 2013-12-25 10:14 soapH.h
-rw-r--r-- 1    636427 2013-12-25 10:14 soapServer.c
-rw-r--r-- 1       741 2013-12-25 10:14 soapServerLib.c
-rw-r--r-- 1    855676 2013-12-25 10:14 soapStub.h
-rw-r--r-- 1      3634 2013-12-25 10:14 SubscriptionManagerBinding.nsmap
-rw-r--r-- 1      3634 2013-12-25 10:14 wsdd.nsmap

整理生成的文件
 通過上面的兩個步驟的話,onvif的基本代碼框架就已經有了,裏面可能有就開發而已不需要的文件,可以直接刪除掉,還有一些文件需要從gsoap裏面拷貝過來
        1.修改wsdd.nsmap文件名爲wsdd.h,刪掉其他所有的nsmap文件(rm *.nsmap),命令空間文件文件都差不多,保留一個即可,需要的時候包含此文件就好
        2.直接刪除soapClientLib.c和soapServerLib.c文件,在開發過程中沒有實際用處
        3.將gsoap-2.8.14/gsoap-2.8/gsoap下的stdsoap2.h和stdsoap2.c文件和gsoap-2.8.14/gsoap-2.8/gsoap/custom下的duration.cw文件都拷貝到當前目錄下
        4.如果是作客戶端的開發的話,則刪掉soapServer.c文件,不然的話,裏面調用的很多接口只是寫了申明瞭函數原型,而沒有實現,需要服務端開發來實現的,剩餘客戶端開發代碼如下(服務端的話,多一個soapServer.c文件)
剩下有效的源碼文件如下:
[cpp]
  1. -rwxr-xr-x 1      6560 2013-12-25 10:44 duration.c*  
  2. -rw-r--r-- 1   2410694 2013-12-25 10:07 onvif.h  
  3. -rw-r--r-- 1  11308204 2013-12-25 10:14 soapC.c  
  4. -rw-r--r-- 1    713192 2013-12-25 10:14 soapClient.c  
  5. -rw-r--r-- 1   4882158 2013-12-25 10:14 soapH.h  
  6. -rw-r--r-- 1    855676 2013-12-25 10:14 soapStub.h  
  7. -rwxr-xr-x 1    477042 2013-12-25 10:31 stdsoap2.c*  
  8. -rwxr-xr-x 1     91109 2013-12-25 10:31 stdsoap2.h*  
  9. -rw-r--r-- 1      3634 2013-12-25 10:14 wsdd.h   
-rwxr-xr-x 1      6560 2013-12-25 10:44 duration.c*
-rw-r--r-- 1   2410694 2013-12-25 10:07 onvif.h
-rw-r--r-- 1  11308204 2013-12-25 10:14 soapC.c
-rw-r--r-- 1    713192 2013-12-25 10:14 soapClient.c
-rw-r--r-- 1   4882158 2013-12-25 10:14 soapH.h
-rw-r--r-- 1    855676 2013-12-25 10:14 soapStub.h
-rwxr-xr-x 1    477042 2013-12-25 10:31 stdsoap2.c*
-rwxr-xr-x 1     91109 2013-12-25 10:31 stdsoap2.h*
-rw-r--r-- 1      3634 2013-12-25 10:14 wsdd.h 

這樣基本的ONVIF代碼框架就已經生成完成了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章