gsoap编译工具的安装与使用(二)----工具的使用及问题的解决

来源:互联网 发布:教室别恋 知乎 编辑:程序博客网 时间:2024/05/18 03:48

最近在研究安防监控类的产品研发,为了遵循和实现相关协议,便开始研究gsoap,现价将gsoap工具的安装和学习使用以及碰到的问题总结如下:

1、linux下的gsoap编译工具的安装;

2、gsoap编译工具的使用

3、gsoap编译工具在使用中碰到的问题及解决方案

gsoap 用户使用指导:下载

离线情况下,gsoap安装的一些离线的安装包:下载

转载请注明出处:http://blog.csdn.net/wang_zheng_kai

2、gsoap编译工具的使用

gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。在这里不得不介绍两个必要的命令:
(1)soapcpp2命令
首先,soapcpp2命令的使用是基于特定的头文件的,而头文件的生成有两种方式:1)利用wsdl2h命令结合特定功能的wsdl文件来生成,在后面我们会进行介绍;2)自己编写简单的头文件方法如下:
下面将会以add.h为例介绍:
1. //gsoap  ns2 service name: add  定义的是代理类的名称2.  //gsoap ns2 service type: rpc3. //gsoap  ns2 service encoding: encoded4. 以上两条是定义要使用的编码方式,这里使用的是SOAP RPC5. //gsoap ns2 service location:http://127.0.0.1  定义了服务器的地址6. //gsoap ns2 service namespace: urn:add   定义命名空间的名字7. //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http  8. 以下的三条是当涉及到SOAP Action时,这几行信息将提供给每个远程方法。9. //gsoap ns2  service method-style:      add rpc  10. //gsoap ns2  service method-encoding:   add http://schemas.xmlsoap.org/soap/    encoding/  11. //gsoap ns2  service method-action:     add  ""      这个""是什么呢?我只能说下我的理解 12. int ns2__add( int num1, int num2, int* sum );    
这个是在服务器的定义的一个远程方法,实际既是一个有特定功能的函数,供客户端调用。
ns1为命名空间前缀,add是函数名称。(注意:函数名中单个下划线将在XML中解释为破折号-)。
使用ns2__作为远程方法的命名空间,是为了防止远程方法名冲突,比方多个服务中使用同一个远程方法名的情况。命名空间前缀及命名空间名称同时也被用来验证SOAP信息的内容有效性。

soapcpp2 add.h 生成的是c++协议框架
soapcpp2 -c add.h 生成的是纯C语言的协议框架。
常用的命令:
-C 仅生成客户端代码
          -S 仅生成服务器端代码
          -L 不要产生soapClientLib.c和soapServerLib.c文件
           -c 产生纯C代码,否则是C++代码(与头文件有关)
          -x 不要产生XML示例文件
          -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。

会生成一些列的文件,下面只是列出了一部分:
soapStub.h    // soap的存根文件,定义了phonelocal.h里对应的远程调用模型
soapC.c soapH.h  // soap的序列和反序列代码,它已经包含了soapStub.h,服务器端与客户端都要包含它
soapClient.c soapClientLib.c // 客户端代码,soapClientLib.c文件则只是简单地包含soapClient.c和soapC.c
ServiceSoap.nsmap // 名空间定义,服务器端与客户端都要包含它

最后,即可书写客户端和服务器的相关代码。

编译的时候,我们还需要stdsoap2.c  stdsoap2.h 这两个文件。

(2)wadl2h命令
该命令是用来生成特定头文件的。
我们需要从onvif官网下载wsdl文件,和onvif.xsd文件。然后生成.h文件,其中最新版的wsdl文件包括以下几个文件:
accesscontrol.wsdl     deviceio.wsdl     imaging.wsdl   recording.wsdlactionengine.wsdl      devicemgmt.wsdl   media.wsdl     remotediscovery.wsdladvancedsecurity.wsdl  display.wsdl      onvif.xsd      replay.wsdlanalyticsdevice.wsdl   doorcontrol.wsdl  ptz.wsdl       search.wsdlanalytics.wsdl         event.wsdl        receiver.wsdl
wsdl2h -o outfile.h infile.wsdl 
wsdl2h常用选项:
       -o 文件名,指定输出头文件     
       -n 空间名前缀,代替默认ns  
        -c 产生纯C代码,否则是C++
       -s 不要使用stl代码
       -t 文件名,默认使用typemap.dat(下文会详细阐述)
       -e 禁止enum加上命名空间前缀

但是由于我的计算机没有联网,我下载了wsdl文件到本地,然后修改wsdl中的相关路径,具体的修改如下:

a、修改需要实现相应功能的wsdl文件,下载onvif.xsd后修改后为:
<xs:import  namespace="http://www.onvif.org/ver10/schema" 
schemaLocation="/home/user/gsoap-2.8/gsoap/wsdl_local/onvif.xsd"/>
修改之前schemaLocation是一个url,如果你放的和你onvif的wsdl文件相同的目录中,这样写就ok了,如果不是,可以写上相对路径。
b、修改onvif.xsd文件,同样先下载b-2.xsd,然后修改为
<xs:import namespace="http://docs.oasis-open.org/wsn/b-2" 
schemaLocation="/home/user/gsoap-2.8/gsoap/wsdl_local/b-2.xsd"/>
c、同理修改b-2.xsd文件。
根据onvif官网提供的remotediscovery.wsdl产生onvif.h头文件
关于onvif所有的wsdl都在这里:http://www.onvif.org/Documents/Specifications.aspx中的ONVIF WSDL and XML Schemas Specifications一节,虽然可以全部下载为wsdl文件,但是wsdl文件中存在相互依赖的关系,并且是带有存储的依赖,所以最好直接使用url来产生头文件,不要下载下来。
wsdl2h -o onvif.h -c -s -t /home/user/gsoap/typemap.dat  /home/user/gsoap-2.8/gsoap/wsdl_local/search.wsdl
使用onvif.h来产生骨架代码
soapcpp2 -c onvif.h -x -I /home/user/gsoap-2.8/gsoap/import -I /home/user/gsoap-2.8/gsoap/  

3、gsoap编译工具在使用中碰到的问题及解决方案
(1)问题一:在联网情况下,使用wsdl2h命令生成头文件时指定的wsdl文件路径无效。
解决:原因在于该软件不断更新,网站也不断完善,有部分文件已经不存在,或者网站路径已经更改,无法找到该文件。
我们只需去官网将wsdl文件下载到本地,使用命令是只要指定绝对路径即可。
(2)问题二:生成的协议框架中,结构体成员不完整,函数也不全,而且每次生成的协议框架有一定几率不一致。
解决:原因在于生成过程中部分文件必须依赖官网的文件,再不联网的情况下是不能完成的。
只需要放到服务器(已经连接外网)即可。
(3)问题三:编译情况下,部分函数无定义。
解决:需要将gsoap目录下的stdsoap2.h和stdsoap.c文件拷到当前目录。
(4)问题四:在测试设备发现功能的时候,onvif device test tool工具没有检测到应有的设备。
解决:该问题的原因很多,我出现的问题是放火墙没有关闭,两个设备不能进行正常的通信,只需要关闭放火墙就能够解决该问题。
9 1