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

相关文章

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

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

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

SpringCloud之consul服务注册与发现、配置管理、配置持久化方式

《SpringCloud之consul服务注册与发现、配置管理、配置持久化方式》:本文主要介绍SpringCloud之consul服务注册与发现、配置管理、配置持久化方式,具有很好的参考价值,希望... 目录前言一、consul是什么?二、安装运行consul三、使用1、服务发现2、配置管理四、数据持久化总

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

如何编写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