一、使用gSOAP工具,根据onvif的wsdl生成onvif代码框架
1、根据onvif官网提供的remotediscovery.wsdl产生onvif.h头文件
wsdl2h -o onvif.h -c -s -t ./typemap.dat
http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl
2、使用onvif.h来产生骨架代码
soapcpp2 -c onvif.h -x -I ../../gsoap/import -I ../../gsoap/
第二步执行时,会产生如下错误:
Critical error: #inport: Cannot open file "ns1.h" for reading.
错误原因是onvif.h里有如下代码
#import "ns1.h" // ns1 = <http://www.w3.org/2005/08/addressing>
如果通过下面方式避免这个问题:
根据wsdl生成头文件时,加1个xsd文件
wsdl2h -o onvif.h -c -s -t ./typemap.dat
http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl
http://www.w3.org/2006/03/addressing/ws-addr.xsd
会导致生成的文件在工程中编译不过去。
soap_default_SOAP_ENV__Header重复等错误。
所以此问题的根本原因是typemap.dat使用的不正确。
gsoap_2.8.18中gsoap-2.8\gsoap\typemap.dat,ONVIF的那些配置都已经加进去了。
直接使用即可。不需要做任何修改。之前的版本,如果没有那些配置,要在现有typemap.dat的基础上增加。
将277行int SOAP_ENV__Fault修改为int SOAP_ENV__Fault_Ex
笔者没有使用这种方法,是将这个结构体直接注释的方式,最后的结果是,都可以使用。
即:添加对openssl的支持,在上一步生成的onvif.h中添加(可选)