一、 开发环境
本人开发环境为:
1. 电脑主频2.6G,内存4G;
2. 虚拟机:Product: VMware® Workstation; Version: 7.1.3 build-324285
3. linux操作系统版本:
[root@localhost ~]# cat /proc/version
Linux version 2.6.25-14.fc9.i686 (mockbuild@) (gcc version 4.3.0 20080428 (Red Hat 4.3.0-8) (GCC) ) #1 SMP Thu May 1 06:28:41 EDT 2008
[root@localhost ~]#
4. linux编译环境:海思交叉编译器arm-hisiv100nptl-linux-g++
二、必备网址
1. Onvif官网:http://www.onvif.org/
2. gsoap官网:http://www.cs.fsu.edu/~engelen/soap.html
三、操作步骤详解
参考下面链接,完成arm——linux的gsoap的移植
linux设备上的Onvif 实现3 :gSOAP嵌入式linux下的移植与程序开发
3. 头文件生成
以上两个命令中,命令wsdl2h用于生成头文件,命令soapcpp2用于生成源文件;这两个命令在/gsoap_2.8.15/gsoap-2.8/gsoap/bin中可以找到。bin目录下面包含三个目录,分别表示win32系统,linux系统以及macosx系统下的命令。但是bin目录下面的是源码包里面自带的,我们在自己系统里开发的话最好根据自己的编译器去编译生成新的命令。编译生成的新的命令可以在gsoap目录下看到。
工具安装完成之后可以在linux下重新建立一个自己的目录,用来生成代码:
这里建立目录:onvif_new
完整路径为:/home/samba/onvif-2013.08.05/ onvif_new/
将gsoap 目录下的typemap.dat文件拷贝到目录onvif_new
(1)在线生成头文件:
在onvif_new目录下执行命令:
~onvif_new$: 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/media/wsdl/media.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/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/ver10/actionengine.wsdl
http://www.onvif.org/ver10/pacs/accesscontrol.wsdl
http://www.onvif.org/ver10/pacs/doorcontrol.wsdl
下面可以直接使用的格式:
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/media/wsdl/media.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/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/ver10/actionengine.wsdl http://www.onvif.org/ver10/pacs/accesscontrol.wsdl http://www.onvif.org/ver10/pacs/doorcontrol.wsdl
每个网址之间用空格分开,执行完命令即可生成头文件onvif.h。
以上地址来自onvif官网,可以自己登录官网查看。
注意,这种方式的话一定要保证您的虚拟机能出外网,简单说就是在虚拟机下能ping通百度或者其他外网地址;而且要保证网络比较快,否则在生成过程中会出现下载文件超时而导致生成头文件失败。该方式生成的话,所有文件均是在线实时下载。
(2)离线生成头文件
如果当前电脑无法联网,则可以通过离线的方式来生成,命令为:
~onvif_new$: wsdl2h -o onvif.h -c -s -t ./typemap.dat devicemgmt.wsdl media.wsdl event.wsdl display.wsdl
deviceio.wsdl imaging.wsdl ptz.wsdl receiver.wsdl recording.wsdl search.wsdl remotediscovery.wsdl
replay.wsdl analytics.wsdl analyticsdevice.wsdl actionengine.wsdl accesscontrol.wsdl doorcontrol.wsdl
注意不同的wsdl以空格分开。
目前Onvif官网提供的最新的WSDL文件一共有17个,可以将其下载下来。不过这些文件直接都是相互关联的,下载的话,除了这17个文件之外,还要下载所有相关联的文件。另外,下载之后,还需要更改文件中的路径,将wsdl文件中的schemaLocation以及location所指的路径进行修改,修改为本地的地址。将所有需要下载的文件下载到onvif_new目录,并修改相关地址。当然如果网速够快,提倡直接在线生成头文件和源文件。另外为了避免后续开发过程中出现某些功能的缺省,最好一次性生成包含所有功能的代码。
(3)离线生成头文件过程:
离线生成头文件过程如下所示:
本地生成的基本命令(先在官网下载好wsdl文件,然后和前面wsdl2h命令放在同一个文件下,执行命令时各个wsdl文件之间用空格分开):
命令执行完成之后可以在当前目录下看到onvif.h。
4. 源文件的生成
生成onvif.h头文件之后,即可根据soapcpp2命令生成C源文件或者CPP源文件。
命令为:
onvif_new $: soapcpp2 -c onvif.h -x -I import路径 -I gsoap路径
如果要生成cpp文件,则为:
onvif_new $: soapcpp2 -cpp onvif.h -x -I import路径 -I gsoap路径
两种方式生成的文件基本相同,只是名字略有区别,大家可以生成对比看看。
如下所示:
[root@localhost onvif_new]#
[root@localhost onvif_new]# soapcpp2 -c onvif.h -x -I /home/samba/onvif-2013.08.05/gsoap_2.8.15/
gsoap-2.8/gsoap/import -I /home/samba/onvif-2013.08.05/gsoap_2.8.15/gsoap-2.8/gsoap/
。。。。。。。。。。。。。
Compilation successful
[root@localhost onvif_new]#
[root@localhost onvif_new]#
可以看到,这次可以成功执行命令,在当前目录下可以看到生成的源文件以及不同功能所对应的命名空间。然后我们可以在新生成的源码上面进行开发。也许有人会觉得代码量很大,没关系,我们后续可以裁剪。另外,为了保证onvif所有的功能都包括在里面,我们必须在最开始开发的时候就生成包含所有功能的文件。
以上过程的wsdl文件可以在http://download.csdn.net/detail/u011597695/5875143下载。
第三部分 gsoap工具使用说明
1 建立工作目录target,将工具wsdl2h、soapcpp2、*.wsdl文件存放在此目录中
2 运行wsdl2h:
运行一般的web service,只要使用/gsoap-2.8/gsoap/ WS-typemap.dat即可。
./wsdl2h -s -c -o remotediscovery.h remotediscovery.wsdl -t WS-typemap.dat
运行WSDL功能,必须使用/gsoap-2.8/gsoap/WS/ WS-typemap.dat,否则就要手动添加WSDL相关内容。
./wsdl2h -s -c -o remotediscovery.h remotediscovery.wsdl -t WS-typemap.dat
Gsoap 2.8.15版本下的WS-typemap.dat是完整的,支持WS-Discovery。
Gsoap 2.8.3下的gsoap/typemap.dat需要手工添加命令空间。这个文件不同导致生成的RemoteDiscoveryBinding.nsmap前缀是不同的。
3 运行soapcpp2,用到了/gsoap-2.8/gsoap/imp
./soapcpp2 -c -L -x -I../gsoap-2.8/gsoap/imp
生成的文件是:
RemoteDiscoveryBinding.nsmap、wsdd.nsmap 这两者是相同的
soapC.c
soapH.h
soapClient.c
soapServer.c
soapStub.h
-----------------------------------
---------------------------------------------------------------------
第六部分 add计算服务 示例运行成功
参考资料 http://blog.csdn.net/myfwf1988/article/details/8899144
1 创建测试目录/work/gaoht/gsoap/gsoap-2.8/gsoap/samples/add,
2 成功编译,
3 在连接0.234的一个终端上运行addserver,绑定端口1234。
./addserver 1234
4 在连接0.234的另一个终端上运行addclient,指定服务器及端口:
./addclient 192.168.0.234:1234 10 20
5 观察到服务器端提示
Socket connection successful: master socket = 3
Socket connection successful: slave socket = 4
客户端提示:
server is 192.168.0.234:1234, num1 is 10, num2 is 20/n--stdsoap2.c: 5027
10 + 20 = 30