[置顶] gSOAP C++移植和开发总结

一、背景介绍

        因为工作关系,需要用到SOAP来与某支持SOAP协议的摄像头进行通信,以便获取摄像头的配置信息,播放rtsp码流以及报警事件流。

现有的软件环境如下:

(1)平台: Suse Linux系统

(2)编程语言:c++

(3)摄像头接口:WSDL,即web service description language

       项目的关键是:把WSDL文件,转化为C++应用编程接口。这些接口,应该是支持SOAP的。

     通过这些接口,需要做至少以下2个事情:

(1)发送获取数据请求,并解析服务端通过SOAP协议返回的数据;----》这需要把服务端SOAP原始数据进行反串行化,并转化为我们的格式。

(2)发送事件或数据,并通知服务器保存数据。-----》这需要把我们的数据进行组装,串行化为SOAP协议的形式。

       由于SOAP协议涉及一个串行化和反串行化的过程,且C++ 本身并不支持soap协议。如果完全自己实现,工作量大,风险也大。

        研究发现,gSOAP可以解决这一风险。

       [置顶] gSOAP C++移植和开发总结_第1张图片

      SOAP利用XML来描述消息体内容,利用HTTP来把SOAP消息发送到目的地。因此,SOAP是HTTP和XML的结合体

      SOAP SimpleObject Access Protocol的缩写。是基于XML的一种协议。一条SOAP消息就是一个普通的XML文档,包含下列元素:
      –必需的 Envelope元素,可把此 XML文档标识为一条 SOAP消息
      –可选的 Header元素,包含头部信息
      –必需的 Body元素,包含所有的调用和响应信息
      –可选的 Fault元素,提供有关在处理此消息所发生错误的信息
      在向WebService发送的SOAP请求中,Body元素中的字段需与WSDL中数据类型的相符合。在构建SOAP的过程中,必须从WSDL文件中获取并映射这一种对应关系。然而这样一个对应过程将是充满了重复性和机械性的,为了避免不必要的人工差错以及节约开发时间,一个名为gSOAP的编译工具应运而生。
      gSOAP利用编译器技术提供了一组透明化的SOAPAPI,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。通过将WSDL文件解析序列化为C/C++文件,最小化了WebService的开发过程。

       gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。

       有关gSOAP和wsdl关系,可参考我之前的文章:    

        gsoap 开发:基于wsdl文件和C++语言开发客户端程序

gSOAP的入门例子,可参考:

        Linux平台下基于C语言使用gSOAP开发Web Service服务端和客户端程序

 

二、代码框架设计

(1)利用gSOAP把wsdl转化为普通的C++代码

 (2)把这些C++代码编译为一个共享库、动态库,这样就形成了一个独立的gSOAP模块,不必每次重新搭建gSOAP开发环境,有助于gSOAP开发的重用,提高工作效率。

    如下图所示:

 [置顶] gSOAP C++移植和开发总结_第2张图片

三、开发流程

 [置顶] gSOAP C++移植和开发总结_第3张图片

四、动态库编译遇到的编译问题总结

1.cannot open file "custom/duration.h" for reading:

解决办法:
把gsoap2.8.15/gsoap/custom目录拷贝到当前工作目录


2.stdsoap2.cpp:8888: undefined reference to `namespaces
解决办法
make file:

CFLAGS := -g -O2 -Wall -Wno-deprecated-declarations -DWITH_NONAMESPACES

3.  undefined reference to `soap_default_xsd__duration
解决:

这个问题是因为在gSOAP工具中提供的typemap.dat文件中有下面的类型转换规则:

 

# Uncomment the line below to use LONG64 int for xsd:duration
# (with high ms precision)
# Must compile and link custom/duration.c with the project
xsd__duration = #import "custom/duration.h" | xsd__duration 而你在工程中没有加入和编译链接gsoap目录下的custon/duration.c文件。因此解决办法有两个:


(1)需要将\custom文件夹下面的duration.h和duration.c导入工程中。
这样还不行。由于使用C++编译器 因此需要将duration.c文件改为.cpp文件。
(2)修改你的typemap.dat文件中的上述转换规则,不使用LONG64,只使用long类型。

# Uncomment the line below to use LONG64 int for xsd:duration
# (with high ms precision)
# Must compile and link custom/duration.c with the project
#xsd__duration = #import "custom/duration.h" | xsd__duration

 

4.把通过wsdl生成的C++文件,编译成动态库。在其它C++程序中以动态库的形式,使用gsoap.出现编译错误:undefined reference to `namespaces
解决:编辑*.nsmap文件,把xx_namespaces去掉xx前缀,即修改为:namespaces

 

5.使用动态库出错: error while loading shared libraries...
解决办法: export LD_LIBRARY_PATH  = your lib dir

 

五、使用到的开发工具

(1)SOAP UI

  ( 2 ) Argo UML

你可能感兴趣的:([置顶] gSOAP C++移植和开发总结)