从零开始精通Onvif之事件处理

2024-06-14 17:04

本文主要是介绍从零开始精通Onvif之事件处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。

概述

        Onvif的事件处理允许IPC等摄像头主动向客户端(比如:NVR、VMS、平台服务等)推送事件通知,比如:运动检测、音频侦测、视频丢失等报警事件。这种模式打破了传统的轮询查询方式,显著降低了延迟,提高了事件响应效率。这些事件的有效处理,不仅关乎系统的安全性,也直接影响到用户的使用体验。

工作机制

        Onvif的事件处理基于订阅-发布模型,通常涉及以下四个重要步骤。

        1、创建订阅。客户端首先向设备发送CreatePullPointSubscription消息,请求订阅特定事件类型。订阅请求中需明确事件过滤条件、期望的事件类型以及回调地址(也就是客户端接收通知的URL)。

        2、确认与配置。设备收到订阅请求后,会验证请求的有效性。同时,确认订阅并返回Subscription ID,此ID用于后续的事件通知关联及订阅管理。

        3、事件触发与通知。一旦设备检测到符合订阅条件的事件,它会构造包含事件详情的Notify消息,并通过HTTP POST请求发送到客户端的回调地址。通知中不仅有事件数据,还包括Subscription ID,确保客户端能识别事件来源。

        4、重订阅与取消订阅。为了维持事件订阅的有效性,客户端需定期发送Renew消息更新订阅。若不再需要某事件通知,可通过发送Unsubscribe消息取消订阅。

创建订阅

        创建订阅是事件处理的第一步,客户端通过发送CreatePullPointSubscription请求来告诉设备它想订阅哪些事件,并提供一个回调地址,以便设备在事件发生时发送通知。

        可以参考下面的示例报文来进行理解,其中的一些关键节点和属性描述如下。

        <tev:CreatePullPointSubscription>:标记着请求的目的,即创建一个基于Pull Point模型的事件订阅。Pull Point模型允许客户端按需(而非实时推送)从服务端拉取事件信息,有助于管理和控制网络流量。

        <tev:InitialTerminationTime>:指定订阅的有效事件,这里是P1D,代表持续1天。也就是说,如果不进行续订,订阅将在一天后自动失效。

        <tev:Filter>:包含了订阅的过滤条件,允许客户端指定感兴趣的事件类型。

        <tev:SubscriptionPolicy>:定义了订阅策略,进一步细化过滤条件。

        <wstop:TopicSet>:包含了订阅的事件主题集合。

        <wstop:Topic>:定义了具体的事件主题,这里使用的方言(Dialect)指向ONVIF的Concrete Set规范,MotionAlarm表示订阅的是移动侦测报警事件。这意味着,客户端只关心与移动检测相关的事件通知。

        <tev:ConsumerReference>:提供了接收事件通知的消费者(客户端)的引用信息。

        <wsa:Address>:表示回调地址。当所订阅的事件被触发时,设备将通过HTTP POST请求向这个地址发送事件通知。开发者需要在此地址部署服务,用于接收并处理这些通知。

  <soapenv:Body><tev:CreatePullPointSubscription><tev:InitialTerminationTime>P1D</tev:InitialTerminationTime><tev:Filter><tev:SubscriptionPolicy><wstop:TopicSet><wstop:Topic Dialect="http://www.onvif.org/ver10/subscription/wsnt/topicExpression/ConcreteSet">MotionAlarm</wstop:Topic></wstop:TopicSet><!-- 其他过滤条件可根据需要添加 --></tev:SubscriptionPolicy></tev:Filter><tev:ConsumerReference><wsa:Address>http://your-callback-url.com/onvif-event-handler</wsa:Address></tev:ConsumerReference></tev:CreatePullPointSubscription></soapenv:Body>

