您当前的位置: 首页 >  c++

phymat.nico

暂无认证

  • 7浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

c/c++使用gsoap发布和调用webservice

phymat.nico 发布时间:2015-01-09 13:11:13 ,浏览量:7

预备知识

ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。ONVIF规范涵盖了完全的XML及WSDL的定义。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。服务端与客户端的数据交互采用SOAP协议。【来自http://blog.csdn.net/ghostyu】

ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行 。

那么WebServices、SOAP、WSDL、gSOAP又都是什么?

假如我们需要开发一个linux上的app,这个app需要与远端的Web服务有一个交互,比如获取一个运算结果、或者是天气等,那么我们就需要使用WebServices。

Web Services可以概述为:

Web Services 可以将应用程序转换为网络应用程序。 通过使用 Web Services,应用程序可以向全世界发布信息,或提供某项功能。 Web Services 可以被其他应用程序使用。 通过 Web Services,会计部门的 Win 服务器可以与 IT 供应商的 UNIX 服务器相连接。 基本的 Web Services 平台是 XML+HTTP。 Web services 使用 XML 来编解码数据,并使用 SOAP 来传输数据。

SOAP又是什么?

SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。或者更简单地说:SOAP 是用于访问网络服务的协议。

对于应用程序开发来说,使程序之间进行因特网通信是很重要的。目前的应用程序通过使用远程过程调用(RPC)在诸如 DCOM 与 CORBA 等对象之间进行通信,但是 HTTP 不是为此设计的。RPC 会产生兼容性以及安全问题;防火墙和代理服务器通常会阻止此类流量。通过 HTTP 在应用程序间通信是更好的方法,因为 HTTP 得到了所有的因特网浏览器及服务器的支持。SOAP 就是被创造出来完成这个任务的。SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信。

如何实现SOAP?

我们要知道SOAP协议是基于XML的,那么如何能够将他们嵌入到C/C++的应用程序里使用?

gSOAP编译工具就提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。将与开发无关的SOAP协议的实现细节相关的内容对开发人员隐藏起来。因为SOAP提供的是一种标准化的方法,gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应用程序逻辑的实现工作了。并且可以跨越多个操作系统、语言环境以及在防火墙后的不同组织。

更直白的说,使用gSOAP可以产生用于开发Web Services的SOAP通信协议方面的代码框架,开发人员只需要实现server的被调用的函数,然后在client端就可以像调用本地函数一样调用在远端的函数。gSOAP包含两个工具wsdl2h和soapcpp2,用来产生代码框架。

开发Web服务程序,需使用gSOAP生成服务器端和客户端代码框架(通常情况下之需要实现server端或者实现client,因为另一端通常是别人做好的,比如ipnc中的onvif,实现的server端)。我们有两种做法:

编写WSDL,使用wsdl2h生成头文件,再soapcpp2生成框架代码; 编写头文件,使用soapcpp2生成框架代码; 这两种方式,结果是一样的,最终都有产生头文件,并生成代码。不同在于,在项目的开发中需要维护的文件不同,前者是需要维护WSDL文件,后者维护头文件。

SOAP调用示例

下面就使用第二种方法来实现一个简单的通信实例:在远端实现两数相加,然后返回运算结果。

1、下载gSOAP

我使用的版本时2.8.8,http://www.kuaipan.cn/file/id_48923272389088693.htm

gSOAP-2.8软件包不需要安装,直接解压,在gsoap-2.8\gsoap\bin目录下是上面提到的两个命令行工具,包含win32、linux、maxOS等三种版本,在使用soapcpp2生产代码框架时一般需要gsoap-2.8\gsoap\import目录下和gsoap-2.8\gsoap\custom的 文件。在命令行中使用-I包含进来即可。

2、编写头文件:add.h

 在这里我们不需要wsdl的文件,可以直接从.h文件来生成代码。我们定义一个函数声明文件,用来定义接口函数,名称为add.h

[cpp] view plain copy
  1. //gsoapopt cw   
  2. //gsoap ns2 schema namespace: urn:add   
  3. //gsoap ns2 schema form: unqualified  
  4. //gsoap ns2 service name: add   
  5. //gsoap ns2 service type: addPortType  
  6. //gsoap ns2 service port:http://websrv.cs.fsu.edu/~engelen/addserver.cgi  
  7. //gsoap ns2 service namespace: urn:add  
  8. //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http  
  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 );  
[cpp] view plain copy
  1. //gsoapopt cw  
  2. //gsoap ns2 schema namespace: urn:add  
  3. //gsoap ns2 schema form: unqualified  
  4. //gsoap ns2 service name: add  
  5. //gsoap ns2 service type: addPortType  
  6. //gsoap ns2 service port:http://websrv.cs.fsu.edu/~engelen/addserver.cgi  
  7. //gsoap ns2 service namespace: urn:add  
  8. //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http  
  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 );  
3、产生代码框架

我们执行一下命令,自动生成一些远程调用需要的文件。(先将他们加如到系统环境变量中)

soapcpp2 -c add.h

-c是产生纯C代码,如果提示找不到typemap.dat,将gsoap-2.8\gsoap下的typemap.dat复制到当前目录就可以了。通过上列命令我们会得到如下文件:

先大概记住他们的名字,将来会提到他们。

4、添加服务端代码,创建文件:addserver.c

[cpp] view plain copy
  1. #include "soapH.h"   
  2. #include "add.nsmap"   
  3.   
  4. int main(int argc, char **argv)  
  5. {  
  6.     int m, s;  
  7.     struct soap add_soap;  
  8.     soap_init(&add_soap);  
  9.     soap_set_namespaces(&add_soap, namespaces);  
  10.   
  11.     if (argc 
关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0894s