onvif实现
前言
负责开发了公司的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月
onvif实现的更多相关文章
- Atitit onvif协议获取rtsp地址播放java语言 attilx总结
Atitit onvif协议获取rtsp地址播放java语言 attilx总结 1.1. 获取rtsp地址的算法与流程1 1.2. Onvif摄像头的发现,ws的发现机制,使用xcf类库1 2. 调用 ...
- Atitit onvif 协议截图 getSnapshotUri 使用java
Atitit onvif 协议截图 getSnapshotUri 使用java 1.1. ONVIF Device Test Tool1 1.2. 源码2 1.3. 直接浏览器访问http://192 ...
- Atitit java onvif 开源类库 getProfiles getStreamUri
Atitit java onvif 开源类库 getProfiles getStreamUri 1. ONVIF Java Library by Milgo1 1.1. https://github. ...
- Atitti onvif 设备发现与原理
Atitti onvif 设备发现与原理 1.1. ,有以下几个步骤:1 1.2. 设备搜索原理及编程技巧:2 1.3. Ws disconvert 的组播地址和端口就是37022 1)发现ipca ...
- Onvif设备Rtsp地址解析和播放
今天把Onvif搜索以及Rtsp流这一块的功能集成了下, 主要包含以下功能: 1. onvif设备的搜索 2. 设备rtsp地址的解析 3. Rtsp流的播放 4. 建立Rtsp流服务器, 使用vlc ...
- gsoap框架下的onvif程序流程分析
SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap *soap) { do { unsigned int k = soap->max_keep_al ...
- [Client]动检参数讨论与ONVIF
[问题]客户端访问ONVIF设备动检 客户端要访问ONVIF设备(IPC)的动检,一是事件,二是设置: 此处就是讨论如何设置动检区域的. 通过Video Analytics/Cell Motion D ...
- gSoap实现ONVIF中xsd__anyType到具体结构类型的转换
上一篇文章已经粗略计划要讨论gsoap关于序列化/解析编程. 本文则阐述一下关于gsoap生成代码的一些重要特征方法及使用.如题,下我们从ONVIF生成的C码中,挑选简单的一个类型来试验一下与xsd_ ...
- 使用gSoap规避和修改ONVIF标准类型结构的解析
ONVIF/gSoap依赖关系及问题 ONVIF是一组服务规范,标准参考 gSoap是一套基于实现SOAP通信接口的工具链 即是,当我们需要访问ONVIF的Web Service或实现对ONVIF部分 ...
- ONVIF Event消息解析(How to work with gSoap)
Prepare Requirements ONVIF Event gSoap reference ONVIF Specification 问题描述 Event是ONVIF核心规范中一块, 文档解释了如 ...
随机推荐
- C计算了一下
#include <stdio.h> int main(){ int a,b,c,e; a=6 + 5 / 4 - 2; b=2 + 2 * (2 * 2 - 2) % 2 / 3; c= ...
- ethday04复杂的智能合约
复杂的智能合约部署和测试 server--database 客户端服务器数据库模式 以太坊dapp应用程序结构 server --- client 模式 server -- database 传统模式 ...
- HDU 4722 Good Numbers(位数DP)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)
Description If we sum up every digit of a number and the result can be exactly divided by 10, we say ...
- BufferedInputStream/BufferedOutputStream
BufferedInputStream: public synchronized int read() throws IOException int res=bis.read(); System.ou ...
- nopcommerce商城系统--开发者常遇问题清单
原址:http://www.nopcommerce.com/docs/74/frequently-asked-development-questions.aspx 以下是开发者常见问题的清单.也介绍了 ...
- lintcode-130-堆化
130-堆化 给出一个整数数组,堆化操作就是把它变成一个最小堆数组. 对于堆数组A,A[0]是堆的根,并对于每个A[i],A [i * 2 + 1]是A[i]的左儿子并且A[i * 2 + 2]是A[ ...
- systemtap没找到函数变量
为啥systemtap没找到函数 hon@station6:~/codebox/stap/net$ sudo stap -L 'kernel.function("sock_recvmsg_n ...
- js阻止冒泡事件和默认事件的方法
阻止默认事件 function stopDeFault(e){ if(e&&e.preventDefault){//非IE e.preventDefault(); }else{//IE ...
- java生成唯一的id编号
GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...
- BZOJ 3262: 陌上花开 CDQ
这个题大部分人用了离散然后水之,然而.....作为一只蒟蒻我并没有想到离散,而是直接拿两个区间一个对应n,一个对应k来搞,当然这两个区间是对应的,我把第一维排序,第二维CDQ,第三维树状数组,然而由于 ...