Onvif開發之程式碼框架生成篇
阿新 • • 發佈:2019-02-12
看了前一篇的ONVIF的簡單介紹應該對它的基本使用都有了一些基本的瞭解了吧!
下面我講一步分解向大家介紹下如何通過gsoap生成需要的程式碼,以及程式碼中需要注意的問題[基於Linux平臺 C開發]
此方法因為和網路環境有很大的關係,所以中間很容易因為網路問題斷掉重新開始,所以不建議使用此方法.
本地生成的基本命令(先在官網下載好wsdl檔案,然後和前面wsdl2h命令放在同一個檔案下,執行命令時各個wsdl檔案之間用空格分開):
修改好onvif.h後,在gsoap-2.8.14/gsoap-2.8/gsoap/bin/linux386下把soapcpp2也拷貝到當前生成onvif.h的目錄下,
行如下命令:
整理生成的檔案
通過上面的兩個步驟的話,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檔案)
剩下有效的原始碼檔案如下:
下面我講一步分解向大家介紹下如何通過gsoap生成需要的程式碼,以及程式碼中需要注意的問題[基於Linux平臺 C開發]
生成Onvif相關原始碼(我現在使用的gsoap版本是gsoap2.8.14,下面有下載地址):
在下載的gsoap檔案下,在/gsoap-2.8/gsoap的目錄下有有個typemap.dat檔案,後面就是通過此檔案來生成onvif.h檔案的。在這裡說明下利用gsoap-2.8.8的版本的話,需要稍微修改下typemap.dat檔案,在其後面新增如下內容:
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命令的相關引數包括,可以根據實際開發需要來生成程式碼:
-c 產生c語言的程式碼,否則產生C++(預設)
-s 不使用STL程式碼
-t 指定typemap.dat檔案
-o 指定生成的標頭檔案名
連結網路生成的基本命令如下(各個URL用空格隔開):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檔案之間用空格分開):
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行的樣子)
import "wsse.h" // 安全驗證
修改好onvif.h後,在gsoap-2.8.14/gsoap-2.8/gsoap/bin/linux386下把soapcpp2也拷貝到當前生成onvif.h的目錄下,
行如下命令:
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 //採用SOAP1.2,和SOAP1.0版本不同,會導致搜尋工具搜尋不到
-x //不產生xml檔案(可用可不用,xml有一定幫助,但是太多)
-I //為引入路徑
-C //只產生客戶端程式碼(注意:C是大寫,不推薦有次命令)
生成的檔案如下:
-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檔案)
剩下有效的原始碼檔案如下:
-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程式碼框架就已經生成完成了,如果想看一個簡單的程式碼例子的話,可以參考這個例程
後面的系列文章將簡單下自己開發預覽,引數這些基本模組的一些問題。