从零开始精通Onvif之设备发现

设备发现的意义

        在复杂的网络环境中,如何快速而准确地识别网络上的Onvif设备,对于摄像头厂商、系统集成商、开发人员乃至最终用户来说,都显得至关重要。

        首先,设备发现有效简化了集成的复杂度。在没有统一标准之前,每个厂商的设备可能使用私有协议,使得系统集成商在集成多品牌设备时,需要针对每种设备开发特定的接口和配置工具。Onvif设备发现机制简化了这一过程,使得我们能够使用统一的方法发现和配置网络中任何支持Onvif的设备,大大降低了集成的复杂度和成本。

        其次,设备发现大大提升了系统部署的效率。自动化的设备发现机制允许系统自动识别网络中的新设备,减少了手动配置的工作量。尤其是在大型分布式的监控系统中,这一特性尤为重要,可以显著加快系统部署和维护的速度。

        最后,设备发现适应了未来的发展趋势。随着物联网(IoT)、人工智能(AI)、云计算等技术的蓬勃发展,Onvif设备发现机制为这些技术的融合提供了基础,使得安防系统能够更加智能、高效地融入更广泛的智能生态系统中。

设备发现的原理

        Onvif设备发现主要基于WS-Discovery(英文全称为:Web Services Dynamic Discovery)机制。WS-Discovery是一个用于在网络中动态发现Web服务的协议,它允许设备在不需要预先知道对方IP地址或服务URL的情况下,就能够相互发现和通信。

        在Onvif设备发现的过程中,客户端会首先发送一个Probe报文到预定义的组播地址。组播地址通常是239.255.255.250,端口为3702。Probe报文包含了客户端想要查询的Onvif设备的类型,可能还有版本信息。网络中的Onvif设备在接收到这个报文后,会检查报文中的设备类型和版本信息是否与自己匹配。如果匹配,则会向客户端返回一个ProbeMatches报文,其中包含了设备的描述信息和网络地址。客户端在收到这个报文后,就可以解析出设备的网络地址,从而完成设备发现的过程。

设备发现的实现

        Onvif设备发现主要遵循WS-Discovery协议,该协议定义了如何在网络上广播和监听服务的存在。设备发现主要有4个步骤,具体如下。

        1、构造消息。客户端首先构造一个消息,该消息包含所寻找服务的类型,比如:Onvif设备服务。在WS-Discovery中,这通常是一个Probe请求消息,包含了服务类型相匹配的XML描述。

        在下面的Probe请求消息报文中,我们展示了WS-Discovery的基本格式,包括:信封(Envelope)、头部(Header,此处为空)、主体(Body)以及Probe元素。Probe元素中包含了要查找的服务类型,这里是dn:NetworkVideoTransmitter,表示网络视频传输设备。

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header /><s:Body><Probe xmlns="http://schemas.xmlsoap.org/ws/2005/04/discovery"><d:Types xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery">dn:NetworkVideoTransmitter</d:Types></Probe></s:Body>
</s:Envelope>

        2、发送请求。客户端通过UDP多播地址239.255.255.250(端口号为3702)发送这个消息到网络上,多播地址确保了消息能到达子网内的所有设备,而不仅仅是特定目标地址的设备。具体的代码逻辑,可以参考下面的Python示例代码。

import socket
import struct
from xml.etree import ElementTree as ET# 构建Probe请求消息报文
def build_probe_message():envelope = ET.Element('s:Envelope', {'xmlns:s': 'http://www.w3.org/2003/05/soap-envelope'})header = ET.SubElement(envelope, 's:Header')body = ET.SubElement(envelope, 's:Body')probe = ET.SubElement(body, 'Probe', {'xmlns': 'http://schemas.xmlsoap.org/ws/2005/04/discovery'})probe_match = ET.SubElement(probe, 'd:Types', {'xmlns:d': 'http://schemas.xmlsoap.org/ws/2005/04/discovery'}).text = 'dn:NetworkVideoTransmitter'return ET.tostring(envelope)# 发送多播请求
def send_discovery_request():multicast_ip = "239.255.255.250"port = 3702message = build_probe_message()sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, struct.pack('b', 4))sock.sendto(message, (multicast_ip, port))sock.close()# 主函数
if __name__ == "__main__":send_discovery_request()print("Discovery request sent.")

        3、等待响应。符合服务类型要求的Onvif设备作为服务端,在接收到请求后,会回复一个包含其设备描述信息的ProbeMatch响应消息。响应中通常包括:设备的URN(即Uniform Resource Name)、服务端点URL、设备型号、制造商信息等。

        在下面的ProbeMatch响应消息报文中,ProbeMatch元素包含了设备的端点引用(EndpointReference)、服务类型(Types)、作用域范围(Scopes)、服务地址(XAddrs,通常指向设备的Onvif服务地址)以及元数据版本(MetadataVersion)等。

