gsoap2.8.11实现onvif discover详细教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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@