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 指定imp<wbr>ort路径(见上文) </wbr>
- -x 不要产生XML示例文件
- -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
-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 -IE:\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中我们需要实现这些虚函数:
这是一种实现方法.
后面的内容继续研究。。。。