前言
负责开发了公司的onvif,一个人从0开始写的,花了两个月 !!!下面是我的总结。
onvif介绍
ONVIF[Open Network Video Interface Forum](开放型网络视频接口论坛)是Axis Communications、Bosch Security Systems 及 Sony Corporation三家公司,于2008年5月对外宣示,将致力发展网路影像产品介面标准的构想,其主要目标在于促进不同品牌网路影像设备间的整合,并帮助生产制造商、软体开发商及独立软体供应商确保产品的可互通性,可以说是目前IP CAM的主流标准之一(其它标准如HDCCTV、PSIA)。
官方网站: http://www.onvif.org/
ONVIF规范描述了网络视频的模型、接口、数据类型以及数据交互的模式。并复用了一些现有的标准,如WS系列标准等。ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。ONVIF规范涵盖了完全的XML及WSDL的定义。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。服务端与客户端的数据交互采用SOAP协议。
从技术上说,ONVIF就是规定了一套安防中用于客户端和IPC设备之间交互的数据包格式,该格式不局限于操作系统及编程语言。
下面分别简单的说明下ONVIF涉及到的一些技术的概念:
WebServices
WSDL
XML
SOAP
WebServices
是应用程序组件
使用开放协议进行通信
是独立的(self-contained)并可自我描述
可通过使用UDDI来发现
可被其他应用程序使用
XML 是 Web Services 的基础
WSDL
指网络服务描述语言
使用 XML 编写
是一种 XML 文档
用于描述网络服务
也可用于定位网络服务
还不是 W3C 标准
WSDL是“Web Services Description Language”的缩写。是基于XML的用来描述 Web services的消息格式和协议的细节。当你实现了某种服务的时候(如,股票查询服务),为了让别的程序调用,你必须告诉大家你的服务的接口.例如,服务名称,服务所在的机器名称,监听端口号,传递参数的类型,个数和顺序,返回结果的类型等等.这样别的应用程序才能调用你的服务。WSDL协议就是规定了有关WebServices描述的标准。
XML
指可扩展标记语言(EXtensible Markup Language)
是一种标记语言,很类似 HTML
设计宗旨是传输数据,而非显示数据
标签没有被预定义。您需要自行定义标签。
被设计为具有自我描述性。
是 W3C 的推荐标准
SOAP
指简易对象访问协议
是一种通信协议
用于应用程序之间的通信
是一种用于发送消息的格式
被设计用来通过因特网进行通信
独立于平台
独立于语言
基于 XML
很简单并可扩展
允许您绕过防火墙
将被作为 W3C 标准来发展
Onvif开发环境搭建
根据ONVIF官方网站上发布的WSDL文件,我们可以通过WSDL工具将它们转成.h的文件用于我们的程序中(WSDL工具采用Gsoap,Gsoap最好采用2.8.6版本,因为最新版的2.8.9会出一些问题)。于是,执行如下步骤(先从官网下载所有的wsdl文件):
- 执行下面命令,它会根据wsdl文件夹里面的wsdl文件,在wsdl文件夹里面生成一个nvt.h文件,这一步会关联../gsoap-2.8/gsoap/WS/WS-typemap.dat文件,WS-typemap.dat文件已经针对原始的文件做了修改
cd wsdl; ../gsoap-2.8/gsoap/bin/linux386/wsdl2h -sck -t ../gsoap-2.8/gsoap/WS/WS-typemap.dat -o nvt.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 actionengine.wsdl && sed -i /'#import "wsa5.h"'/a'#import "wsse.h"' nvt.h
- 执行下面命令,它会根据之前生成的h文件在output文件夹里面生成onvif开发所需的c和h文件(实际上就是实现soap消息的c代码等)。这样之后就生成了开发onvif所需的代码了
cd wsdl; ../gsoap-2.8/gsoap/bin/linux386/soapcpp2 -2 -L -x -c nvt.h -I ../gsoap-2.8/gsoap/import:../gsoap-2.8/gsoap/custom -d ../output/
sed -i 's/^\t*\(soap->error = .*\)/\/\/rongp\/\/\1/g' ../output/soapServer.c
官网链接:http://www.onvif.org/Documents/Specifications.aspx
Gsoap下载的也是当前最高版本2.8.9
链接: http://gsoap2.sourceforge.net/
onvif实现
现在(13/07/31)onvif的实现主要有如下几个线程构成,每个线程负责相应的模块
- 主线程,负责启动其他线程后,阻塞等待退出事件
- 探测监听线程,负责监听组播上的probe包,然后响应onvif交互的监听地址。
- 信令监听线程,负责信令交互,所有的命令处理(除事件相关的)都是通过该线程处理的
- 日志管理线程,负责在配置更新的时候,同步配置到本地(设备flash)上
- 事件管理线程,负责将本地的事件转为通知发送给订阅者,该线程只在有订阅事件的时候才会运行起来。
- 订阅管理线程,负责处理订阅相关的命令, 该线程只在有订阅事件的时候才会运行起来。
事件模块支持主题过滤和消息内容过滤,但是消息内容过滤暂时只针对格式过滤格式进行分析(验证) 上传事件时不进行实际的过滤
暂时未实现的功能
用户验证 :不难实现,只是暂时没这个需求
用户信息获取 :更加不难实现,只是暂时没这个需求
完!
2013年8月