确认与配置

        当客户端发送一个CreatePullPointSubscription请求后,设备将会响应一个确认订阅成功的SOAP报文,其中包含订阅的详细信息,比如:订阅标识符(Subscription ID)、终止时间等。

        在下面的示例报文中,一些关键节点和属性描述如下。

        <tev:SubscriptionReference>:包含了订阅的唯一标识符<wsa:Address>,客户端可以用它来续订、取消订阅,或识别通知消息中的订阅来源。

        <wsnt:TerminationTime>:表示订阅的有效截止时间,客户端应在该时间之前发送续订请求以延长订阅。

  <soapenv:Body><tev:CreatePullPointSubscriptionResponse><tev:SubscriptionReference><wsa:Address>urn:uuid:6f9d210b-2c82-78b2-b8b5-1690da02ee68aba2a5</wsa:Address><wsa:ReferenceParameters><!-- 可选的参考参数 --></wsa:ReferenceParameters></tev:SubscriptionReference><tev:CurrentTime>2024-06-09T16:30:00Z</tev:CurrentTime><wsnt:TerminationTime>2024-06-15T16:30:00Z</wsnt:TerminationTime></tev:CreatePullPointSubscriptionResponse></soapenv:Body>

事件触发与通知

        设备在检测到订阅的事件发生时,会向客户端的回调地址发送Notify消息。

        在下面的示例报文中,一些关键节点和属性描述如下。

        <wsnt:SubscriptionReference>:包含了订阅的唯一标识符,用于识别该通知属于哪个订阅。

        <wsnt:Topic>:表示事件的主题,这里是移动侦测事件。

        <tt:MotionDetectionEvent>:实际的移动侦测事件数据,可能包含事件状态(比如:激活状态)、检测区域(比如:多边形坐标)等信息。

  <soapenv:Body><wsnt:Notify><wsnt:SubscriptionReference><wsa:Address>urn:uuid:subscription-uuid</wsa:Address></wsnt:SubscriptionReference><wsnt:Topic>http://www.onvif.org/ver10/events/wsdl/MotionAlarm</wsnt:Topic><wsnt:ProducerReference><wsa:Address>http://device-ip/onvif/services</wsa:Address></wsnt:ProducerReference><wsnt:Data><!-- 事件的具体数据,根据事件类型不同而变化 --><tt:MotionDetectionEventxmlns:tt="http://www.onvif.org/ver10/schema"><tt:Source><tt:SimpleItem Name="DeviceToken">device-uuid</tt:SimpleItem></tt:Source><tt:Properties><tt:SimpleItem Name="EventState">active</tt:SimpleItem><tt:SimpleItem Name="DetectionRegion"><tt:Polygon><tt:Point X="0.3" Y="0.4"/><tt:Point X="0.6" Y="0.4"/><tt:Point X="0.6" Y="0.8"/><tt:Point X="0.3" Y="0.8"/></tt:Polygon></tt:SimpleItem><!-- 其他可能的属性,如:时间戳、图像等 --></tt:Properties></tt:MotionDetectionEvent></wsnt:Data></wsnt:Notify></soapenv:Body>

重订阅与取消订阅

        为保持订阅有效,客户端需要在订阅到期前发送Renew续订请求。如果客户端不再需要接收事件通知,则应发送Unsubscribe取消订阅请求。

        在下面的示例报文中,<wsa:Address>为Subscription ID,可从CreatePullPointSubscription的响应中获取。

  <soapenv:Body><wsnt:Renew><!-- 新的订阅有效时间 --><wsnt:TerminationTime>P1D</wsnt:TerminationTime><wsnt:SubscriptionReference><!-- Subscription ID --><wsa:Address>urn:uuid:subscription-uuid</wsa:Address></wsnt:SubscriptionReference></wsnt:Renew></soapenv:Body><soapenv:Body><wsnt:Unsubscribe><wsnt:SubscriptionReference><!-- Subscription ID --><wsa:Address>urn:uuid:subscription-uuid</wsa:Address></wsnt:SubscriptionReference></wsnt:Unsubscribe></soapenv:Body>

这篇关于从零开始精通Onvif之事件处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060997

相关文章

JavaScript DOM操作与事件处理方法