<s:Envelope ...><s:Header /><s:Body><ProbeMatch ...><EndpointReference ...><Address>urn:uuid:...设备唯一ID...</Address></EndpointReference><Types>dn:NetworkVideoTransmitter</Types><Scopes /><XAddrs>http://设备IP/onvif/device_service</XAddrs><MetadataVersion>1</MetadataVersion>...</ProbeMatch></s:Body>
</s:Envelope>

        4、解析响应。客户端解析收到的响应信息,根据需要选择合适的设备。然后,通过设备提供的服务端点URL建立后续的SOAP通信,进行设备的配置、控制等其他操作。

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

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

相关文章

2004NOIP普及组真题 2. 花生采摘

线上OJ&#xff1a; 【04NOIP普及组】花生采摘 核心思想&#xff1a; 1、本题为贪心即可。 2、因为本题严格限制了顺序&#xff0c;所以先把每个节点的花生数量按降序排序。然后逐一判断下一个花生是否需要去采摘即可 3、每一次采摘完&#xff0c;记录耗时 t 以及采集的花…

力扣第417题测试程序

题目描述&#xff1a; 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights &#…

基于web的垃圾分类回收系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;公告管理&#xff0c;运输管理&#xff0c;基础数据管理 用户账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;运输管理&#xff0c;公告…

pyqt QlineEdit内部增加按钮方法

