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核心规范中一块, 文档解释了如 ...
随机推荐
- String 将GBK转UTF-8
public void transfer(String xml) throws Exception { return new String(xml.getBytes("gbk"), ...
- 1107 Social Clusters (30 分)(并查集)
并查集的基本应用 #include<bits/stdc++.h> using namespace std; ; vector<int>vec[N]; int p[N]; con ...
- LeetCode - 67. Add Binary(4ms)
Given two binary strings, return their sum (also a binary string). The input strings are both non-em ...
- day-9 sklearn库和python自带库实现最近邻KNN算法
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的 ...
- Python图像全屏显示
需要在嵌入式设备上全屏显示图像,使用pil显示图像时,只能通过系统的图像浏览器显示.所以使用Python自带的tkinter import Tkinter as tk 这句在Python3中已经改 ...
- 关于ubuntu上无法运行cmd markdown
环境:ubuntu18.04 直接解压完的cmd markdown,直接点击可执行文件运行,没有反应,在通过终端运行,提示:Cannot find required executable ifconf ...
- 结对作业 -GUI四则运算
目录: 一.前言(及项目地址) 二.PSP(planning) 三.结对编程中对接口的设计 四.计算模块接口的设计与实现过程 五.计算模块接口部分的性能改进 六.计算模块部分单元测试展示 七.计算模块 ...
- 【EasyNetQ】- 简介
EasyNetQ是一个简单易用的,稳定的的RabbitMQ .NET API . 如果您只想尽快启动并运行,请转到“ 快速开始”指南. EasyNetQ的目标是提供一个库,使得在.NET中使用Rabb ...
- spring中context:property-placeholder
发现网上对于这个标签的解释过于复杂,这里从实用性角度简短的进行说明. 首先,它是spring3中提供的标签. 只需要在spring的配置文件里添加一句: <context:property-pl ...
- python实现关联规则
代码中Ci表示候选频繁i项集,Li表示符合条件的频繁i项集 # coding=utf-8 def createC1(dataSet): # 构建所有1项候选项集的集合 C1 = [] for tran ...