二: onvif 开发环境的搭建
下边这张图来自于网上,对我们熟悉onvif开发描述的十分清晰,我就是顺着这个思路走下去的。
从上边的介绍中,我们基本知道onvif是个什么协议,其中十分关键一点是这种协议的展现形式是webservice。让我们通过下图对webservice的调用过程有一个初步的了解。
对基于webservice格式存在接口,我们第一步要首先寻找webserive对应的wsdl文件在那里?当然去onvif的官方网站去找了。要搭建开发平台的第一步就是从onvif的官方网站获取wsdl.
1:访问如下地址获取相关的wsdl.
http://www.onvif.org/Documents/Specifications.aspx
在这个页面中会看到如下图所示的内容,
ONVIF WSDL andXML Schemas Specifications
Use the schemafiles below to automatically generate client and server side stubs. Open thelinks in your browser to view the related service documentation. The indexlists all operations specified for ONVIF services.
- Dec 2013 -
ONVIF Device Management Service WSDL, ver 2.4.1 - Aug 2013 - ONVIF Event Service WSDL, ver 2.4
- Jun 2011 - ONVIF Display Service WSDL, ver 2.1.1
- May 2012 - ONVIF Device_IO Service WSDL, ver 2.2
- May 2012 - ONVIF Imaging Service WSDL, ver 2.3
- Dec 2013 -
ONVIF Media Service WSDL, ver 2.4.1 - Aug 2013 - ONVIF PTZ Service WSDL, ver 2.4.1
- Jan 2012 - ONVIF Receiver Service WSDL, ver 2.1.1
- Aug 2013 - ONVIF Recording_Control Service WSDL, ver 2.4
- Aug 2013 - ONVIF Recording_Search Service WSDL, ver 2.4
- Jun 2010 -ONVIF
Remote Discovery Proxy Services WSDL, ver 1.1 - Dec 2012 - ONVIF Replay Service WSDL, ver 2.2.1
- Aug 2013 - ONVIF Analytics Service WSDL, ver 2.2
- Jun 2011 - ONVIF Video Analytics Device_Service WSDL, ver 2.1.1
- Dec 2013 -
ONVIF Schema, ver 2.4.1 - May 2012 - ONVIF Action Engine Service WSDL, ver 1.0
- Dec 2013 - ONVIF Access Control Service WSDL, ver 1.0.1
- May 2013 - ONVIF Door Control Service WSDL, ver 1.0
- Dec 2013 - ONVIF Advanced Security Service WSDL, ver 1.0.1
Deprecated since version 1.02:【这部分是过时的东西,就不要在用了】
- Nov 2008 -
ONVIF Video Analytics Service WSDL, ver 1.0 (deprecated) - Nov 2008 -
ONVIF Imaging Service WSDL, ver 1.0 (deprecated) - Nov 2008 -
ONVIF PTZ Service WSDL, ver 1.0 (deprecated) - Jun 2011 -ONVIF
Topic Namespace XML, ver 1.3
2:如何下载这些wsdl?
目前总共有24个下载项目我们可以看到,我当时一看,头都大了,这么多,还不累死人去,别着急,其实和我们相关的东西还真不多,我们仅仅需要关注我用彩色标注出来这四个部分即可,当然你如果有兴趣,也可以把其它部分都下载下来。下载的方式当然是点右键,打开这个链接,然后页面另存为即可。页面另存为的时候就不要修改文件名称了,它是什么就什么,这四个文件名称分别为:
Devicemgmt.wsdl:设备管理的webservice
Meida.wsdl: 媒体能力的webservice
Remotediscovery.wsdl:搜索设备的webservice
Onvif.xsd: 公共数据结构的定义,无论使用那个webservice,这个都要下载
3: 下载gsoap帮助我们把这些wsdl生成c代码
我下载的是最新的gsoap版本,版本号:2.8.17,访问以下连接,得到最新的gsoap工具。
http://sourceforge.jp/projects/sfnet_gsoap2/releases/
目前最新版本是gsoap_2.8.17,下载下来之后扩张名是zip,直接在windows下解压即可,然后上传到linux服务器。gsoap在linux下需要编译一下才能得到我们想要哪两个工具soapcpp2和wsdl2h。windows下使用gsoap相对简单,下载后之后使用不需要编译,在下载包中已经包含了这两个可执行程序。
注意/home/wx是公司分配给我的工作目录。以下的描述我对直接用决定路径描述,所以你在编译的过程中,要有所参考,不是全盘照抄。
另外编译过程中需要安装一些开发库,根据编译的错误随时调整需要安装的开发库。我在编译的过程中,根据出现的错误提示信息,安装相应的linux开发包。编译gsoap的过程十分简单,总共两条命令:
./configure
./make
编译完以后进入/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/bin/linux386目录,可以看到soapcpp2 wsdl2h这两个可执行程序,wsdl2h用于根据wsdl生成头文件,soapcpp2用于根据生成的头文件再生成c的源文件。
1: 把前边下载的3个wsdl文件和一个xsd文件上传到和soappcpp2 wsdl2h相同的目录。
2: 把/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap目录下的import目录,custom目录,以及该目下的typemap.dat三部分拷贝到/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/bin/linux386.然后执行下边的操作,用于生成头文件onvif.h
./wsdl2h
-c -s -t ./typemap.dat -o onvif.h remotediscovery.wsdl media.wsdl devicemgmt.wsdl
或者
./wsdl2h
-c -s -t ./typemap.dat -o onvif.h
http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdlhttp://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdlhttp://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
第二种方式其实直接使用网上的wsdl,不用自己下载,如果网络速度足够快,我建议用第二种方式。第一种方式执行生成onvif.h头文件需要修改原始下载下来的三个wsdl文件,第二种方式利用网络上的wsdl不需要修改wsdl文件,可靠并且方便。
3:紧接着要生成c的原文件,在生成c的源文件之前,修改两个地方,因为webservice提供的函数调用都需要鉴权操作,所以这部分功能需要打开。修改上一步生成的onvif.h文件,我当时就是没有修改这个文件,导致最后生成代码中SOAP_ENV__Header结构体中缺少定义
wsse__Security数据段,无法进行鉴权命令。所以切记不要忘记了,必须修改如下,在onvif.h中增加#import "wsse.h"。
另外把/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/bin/linux386/import目录下的wsa5.h的头文件中把最后一个结构注释上。字样如下:
//gsoapSOAP_ENV service method-action: Fault
http://www.w3.org/2005/08/addressing/soap/fault
intSOAP_ENV__Fault
( _QName faultcode, // SOAP 1.1
char *faultstring, // SOAP 1.1
char *faultactor, // SOAP 1.1
struct SOAP_ENV__Detail *detail, //SOAP 1.1
struct SOAP_ENV__Code *SOAP_ENV__Code, // SOAP 1.2
struct SOAP_ENV__Reason *SOAP_ENV__Reason, // SOAP 1.2
char *SOAP_ENV__Node, // SOAP 1.2
char *SOAP_ENV__Role, // SOAP 1.2
struct SOAP_ENV__Detail *SOAP_ENV__Detail, // SOAP 1.2
void
);
然后执行下边的操作。
./soapcpp2 -2 -c -C -L -x onvif.h -Iimport
如果成功执行以上命令,该工具会生成如下几个文件:
-rwxr--r-- 1 wxSmbGrp 8464004 Mar 31 16:34 soapC.c
-rwxr--r-- 1 wxSmbGrp 389296 Mar 31 16:34 soapClient.c
-rwxr--r-- 1 wxSmbGrp 1917 Mar 31 16:34 wsdd.nsmap
-rwxr--r-- 1 wx SmbGrp 3624959 Mar 31 16:34 soapH.h
-rwxr--r-- 1 wxSmbGrp 556743 Mar 31 16:34 soapStub.h
4:整理自己工程所需要的头文件h文件和c源文件,需要的原文件列表如下:
文件名称 |
来源 |
soapC.c |
gsoap生成 /home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/bin/linux386 |
soapClient.c |
gsoap生成 /home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/bin/linux386 |
wsdd.nsmap |
gsoap生成 /home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/bin/linux386 |
soapH.h |
gsoap生成 /home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/bin/linux386 |
soapStub.h |
gsoap生成 /home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/bin/linux386 |
dom.cpp |
直接拷贝 /home/wx/gsoap_2.8.17/gsoap-2.8/gsoap |
Stdsoap2.cpp |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap |
Stdsoap2.h |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap |
Duration.c |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Duration.h |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Mecevp.c |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Mecevp.h |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Smdevp.c |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Smdevp.h |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Thread.c |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Thread.h |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Wsaapi.h |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Wsaapi.c |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Threads.c |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Threads.h |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Wsseapi.c |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
Wsseapi.h |
直接拷贝/home/wx/gsoap_2.8.17/gsoap-2.8/gsoap/plugin |
在Windows下边记着把.c文件修改扩展名为.cpp,文件名称不要修改,仅仅修改文件的扩展名。
5:建立我自己的第一个onvif应用。
上边这个压缩包可以直接解压,上传到linux服务器进行测试上边所做的工作是否成功。这个软件包可以测试出网络中的摄像头,然后得出其中第一个搜索到的摄像头所具有的能力。