gsoap
onvif开发要到gsoap库,下载不需要安装,简单例子参见gsoap-2.8\gsoap\samples\calc,实现一个服务端做加减乘除的例子,把运算结果发给客户端(代码见:http://download.csdn.net/detail/evsqiezi/6647303)。
1 gsoap首先要定义“功能”,并解释成C文件。
使用gSOAP生成代码框架。我们有两种做法:
编写WSDL,使用wsdl2h生成头文件,再soapcpp2生成框架代码;
编写头文件,使用soapcpp2生成框架代码;
方法1比较通用,可方便使用其他语言开发,但是编写wsdl语法复杂;方法2比较简单,但不能与其他语言通用。
下载ONVIF的所有WSDL文件,并生成onvif.h的命令如下:
wsdl2h -o onvif.h -c -s -t .\typemap.dat http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl http://www.onvif.org/onvif/ver10/display.wsdl http://www.onvif.org/onvif/ver10/deviceio.wsdl http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl http://www.onvif.org/onvif/ver10/receiver.wsdl http://www.onvif.org/onvif/ver10/recording.wsdl http://www.onvif.org/onvif/ver10/search.wsdl http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl http://www.onvif.org/onvif/ver10/replay.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/schema/onvif.xsd
参数的解释如下:
-S 仅生成客户端代码
-t 文件名,指定type map文件,默认为typemap.dat
typemap.dat文件用于指定SOAP/XML中的类型与C/C++之间的转换规则,比如在wsmap.dat里写xsd__string = | std::wstring | wchar_t* ,那么SOAP/XML中的string将转换成std::wstring或wchar_t*,这样能更好地支持中文。
2 修改生成的onvif.h,增加一句#import "wsse.h",用“soapcpp2.exe”解释生成c文件(例如:soapcpp2.exe x.h -I ..\..\import)。
遇到的问题:
生成的过程中会出现SOAP_ENV__Fault重复定义,注视掉wsa5.h中得内容就行了
ONVIF模块
PTZ控制
入门例子
搜索设备
注:只能搜到统一网段的设备。
获取媒体信息
2013.12.5
获取设备能力
GetCapabilities(DeviceMgmt)
从报文中提取出媒体信息URI :http://192.168.15.240/onvif/Media,将用于查询具体的视频源、编码器配置参数。
如果设备具备用户名、密码,那么查询设备能力可能需要鉴权过程。
获取RTSP的URL的步骤:
GetProfiles(media)-》GetStreamUri(media)
GetProfiles可以获得设备的所有配置信息,这是比较全面的数据。GetProfile或者是GetProfiles成功后会获得一个Profile的profileToken,并且如果里面的
VideoEncoderConfiguration不为空,那么就可以使用该ProfileToken作为getStreamURI的参数,
GetStreamUri的请求指针中必须填写profile的ProfileToken字段,就是要指明哪一个通道的流媒体地址。
获取媒体参数
GetVideoEncoderConfigurations:可以获得单独的媒体配置信息,返回的应答中包括主通道和子通道的数据,如:宽高,帧率,位率等。
问题:
Critical error: #import: Cannot open file "stlvector.h" forreading.
那是因为我们的头文件使用了STL(wsdl2h 没用-s选项 ),这时要使用-I选项指定gSOAP的import文件路径,这个路径是"$gsoap\gsoap\import ",$gsoap为解压目录:
如:soapcpp2 hello.h -I xx\gsoap\import
mecevp.obj : error LNK2019: 无法解析的外部符号 _EVP_PKEY_encrypt_old,该符号在函数 _soap_mec_init 中被引用
可能是在openssl库里找不到函数的定义,正确编译的方法如下:
下载并安装per(网站见:http://www.activestate.com/activeperl),安装后目录自动加入系统变量。
下载openssl(网址见:http://www.openssl.org/source/),运行"Visual Studio 2008 命令提示",以下步骤为编译release版本。
1 打开命令行,进入openssl的目录,执行“perl Configure VC-WIN32 --prefix=c:/openssl”;
2 执行“ms\do_ms”;
3 执行“nmake -f ms\ntdll.mak”;
4 执行 “nmake -f ms\ntdll.mak install”,到此编译完成,在c:/openssl目录下已经生成所需文件。
如果要编译debug版,修改ms\do_ms.bat文件,在perl util\mk1mf.pl ,perl util\mkdef.pl后面加32。