前言

  负责开发了公司的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文件):

  1. 执行下面命令,它会根据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
  1. 执行下面命令,它会根据之前生成的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的实现主要有如下几个线程构成,每个线程负责相应的模块

  1. 主线程,负责启动其他线程后,阻塞等待退出事件
  2. 探测监听线程,负责监听组播上的probe包,然后响应onvif交互的监听地址。
  3. 信令监听线程,负责信令交互,所有的命令处理(除事件相关的)都是通过该线程处理的
  4. 日志管理线程,负责在配置更新的时候,同步配置到本地(设备flash)上
  5. 事件管理线程,负责将本地的事件转为通知发送给订阅者,该线程只在有订阅事件的时候才会运行起来。
  6. 订阅管理线程,负责处理订阅相关的命令, 该线程只在有订阅事件的时候才会运行起来。

事件模块支持主题过滤和消息内容过滤,但是消息内容过滤暂时只针对格式过滤格式进行分析(验证) 上传事件时不进行实际的过滤

暂时未实现的功能

用户验证 :不难实现,只是暂时没这个需求

用户信息获取 :更加不难实现,只是暂时没这个需求

完!

2013年8月

onvif实现的更多相关文章

  1. Atitit onvif协议获取rtsp地址播放java语言 attilx总结

    Atitit onvif协议获取rtsp地址播放java语言 attilx总结 1.1. 获取rtsp地址的算法与流程1 1.2. Onvif摄像头的发现,ws的发现机制,使用xcf类库1 2. 调用 ...

  2. Atitit onvif 协议截图 getSnapshotUri 使用java

    Atitit onvif 协议截图 getSnapshotUri 使用java 1.1. ONVIF Device Test Tool1 1.2. 源码2 1.3. 直接浏览器访问http://192 ...

  3. Atitit java onvif 开源类库 getProfiles getStreamUri

    Atitit java onvif 开源类库 getProfiles getStreamUri 1. ONVIF Java Library by Milgo1 1.1. https://github. ...

  4. Atitti  onvif 设备发现与原理

    Atitti  onvif 设备发现与原理 1.1. ,有以下几个步骤:1 1.2. 设备搜索原理及编程技巧:2 1.3. Ws disconvert 的组播地址和端口就是37022 1)发现ipca ...

  5. Onvif设备Rtsp地址解析和播放

    今天把Onvif搜索以及Rtsp流这一块的功能集成了下, 主要包含以下功能: 1. onvif设备的搜索 2. 设备rtsp地址的解析 3. Rtsp流的播放 4. 建立Rtsp流服务器, 使用vlc ...

  6. gsoap框架下的onvif程序流程分析

    SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap *soap) { do { unsigned int k = soap->max_keep_al ...

  7. [Client]动检参数讨论与ONVIF

    [问题]客户端访问ONVIF设备动检 客户端要访问ONVIF设备(IPC)的动检,一是事件,二是设置: 此处就是讨论如何设置动检区域的. 通过Video Analytics/Cell Motion D ...

  8. gSoap实现ONVIF中xsd__anyType到具体结构类型的转换

    上一篇文章已经粗略计划要讨论gsoap关于序列化/解析编程. 本文则阐述一下关于gsoap生成代码的一些重要特征方法及使用.如题,下我们从ONVIF生成的C码中,挑选简单的一个类型来试验一下与xsd_ ...

  9. 使用gSoap规避和修改ONVIF标准类型结构的解析

    ONVIF/gSoap依赖关系及问题 ONVIF是一组服务规范,标准参考 gSoap是一套基于实现SOAP通信接口的工具链 即是,当我们需要访问ONVIF的Web Service或实现对ONVIF部分 ...

  10. ONVIF Event消息解析(How to work with gSoap)

    Prepare Requirements ONVIF Event gSoap reference ONVIF Specification 问题描述 Event是ONVIF核心规范中一块, 文档解释了如 ...

随机推荐

  1. 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= ...

  2. ethday04复杂的智能合约

    复杂的智能合约部署和测试 server--database 客户端服务器数据库模式 以太坊dapp应用程序结构 server --- client 模式 server -- database 传统模式 ...

  3. 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 ...

  4. BufferedInputStream/BufferedOutputStream

    BufferedInputStream: public synchronized int read() throws IOException int res=bis.read(); System.ou ...

  5. nopcommerce商城系统--开发者常遇问题清单

    原址:http://www.nopcommerce.com/docs/74/frequently-asked-development-questions.aspx 以下是开发者常见问题的清单.也介绍了 ...

  6. lintcode-130-堆化

    130-堆化 给出一个整数数组,堆化操作就是把它变成一个最小堆数组. 对于堆数组A,A[0]是堆的根,并对于每个A[i],A [i * 2 + 1]是A[i]的左儿子并且A[i * 2 + 2]是A[ ...

  7. systemtap没找到函数变量

    为啥systemtap没找到函数 hon@station6:~/codebox/stap/net$ sudo stap -L 'kernel.function("sock_recvmsg_n ...

  8. js阻止冒泡事件和默认事件的方法

    阻止默认事件 function stopDeFault(e){ if(e&&e.preventDefault){//非IE e.preventDefault(); }else{//IE ...

  9. java生成唯一的id编号

    GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...

  10. BZOJ 3262: 陌上花开 CDQ

    这个题大部分人用了离散然后水之,然而.....作为一只蒟蒻我并没有想到离散,而是直接拿两个区间一个对应n,一个对应k来搞,当然这两个区间是对应的,我把第一维排序,第二维CDQ,第三维树状数组,然而由于 ...