代码和更多信息请看:http://bbs.csenn.com:88/thread-65-1-1.html
前言:
做
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://www.onvif.org/type/video_encoder onvif://www.onvif.org/type/audio_encoder onvif://www.onvif.org/hardware/IPC-model onvif://www.onvif.org/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!!!
发现设备了
|
onvif学习4-代码实现
最新推荐文章于 2022-10-20 18:05:49 发布