《JavaScriptDOM操作与事件处理方法》本文通过一系列代码片段,详细介绍了如何使用JavaScript进行DOM操作、事件处理、属性操作、内容操作、尺寸和位置获取,以及实现简单的动画效果,涵... 目录前言1. 类名操作代码片段代码解析2. 属性操作代码片段代码解析3. 内容操作代码片段代码解析4.

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在,则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型 4.1 数值类型 数值类型 类型大小用途INT4Bytes整数值FLOAT4By

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用

BIRT--商业智能和报表工具,从零开始

1.简介 BIRT (Business Intelligence and Reporting Tools), 是为 Web 应用程序开发的基于 Eclipse 的开源报表系统,特别之处在于它是以 Java 和 JavaEE 为基础。BIRT 有两个主要组件:基于 Eclipse 的报表设计器,以及部署到应用服务器上的运行时组件。 2.下载 官网下载网址:http://download.ec

【Python篇】PyQt5 超详细教程——由入门到精通(终篇)

文章目录 PyQt5超详细教程前言第9部分:菜单栏、工具栏与状态栏9.1 什么是菜单栏、工具栏和状态栏9.2 创建一个简单的菜单栏示例 1:创建带有菜单栏的应用程序代码详解: 9.3 创建工具栏示例 2:创建带有工具栏的应用程序代码详解: 9.4 创建状态栏示例 3:创建带有状态栏的应用程序代码详解: 9.5 菜单栏、工具栏与状态栏的结合示例 4:完整的应用程序界面代码详解: 9.6 总结

【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)

文章目录 PyQt5超详细教程前言第7部分:生成图表与数据可视化7.1 matplotlib 与 PyQt5 的结合7.2 在 PyQt5 中嵌入 matplotlib 图表示例 1:嵌入简单的 matplotlib 图表代码详解: 7.3 动态生成图表示例 2:动态更新图表代码详解: 7.4 在应用程序中展示不同类型的图表示例 3:展示不同类型的图表代码详解: 7.5 总结 第8部分:对话

【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

文章目录 PyQt5 超详细入门级教程前言序篇:1-3部分:PyQt5基础与常用控件第1部分:初识 PyQt5 和安装1.1 什么是 PyQt5?1.2 在 PyCharm 中安装 PyQt51.3 在 PyCharm 中编写第一个 PyQt5 应用程序1.4 代码详细解释1.5 在 PyCharm 中运行程序1.6 常见问题排查1.7 总结 第2部分:创建 PyQt5 应用程序与布局管理2

从零开始学习JVM(七)- StringTable字符串常量池

1 概述 String应该是Java使用最多的类吧,很少有Java程序没有使用到String的。在Java中创建对象是一件挺耗费性能的事,而且我们又经常使用相同的String对象,那么创建这些相同的对象不是白白浪费性能吗。所以就有了StringTable这一特殊的存在,StringTable叫做字符串常量池,用于存放字符串常量,这样当我们使用相同的字符串对象时,就可以直接从StringTable

SpringBoot, SpringCloud 入门精通 最简单的教程

Spring Boot特点 1. 创建独立的Spring应用程序 2. 嵌入的Tomcat,无需部署WAR文件 3. 简化Maven配置 4. 自动配置Spring 5. 提供生产就绪型功能,如指标,健康检查和外部配置 6. 绝对没有代码生成和对XML没有要求配置 废话少说上教程: spring boot(1)-简单搭建 Hello World spring boot简单教程(2)-@Spri

从零开始构建大语言模型并进行微调:全面指南

要从0开始搭建并训练一个大语言模型(LLM),涉及到多个步骤和资源,包括理论理解、工具使用、数据准备、模型训练与微调。以下是一个从基础到应用的指南,帮助你理解并逐步实现这一目标。 1. 理解基础概念 在开始搭建大语言模型之前,了解以下基本概念至关重要: 生成式AI:通过大语言模型生成自然语言文本,例如GPT、BERT等。机器学习:通过数据训练模型,使其具备从数据中学习规律的能力。深度学习:机