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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈Web开发的三大主流框架:Angular、React和Vue.js

在现代Web开发领域&#xff0c;Angular、React和Vue.js作为三大主流前端框架&#xff0c;各自拥有独特的特点和优势&#xff0c;为开发者提供丰富的选择。让我们更深入地了解这三大框架&#xff0c;并通过一些小型样例来展示它们的特性。 Angular Angular是一个完整的前端框架…

万字长文讲解如何快速搭建一个Spring Cloud项目

文章目录 概念基本概念微服务七大组件 初始化Maven父工程整合注册中心组件整合远程调用与负载均衡组件组件整合网关组件整合配置中心组件以gateway模块为例 整合分布式事务组件操作数据库模拟创建订单和扣减库存整合Seata 整合熔断降级组件整合链路追踪组件源码地址参考来源 概…

Python库

Python库 babel huey 图片视频处理 moviepy 一个用于视频编辑的Python模块,可用于进行视频的基本操作(如剪切、连接、标题插入)、视频合成(也称非线性编辑)、视频处理或创建高级效果 patchworklib 一个专注于图像拼接和合成的Python库 patchworklib 一个专注与图…

鸿蒙 如何将base64的图片保存到相册

把一个base64图片 保存到鸿蒙手机 相册中怎么实现呢&#xff1f; 下面有2中方法 方案一&#xff1a;可以通过安全控件「保存控件&#xff08;SaveButton&#xff09;」实现。该控件对应媒体库写入特权。应用集成保存控件后&#xff0c;用户点击该控件&#xff0c;应用会获取1…

CI/CD实战面试宝典:从构建到高可用性的全面解析

实战部署与配置 请描述你设计和实现的一个CI/CD pipeline的完整流程&#xff0c;包括构建、测试、部署各个阶段。 我设计的CI/CD pipeline通常包括以下几个阶段&#xff1a; 代码提交&#xff1a;开发人员将代码提交到Git仓库&#xff0c;触发CI/CD流程。代码检查&#xff1…

【区分vue2和vue3下的element UI Transfer 穿梭框组件,分别详细介绍属性,事件,方法如何使用,并举例】

Element UI 是为 Vue 2 设计的&#xff0c;而 Element Plus 是 Element UI 的 Vue 3 版本。在这两个版本中&#xff0c;Transfer 穿梭框组件&#xff08;如果有的话&#xff09;的 API 和使用方式可能会有所不同。以下是根据我对这两个版本组件的了解&#xff0c;对 Vue 2 的 E…

springcloud gateway转发websocket请求的404问题定位

一、问题 前端小程序通过springcloud gateway接入并访问后端的诸多微服务&#xff0c;几十个微服务相关功能均正常&#xff0c;只有小程序到后端推送服务的websocket连接建立不起来&#xff0c;使用whireshark抓包&#xff0c;发现在小程序通过 GET ws://192.168.6.100:8888/w…

持续总结中!2024年面试必问 20 道并发编程面试题(六)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道并发编程面试题&#xff08;五&#xff09;-CSDN博客 十一、什么是信号量&#xff08;Semaphore&#xff09;&#xff1f; 信号量是一种并发编程中使用的同步机制&#xff0c;用于控制对共享资源的访问。它…

Robot Operating System (ROS)中,发布与订阅

在Robot Operating System (ROS)中&#xff0c;发布与订阅是一种基于主题的异步消息传递机制&#xff0c;用于节点间的通信。ROS的设计是围绕着这一概念&#xff0c;它允许不同节点之间解耦&#xff0c;每个节点专注于自己的任务&#xff0c;通过发布和订阅消息来与其他节点交互…

计算机体系结构重点学习

从外部I/O与上层应用交互的整体软硬件过程 上层应用发出I/O请求&#xff1a;上层应用程序&#xff0c;如一个文本编辑器、网络浏览器或者任何软件应用&#xff0c;需要读取或写入数据时&#xff0c;会通过调用操作系统提供的API&#xff08;如文件操作API、网络操作API等&…

SpringBoot之请求映射原理

前言 我们发出的请求&#xff0c;SpringMVC是如何精准定位到那个Controller以及具体方法&#xff1f;其实这都是 HandlerMapping 发挥的作用&#xff0c;这篇博文我们以 RequestMappingHandlerMapping 为例并结合源码一步步进行分析。 定义HandlerMapping 默认 HandlerMappi…

赶紧收藏!2024 年最常见 20道并发编程面试题(五)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道并发编程面试题&#xff08;四&#xff09;-CSDN博客 九、什么是信号量&#xff08;Semaphores&#xff09;&#xff1f; 信号量&#xff08;Semaphores&#xff09;是一种用于控制多个线程或进程对共享资源访问…

Docker部署常见应用之桌面版系统ubuntu-desktop

文章目录 ubuntu-desktop 简介ubuntu-desktop 部署参考文章 ubuntu-desktop 简介 colinchang/ubuntu-desktop 是一个Docker镜像&#xff0c;基于KasmWeb⁠的 Ubuntu 22.04 桌面版&#xff08;Web&#xff09; Docker Image。镜像替换了阿里云Ubuntu Jammy镜像源&#xff0c;安…

0074__Microsoft Typography documentation

Microsoft Typography documentation - Typography | Microsoft Learn

重生之 SpringBoot3 入门保姆级学习(21、场景整合 Redis 定制对象序列化存储)

重生之 SpringBoot3 入门保姆级学习&#xff08;21、场景整合 Redis 定制对象序列化存储&#xff09; 6.4 定制化 6.4 定制化 需求&#xff1a;保存一个 Person 对象到 redis 创建 Person 类 package com.zhong.redis.entity;import lombok.AllArgsConstructor; import lombok…

HTML5网页成品(普洱茶购买)

1.完整代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title> <style> .span{border: 1px solid #BCB9B9;margin: 2px 5px;color: #6B76EF} </style> </head> …

浅谈C++基本框架内涵及其学习路线

目录 一.C的内涵本质 1. 面向对象编程&#xff08;OOP&#xff09; 2. 低级控制 3. 模板编程 4. 标准库&#xff08;STL&#xff09; 5. 多范式支持 二.学习路线 1. 基础阶段 C基础语法 函数 数组和指针 2. 面向对象编程 类和对象 继承和多态 运算符重载 3. 高级…

JS 【算法】二分查找

使用场景 在有序数组中查找目标元素 const arr [1, 2, 3, 4, 5, 6, 7, 8, 9] const target 2 console.log(binarySearch1(arr, target)) console.log(binarySearch2(arr, target))循环实现 function binarySearch1(arr, target) {const length arr.lengthif (length 0) re…

Mysql的基础命令有哪些?

MySQL的基础命令主要涵盖了连接数据库、操作数据库、操作表、插入数据、查询数据等多个方面。以下是对这些基础命令的清晰归纳&#xff1a; 1. 连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 连接到本机上的MySQL: mysql -uroot -p &#xff08;如果root用户没有密码…

DP专项训练

第一题 来源:P3609 [USACO17JAN] Hoof, Paper, Scissor G 题意 给你n个蹄子/剪刀/布&#xff0c;在你没改变前出法均相同&#xff0c;可以改k次之后最多的相同的局数有多少。做法 线性DP 因为手势用的字符表示&#xff0c;为方便可以转换为数字 void calc(int i,char a){…