因为工作关系,需要用到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可以解决这一风险。
SOAP利用XML来描述消息体内容,利用HTTP来把SOAP消息发送到目的地。因此,SOAP是HTTP和XML的结合体
gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。
有关gSOAP和wsdl关系,可参考我之前的文章:
(1)利用gSOAP把wsdl转化为普通的C++代码
(2)把这些C++代码编译为一个共享库、动态库,这样就形成了一个独立的gSOAP模块,不必每次重新搭建gSOAP开发环境,有助于gSOAP开发的重用,提高工作效率。
如下图所示:
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