Onvif開發環境搭建
框架代碼在Linux環境下生成,經過比對,以下連個版本操作系統在使用相同版本的情況下生成的框架代碼相同
生成框架環境準備
下面記錄的是在CentOS下編譯gSoap生成框架代碼的過程
要使用root用戶進行編譯安裝,否則可能會因權限問題導致安裝失敗。
在桌面打開終端並切換到root用戶
$ su
輸入密碼,出現類似“[root@localhost Desktop]#”字樣即爲成功。
以下都是採用源碼編譯安裝的方式安裝。
1.安裝bison
官網:http://www.gnu.org/software/bison
使用版本: bison-2.7.tar.gz
下載地址: http://101.96.10.58/ftp.gnu.org/gnu/bison/bison-2.7.tar.gz
命令:
# ./configure
# make
# make install
2.安裝flex
官網:http://flex.sourceforge.net
版本:flex-2.6.4.tar.gz
下載地址: https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz
命令:
# ./configure
# make
# make install
3.安裝openssl
官網:https://www.openssl.org
版本:openssl-1.0.2m.tar.gz
下載地址: https://www.openssl.org/source/old/1.0.2/openssl-1.0.2m.tar.gz
備註:採用默認安裝路徑/usr/local/ssl/,這個路徑等下編譯gSoap源碼時會用到。
命令:
# ./config
# make
# make install
4.gSoap編譯
命令:
# ./configure --with-openssl=/usr/local/ssl
# make
# make install
make和make install 會出現以下錯誤
解決的方法是在 ./configure 後面加上參數LDFLAS=‘-ldl’
命令:
# make clean
# ./configure --with-openssl=/usr/local/ssl LDFLAGS=-ldl
# make
# make install
修改gsoap\typemap.dat文件,在文件末尾添加
wsnt__FilterType = $ wsnt__TopicExpressionType; _wsnt__NotificationMessageHolderType_Message = $_tt__Message* tt__Message; |
生成onvif.h文件
命令:
wsdl2h -c++ -x -t gsoap/typemap.dat -o onvif.h -d https://www.onvif.org/ver10/network/wsdl/remotediscovery.wsdl https://www.onvif.org/ver10/media/wsdl/media.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/search.wsdl http://www.onvif.org/onvif/ver10/replay.wsdl https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl |
修改onvif.h文件,否則無法鑑權
在生成的onvif.h中添加 #import "wsse.h"(切記不要寫成 #include "wsse.h")
chmod 777 onvif.h
生成onvif框架代碼
先創建文件夾來保存代碼
$ mkdir onvif
然後生成代碼
$ soapcpp2 -2 -C -c++ -x -j -I gsoap/import -I gsoap -I gsoap/custom -d onvif onvif.h
根據不同的gSOAP版本,這個過程你可能會遇到這樣的錯誤:
wsa5.h(288): **ERROR**: service operation name clash: struct/class 'SOAP_ENV__Fault' already declared at wsa.h:273
之所有會出現這個錯誤,是因爲onvif.h頭文件中同時:
#import "wsdd10.h" // wsdd10.h中又#import "wsa.h"#import "wsa5.h" // wsa.h和wsa5.h兩個文件重複定義了int SOAP_ENV__Fault
解決方法:修改import\wsa5.h文件,將int SOAP_ENV__Fault修改爲int SOAP_ENV__Fault_Alex
出現Compilation successful字樣,編譯成功完成.
Windows 下開發環境準備
1.VS2013編譯openssl-1.0.2m
1)安裝Perl
使用版本:strawberry-perl-5.28.0.1
下載地址:http://strawberryperl.com/download/5.28.0.1/strawberry-perl-5.28.0.1-64bit.msi
2)下載安裝nasm,並配置到環境變量中
官網:www.nasm.us
使用版本:2.14rc15
下載地址:https://www.nasm.us/pub/nasm/releasebuilds/2.14rc15/win64/nasm-2.14rc15-win64.zip
3)使用“VS2013 x86 本機工具命令提示”進入控制檯
perl Configure VC-WIN32
ms\do_nasm
nmake -f ms\ntdll.mak
結果在out32dll目錄和inc32目錄中
2.拷貝inc32目錄下的openssl
3.拷貝gSoap源碼
gSoap拷貝的源文件有的只有.c文件,沒有.cpp文件,需要把.c改成.cpp,將上一步拷貝的openssl文件夾放到gSoap源碼所在的目錄。
文件列表
dom.cpp dom.h duration.cpp duration.h mecevp.cpp mecevp.h onvif.h openssl smdevp.cpp smdevp.h soapC.cpp soapDeviceBindingProxy.cpp soapDeviceBindingProxy.h soapH.h soapImagingBindingProxy.cpp soapImagingBindingProxy.h soapMediaBindingProxy.cpp soapMediaBindingProxy.h soapPTZBindingProxy.cpp soapPTZBindingProxy.h soapPullPointSubscriptionBindingProxy.cpp soapPullPointSubscriptionBindingProxy.h soapRecordingBindingProxy.cpp soapRecordingBindingProxy.h soapRemoteDiscoveryBindingProxy.cpp soapRemoteDiscoveryBindingProxy.h soapReplayBindingProxy.cpp soapReplayBindingProxy.h soapSearchBindingProxy.cpp soapSearchBindingProxy.h soapStub.h soapwsddProxy.cpp soapwsddProxy.h stdsoap2.cpp stdsoap2.h threads.cpp threads.h wsa5.h wsaapi.cpp wsaapi.h wsdd.nsmap wsseapi.cpp wsseapi.h |
4.配置環境變量
變量名GSOAP_VS2013
變量值E:\JnPlatformONVIF\opensrc\gsoap
5.修改工程屬性
1.不使用預編譯頭
2.添加 /bigobj編譯命令
編譯出現錯誤
error LNK2001: 無法解析的外部符號 _namespaces
在cpp文件中包含wsdd.nsmap 文件(#include "wsdd.nsmap")
使用框架的時候,包含如下gSOAP頭文件
// gSoap 頭文件
#include "wsaapi.h"
#include "wsseapi.h"
#include "soapStub.h"
#include "soapwsddProxy.h"
#include "soapDeviceBindingProxy.h"
#include "soapMediaBindingProxy.h"
#include "soapImagingBindingProxy.h"
包含目錄中加入gsoap文件夾
預處理器中需要定義 WITH_OPENSSL
附加庫要有openssl生成的兩個lib文件,libeay32.lib與ssleay32.lib
並將附加庫目錄設爲..\gsoap\openssl\lib,即lib的所在目錄下。
這樣就可以開發了。
附件爲VS2013環境下搭建的空白框架