onvif开发笔记_2

〇、主要步骤总览

安装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放入同一目录

onvif开发笔记_2

然后执行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这个开源组件的骨*分了。

onvif开发笔记_2

最后我们根据项目需求再去做后续的开发,在之后的工作里我们需要编写并调试Makefile来让gcc/g++能找到项目里的c/cpp依赖的头文件。另外,难免遇到有些结构体等未定义(全工程都没有)的情况,就需要尝试根据已有代码猜测原本该结构体的定义。之后的开发工作会在linux进行。

 

 

 

上一篇:ONVIF协议云台服务规范(三)-移动操作 ONVIF PTZ Service Specification-Move Operations


下一篇:Qt音视频开发31-Onvif抓拍图片