gsoap2.8.11实现onvif discover详细教程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

感谢

以下教程基本是(沙漠之鸽)给予我的指导的整理而来,他非常耐心的提供了帮助,也是受于他的分享精神,所以写下了这遍教程。

前言:

做onvif的过程十分痛苦,什么wsdl,soap,webserver,全部都是没有接触过的,还好有gsoap可以用,在网上和群共享里面只有2.8.3版本实现过程,而且比较麻烦的是要自己实现probe所有细节。

在2.8.11中,wsddapi插件为我们设计好了wsdd的接口,我们要做的就是填充brobe的matches信息就可以了。简化了开发过程,也不必用高手们做的typemap 文件,因为这些看不懂的文件让我们对做出的程序毫无信心。

生成.h文件。

我们需要从onvif官网下载wsdl文件,和onvif.xsd文件。然后生成.h文件

wsdl2h -sck -t /opt/nfshost/gsoap-2.8/gsoap/typemap.dat -o onvif.h

analytics.wsdl analyticsdevice.wsdl devicemgmt.wsdl display.wsdl event.wsdl imaging.wsdl media.wsdl ptz.wsdl receiver.wsdl recording.wsdl

remotediscovery.wsdl replay.wsdl search.wsdl deviceio.wsdl

这一步你会发现生成速度非常慢,还会提示找不到onvif.xsd,速度慢得原因是wsdl2h会根据wsdl中引用去网上下载一下xsd和wsdl文件,我们可以将这些文件下载到本地,然后修改wsdl中的路径。

修改之前schemaLocation是一个url,如果你放的和你onvif的wsdl文件相同的目录中,这样写就ok了,如果不是,可以写上相对路径。

修改生成的onvif.h文件

增加一句#import "wsse.h",用于身份验证,具体怎么用还不知道。求帮助

生成代码

soapcpp2 -2 -L -c -x -d ../ -I /opt/nfshost/gsoap-2.8/gsoap:/opt/nfshost/gsoap-

2.8/gsoap/import/:/opt/nfshost/gsoap-2.8/gsoap/custom/ onvif.h

生成的过程中会出现SOAP_ENV__Fault重复定义,注视掉wsa5.h中得内容就行了

好了,我们的代码已经生成。

每个文件具体作用请见查看文档。、

将plugin中得文件拷贝到工程、

gsoap/dom.c

gsoap/stdsoap2.c

gsoap/stdsoap2.h

gsoap/custom/duration.c

gsoap/plugin/mecevp.c

gsoap/plugin/mecevp.h

gsoap/plugin/smdevp.c

gsoap/plugin/smdevp.h

gsoap/plugin/threads.c

gsoap/plugin/threads.h

gsoap/plugin/wsaapi.c

gsoap/plugin/wsaapi.h

gsoap/plugin/wsseapi.c

gsoap/plugin/wsseapi.h

gsoap/plugin/wsddapi.c

gsoap/plugin/ wsddapi.h

现在我们的webserver中有了这些文件了。

实现接口

Gsoap在soapStub.h中为我们定义了的函数,我们必须要实现,当然不是要一下子写完,你可以写个空的函数,新建一个c文件,将函数实现。

记住一点,WSDD域的方法已经在wsddapi实现。__wsdd_开头的函数不需要实现。

Wsddapi需要你实现一些event接口。这个接口是以上函数用来获取信息的,只要将信息填充就可以了。

我的probe是这样实现的,当然是最初步的实验,没有信息获取过程

soap_wsdd_init_ProbeMatches(soap,matches);

soap_wsdd_add_ProbeMatch(soap,matches,

"urn:uuid:464A4854-4656-5242-4530-313035394100",

"dn:NetworkVideoTransmitter",

"onvif:///type/video_encoder

onvif:///type/audio_encoder onvif:///hardware/IPC-model onvif:///name/IPC-model",

NULL,

"http://192.168.20.143/onvif/device_service",1);

以上两行就可以实现probe,是不是很easy啊。

Wsddapi文件此时还是编译不过去的,因为默认使用的是wsa5,而wsdd定义的是wsa,所以我们修改soapStu.h

注释掉soap_wsa_2005,此时,我们的webserver可以编译通过了。

监听组播信息

当然,我们还需要监听组播消息。我们此时调用wsaapi中得listen方法就可以了。

编译

做完以上的内容,我们的onvif框架已经完成,现在开始编译咯

编译的时候记得加上一下参数

-DWITH_OPENSSL -DWITH_DOM –DDEBUG

Run!!!

发现设备了

洪子,2012/11/8

whtc123@

相关文档
最新文档