onvif研究总结

1、gsoap开发中的记录

gsoap使用时需加入-t type.dat 不然会出现cannot  open file ns1.h的错误。

type.dat在gsoap工具包中有。

一般是wsdl2h.exe -o xxx.h -t typemap.h xxx.wsdl

以下就是wsdl2h的选项:

  • -o 文件名,指定输出头文件
  • -n 名空间前缀 代替默认的ns
  • -c 产生纯C代码,否则是C++代码
  • -s 不要使用STL代码
  • -t 文件名,指定type map文件,默认为typemap.dat
  • -e 禁止为enum成员加上名空间前缀

type map文件用于指定SOAP/XML中的类型与C/C++之间的转换规则,比如在wsmap.dat里写

xsd__string = | std::wstring | wchar_t*

那么SOAP/XML中的string将转换成std::wstring或wchar_t*,这样能更好地支持中文。

接着就是讲.h文件生成.cpp文件

soapcpp2.exe接的选项如下

  • -C 仅生成客户端代码
  • -S 仅生成服务器端代码
  • -L 不要产生soapClientLib.c和soapServerLib.c文件
  • -c 产生纯C代码,否则是C++代码(与头文件有关)
  • -I 指定import路径(见上文)
  • -x 不要产生XML示例文件
  • -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
这里一般需要带上-x,不然会生成一大堆的xml文件。

-i选项也要带上,不然不会生成soapXXXXBindingService.cpp和soapXXXXBindingService.h文件

-I 选项一般也要带上,-I 后接gsoap路径中import目录

一般是-I  E:\workspace\onvif\gsoap-2.8\gsoap\import;E:\workspace\onvif\gsoap-2.8\gsoap这样的

如:soapcpp2.exe -x -i -S media.h -I E:\workspace\onvif\gsoap-2.8\gsoap\import;E:\workspace\onvif\gsoap-2.8\gsoap

一般会生成如下几个文件:(以media.wsdl为例)

MediaBinding.nsmap

soapC.cpp

soapH.h

soapMediaBindingProxy.cpp

soapMediaBindingProxy.h

soapMediaBindingService.cpp

soapMediaBindingService.h

soapStub.h

据网上所查以上文件的解析如下:

  • soapStub.h    // soap的存根文件,定义了media.h里对应的远程调用模型
  • soapC.c soapH.h  // soap的序列和反序列代码,它已经包含了soapStub.h,服务器端与客户端都要包含它
  • soapClient.c soapClientLib.c // 客户端代码,soapClientLib.c文件则只是简单地包含soapClient.c和soapC.c    soapcpp2后面不加-i才有此文件
  • soapServer.c soapServerLib.c // 服务器端代码,soapServerLib.c文件则只是简单地包含soapServer.c和soapC.c   soapcpp2后面不加-i才有此文件
  • ServiceSoap.nsmap ServiceSoap12.nsmap // 名空间定义,服务器端与客户端都要包含它
  • soapServiceSoapProxy.h soapServiceSoap12Proxy.h // 客户端的C++简单包装(如果头文件是纯C代码,这两个文件就不会生成) 

打开soapMediaBindingService.h,会发现里面都是一些虚函数。

在soapMediaBindingService.cpp中我们需要实现这些虚函数:

这是一种实现方法.

后面的内容继续研究。。。。


你可能感兴趣的:(WEB技术)