〇、主要步骤总览
安装gsoap --> 下载wsdl文件和xsd文件 --> 生成onvif.h --> 生成相关源文件
一、安装gsoap
gSOAP是什么:在向Web Service发送的SOAP请求中,Body元素中的字段需与WSDL中数据类型的相符合。在构建SOAP的过程中,必须从WSDL文件中获取并映射这一种对应关系。然而这样一个对应过程将是充满了重复性和机械性的,为了避免不必要的人工差错以及节约开发时间,一个名为gSOAP的编译工具应运而生。gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。通过将WSDL文件解析序列化为C/C++文件,最小化了Web Service的开发过程。
gSOAP下载地址 https://www.genivia.com/products.html
本文下载的gSOAP版本为2.8.112
下载后解压即可
目前来看,我们仅用到gSOAP中的两个工具:位于gsoap_2.8.112\gsoap-2.8\gsoap\bin下的wsdl2h.exe和soapcpp2.exe。前者可以从名称看出它的作用,根据wsdl文件生成h文件;后者的作用是根据h文件生成一系列的框架文件。后续步骤会介绍如何使用。
二、下载wsdl文件和xsd文件
Wsdl文件是什么:WSDL 指网络服务描述语言 (Web Services Description Language)。WSDL 是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操作(或方法)。
Xsd文件是什么:XSD(XML Schema Definition),XML Schema 定义也称作XML Schema 语言是基于 XML 的 DTD 替代者,描述 XML 文档的结构。
Wsdl文件下载:
在页面右键另存为即可下载 wsdl文件
http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl
http://www.onvif.org/onvif/ver10/events/wsdl/event.wsdl
http://www.onvif.org/onvif/ver10/display.wsdl
http://www.onvif.org/onvif/ver10/deviceio.wsdl
http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
http://www.onvif.org/onvif/ver10/receiver.wsdl
http://www.onvif.org/onvif/ver10/recording.wsdl
http://www.onvif.org/onvif/ver10/search.wsdl
http://www.onvif.org/onvif/ver10/replay.wsdl
http://www.onvif.org/onvif/ver10/thermal/wsdl/thermal.wsdl
http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl
http://www.onvif.org/onvif/ver10/schema/onvif.xsd
http://www.onvif.org/ver10/actionengine.wsdl
http://www.onvif.org/ver10/pacs/accesscontrol.wsdl
http://www.onvif.org/ver10/pacs/doorcontrol.wsdl
http://www.onvif.org/ver10/advancedsecurity/wsdl/advancedsecurity.wsdl
http://www.onvif.org/ver10/accessrules/wsdl/accessrules.wsdl
http://www.onvif.org/ver10/credential/wsdl/credential.wsdl
http://www.onvif.org/ver10/schedule/wsdl/schedule.wsdl
http://www.onvif.org/ver10/pacs/types.xsd
http://www.onvif.org/onvif/ver10/analytics/wsdl/analytics.wsdl
http://www.onvif.org/onvif/ver10/imaging/wsdl/imaging.wsdl
http://www.onvif.org/onvif/ver10/ptz/wsdl/ptz.wsdl
http://www.onvif.org/onvif/ver10/topics/topicns.xml
xsd文件下载:
每个wsdl的头部的import标签中的schemaLocation的值即为这个wsdl文件需要的xsd文件地址,下载到本地后将这个值改为xsd文件的本地地址即可。
其实你需要用onvif实现什么功能你就去下载对应的wsdl文件就好,但注意要同时下载它所依赖的其他文件,在它的import标签里会告诉你依赖的文件。下好了记得看一眼这些文件里import标签里的地址,一定改成本地地址因为我们都是下载到本地的。上面的链接没有包含这些依赖文件(wsdl或者xsd什么的)。
三、生成onvif.h
搞定了上面步骤后就可以生成onvif.h啦。将下载好的wsdl文件和xsd文件放入同一目录,将wsdl2h.exe(\ gsoap_2.8.112\gsoap-2.8\gsoap\bin\win64)和typemap.dat(\gsoap_2.8.112\gsoap-2.8\gsoap)也放入这个目录。在这个目录下执行cmd命令:
.\wsdl2h.exe -c -s -t typemap.dat -o onvif.h accesscontrol.wsdl accessrules.wsdl actionengine.wsdl advancedsecurity.wsdl analytics.wsdl analyticsdevice.wsdl credential.wsdl deviceio.wsdl devicemgmt.wsdl display.wsdl doorcontrol.wsdl event.wsdl imaging.wsdl media.wsdl ptz.wsdl receiver.wsdl recording.wsdl replay.wsdl schedule.wsdl search.wsdl thermal.wsdl
wsdl2h.exe的选项有很多就不累述了,网上可以查到不同选项的作用,我这里用到了-c:产生纯c代码(无cpp),-s:不使用STL代码,-t filename:指定dat文件,如果没有这个选项会默认为typemap.dat,-o filename:指定输出文件。
执行完毕后可以看到当前目录中生成了onvif.h
四、生成相关源文件
在生成代码之前,需要根据项目具体需求在onvif.h里import其他的源文件,我在这里import了wsdd.h和WS-Header.h
#import "wsdd.h"
#import "WS-Header.h"
然后将\gsoap_2.8.112\gsoap-2.8\gsoap下的custom目录和import目录、刚才生成的onvif.h、\ gsoap_2.8.112\gsoap-2.8\gsoap\bin\win64下的soapcpp2.exe放入同一目录
然后执行cmd命令:
.\soapcpp2.exe -2 -c -x onvif.h -I import
-2:使用SOAP 1.2进行编译,-c:产生纯c代码(无cpp),-x:不生成XML,-I(大写i) filename:链接filename里面的文件
可以看到生成了一堆c文件和h文件和nsmap文件(所有nsmap文件内容都是一样的)。
五、构建项目
步骤四中目录下的soapC.c、soapClient.c、soapH.h、soapStub.h、wsdd.nsmap和\gsoap_2.8.112\gsoap-2.8\gsoap下的stdsoap2.c、stdsoap2.h和\custom下的duration.c、duration.h基本上就是onvif这个开源组件的骨*分了。
最后我们根据项目需求再去做后续的开发,在之后的工作里我们需要编写并调试Makefile来让gcc/g++能找到项目里的c/cpp依赖的头文件。另外,难免遇到有些结构体等未定义(全工程都没有)的情况,就需要尝试根据已有代码猜测原本该结构体的定义。之后的开发工作会在linux进行。