zoukankan      html  css  js  c++  java
  • 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文件):

    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/^	*(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月


        毕业那两年在做嵌入式应用开发,主要是单片机和arm linux上的应用开发,后来又做了两年arm linux驱动开发,15年到现在在做pc端及嵌入式端开发,包括服务器系统裁剪、底层框架实现、硬件加速等。喜欢技术分享、交流!联系方式: 907882971@qq.com、rongpmcu@gmail.com

  • 相关阅读:
    java LinkedHashSet
    java hashcode,equals方法必须重写
    java Set ,HashSet
    java ArrayList嵌套ArrayList
    java 基本数据类型数组与集合之间相互转换
    java 可变参数 和 静态导入
    java 三种迭代 删除元素
    java 泛型的通配符
    java 泛型接口
    java 泛型类,泛型方法
  • 原文地址:https://www.cnblogs.com/rongpmcu/p/7662236.html
Copyright © 2011-2022 走看看