pyqt QlineEdit内部增加按钮方法 def addButton(self,lineEdit):btn QtWidgets.QPushButton("")icon1 QtGui.QIcon()icon1.addPixmap(QtGui.QPixmap(":/image/images/th.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)btn.setIcon(icon1)btn.setStyleShe…

全光谱led灯的危害有哪些?曝光低质量全光谱led灯产生的四大风险

眼睛是人类获取信息最重要的感官器官之一&#xff0c;而近视则会导致视力模糊&#xff0c;进而影响学习效果和生活品质。因此&#xff0c;如何保护眼睛&#xff0c;尤其是在学习和使用电子设备时&#xff0c;成为了一个迫切需要解决的问题。然而在护眼领域上&#xff0c;护眼台…

【DevOps】网络安全进阶之路:打造更安全、更可靠的网站

目录 一、网站面临的主要安全威胁 1、SQL注入攻击 2、跨站脚本攻击(XSS) 3、跨站请求伪造(CSRF) 4、文件上传漏洞 5、不安全的直接对象引用 6、安全配置错误 7、使用含有已知漏洞的组件 二、网站安全防护措施 1、输入验证与过滤 2、使用参数化查询 3、数据输出编码…

SCAU 数据结构 实验六 排序算法

![[Pasted image 20240 8638 直接插入排序 Description 用函数实现直接插入排序&#xff0c;并输出每趟排序的结果. 输入格式 第一行&#xff1a;键盘输入待排序关键的个数n 第二行&#xff1a;输入n个待排序关键字&#xff0c;用空格分隔数据 输出格式 每行输出一趟排序…

掌握Java设计模式的23种武器(全):深入解析与实战示例

目录 一、创建型模式 1. 单例模式 (Singleton Pattern) 2. 工厂模式 (Factory Pattern) 3. 抽象工厂模式 (Abstract Factory Pattern) 4. 建造者模式 (Builder Pattern) 5. 原型模式 (Prototype Pattern) 二、结构型模式 6. 适配器模式 (Adapter Pattern) 7. 桥接模式…

通信的本质是什么

通信的本质是信息的传递和交换。在通信过程中&#xff0c;信息从一个主体&#xff08;发送方&#xff09;传递到另一个主体&#xff08;接收方&#xff09;&#xff0c;目的是使接收方理解或使用发送方传递的信息。无论使用什么样的媒介或技术&#xff0c;通信的核心都是在不同…

十三、resultMap解析

分为两部分&#xff1a;解析和使用 解析 1.解析XML的时候单独解析所有的resultMap标签&#xff0c;封装成ResultMap对象存入configuration中 2.解析XML中的SQL语句&#xff0c;封装MappedStatement对象&#xff0c;这里会根据SQL的返回类型是resultMap还是resultType做处理。如…

C语言 | Leetcode C语言题解之第133题克隆图

题目&#xff1a; 题解&#xff1a; struct Node** visited; int* state; //数组存放结点状态 0&#xff1a;结点未创建 1&#xff1a;仅创建结点 2&#xff1a;结点已创建并已填入所有内容void bfs(struct Node* s) {if (visited[s->val] && state[s->val] 2…

【嵌入式系统实践】实验三EXTI按钮外部中断控制LED灯参考代码

此内容不属于实验内容&#xff0c;因自己手头有一STM32F103&#xff0c;故验证性的进行代码实验&#xff0c;按照老师课堂ppt进行了一下复现。 通过按钮控制LED灯的亮灭(状态取反)。 main.c代码&#xff1a; #include "STM32F10X.h" #include "stdio.h"…

Open3D Guided滤波(Python版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 Guided Filter原本主要用于2D图像的降噪等处理,但经过适当的修改后,它可以有效地应用于3D点云的降噪。这种方法能够保留点云中的细节信息,并且对边缘和曲面进行保护。 其具体计算过程如下所述: 1.局部线性假设:…

Python Lambda函数的应用实例教程

在Python编程中&#xff0c;lambda函数是一种简洁且强大的工具&#xff0c;用于创建小型匿名函数。它们在需要快速定义简单函数时特别有用。本文将详细介绍lambda函数的语法及其多种应用实例&#xff0c;帮助读者更好地理解和使用lambda函数。 一、lambda函数的基本概念 1.1 什…

c++(内存分配,构造,析构)

#include <iostream>using namespace std; class Per { private:string name;int age;double *height;double *weigh; public://无参构造Per(){cout << "Per::无参构造" << endl;}//有参构造Per(string name,int age,double height,double weigh):…

Nginx 的 stream 模块,配置转发redis和mysql

Nginx 的 stream 模块确实可以配置多个 upstream 块&#xff0c;用于定义多个后端服务器组。然而&#xff0c;需要注意的是&#xff0c;每个 upstream 块通常用于一种特定类型的服务&#xff0c;例如定义一组TCP服务器&#xff0c;可以是Redis服务器、MySQL服务器或其他任何TCP…

【TB作品】 51单片机8x8点阵显示滚动汉字仿真

功能 题目5基于51单片机LED8x8点阵显示 流水灯 直接滚动显示HELLO 直接滚动显示老师好 代码 void main( void ) {/** 移位后&#xff0c;右边的是第一个595&#xff0c;接收0X02&#xff0c;显示出0X02* 移位后&#xff0c;左边的是第2个595&#xff0c;接收0Xfe&#xff0c…

创建常规DLL的动态链接库

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系本人将于及时删除 【例9.3】创建一个MFC 常规DLL的动态链接库Areadll&#xff0c;在该动态链接库中添加一个导出类CArea&#xff0c;通过该类获取正方形和圆的面积。 (1) 使用“MFC动态链接…

HttpClient Overview(翻译)

HttpClient Overview **原文链接&#xff1a;HttpClient Overview The Hyper-Text Transfer Protocol(HTTP) is perhaps the most significant protocol used on the Internet today.Web services,network-enabled appliances and the growth on of network computing contin…

Allegro器件角度倾斜如何回正?

Allegro器件角度倾斜,坐标含有小数点调整为45度整数倍的方法 Allegro器件角度倾斜回正的方法。 在用Allero进行PCB设计过程中,有时候由于误操作;或者刚开始器件需要非45度整数倍的角度,后又需要调整为整数倍的角度。器件角度倾斜含有小数点调整为45度整数倍的方法。 1、如…