从零开始精通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

相关文章

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

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 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用