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

2024-06-06 10:12

本文主要是介绍从零开始精通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通信,进行设备的配置、控制等其他操作。

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



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

相关文章

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

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

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】

文章目录 1.Ribbon(负载均衡,服务调用)1.1问题引出1.2 Ribbon负载均衡1.3 RestTemplate整合Ribbon1.4 指定Ribbon负载均衡策略1.4.1 配置文件1.4.2 配置类1.4.3 定义Ribbon客户端配置1.4.4 自定义负载均衡策略 2.OpenFeign面向接口的服务调用(服务发现,远程调用)2.1 OpenFeign的使用2.1 .1创建

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

【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部分:对话