当前位置: 首页 > news >正文

从零开始精通Onvif之获取设备信息

💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。

与设备交互的第一步

        发现设备之后,与设备进行交互的第一步,是连接上设备,并获取设备的信息。连接设备,可以直接使用Python中的zeep库。zeep库是Python中用于消费SOAP Web服务的一个流行库,特别适合用来与遵循Onvif规范的设备进行交互。连接上设备之后,通常需要获取一些比较重要的信息,具体包括:基本信息、系统时间、能力信息、配置文件等。接下来,我们将分别进行介绍。

获取设备的基本信息

        GetDeviceInformation命令用于获取设备的基本信息,包括:制造商名称(Manufacturer)、型号(Model)、硬件ID(HardwareId,可选)、固件版本(FirmwareVersion)、序列号(SerialNumber)等。这是了解设备身份和版本信息的第一步,获取这些信息对于识别和记录设备、进行设备管理以及故障排查是非常有用的。

        GetDeviceInformation命令的SOAP请求比较简单,可参考下面的示例报文。

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://www.onvif.org/ver10/device/wsdl"><soapenv:Header></soapenv:Header><soapenv:Body><ns:GetDeviceInformation/></soapenv:Body>
</soapenv:Envelope>

        设备接收到请求命令后,会返回给客户端SOAP响应。SOAP响应中包含制造商名称、型号等基本信息,可参考下面的示例报文。

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><ns:GetDeviceInformationResponse xmlns:ns="http://www.onvif.org/ver10/device/wsdl"><Manufacturer>Custom Manufacturer</Manufacturer><Model>Model Hope</Model><FirmwareVersion>V6.6.0</FirmwareVersion><SerialNumber>123456789ABCD</SerialNumber><!-- 可能还有可选信息,比如:HardwareId列表等 --></ns:GetDeviceInformationResponse></soapenv:Body>
</soapenv:Envelope>

        我们使用zeep库来实现GetDeviceInformation命令,可参考下面的示例代码。

from zeep import Client
from zeep.transports import Transport
from requests.auth import HTTPDigestAuth
from requests.exceptions import RequestException, HTTPError
from zeep.exceptions import Faultdef get_device_information(device_ip, username, password):try:wsdl_url = f"http://{device_ip}/onvif/device_service?wsdl"transport = Transport(timeout = 10)auth = HTTPDigestAuth(username, password)client = Client(wsdl_url, transport = transport, wsse = auth)dev_info = client.service.GetDeviceInformation()return {"Manufacturer": dev_info.Manufacturer,"Model": dev_info.Model,"FirmwareVersion": dev_info.FirmwareVersion,"SerialNumber": dev_info.SerialNumber}except Fault as e:print(f"SOAP Fault: {e}")return Noneexcept HTTPError as e:print(f"HTTP Error: {e}")return Noneexcept RequestException as e:print(f"Request error: {e}")return Noneexcept Exception as e:print(f"unexpected error: {e}")return Nonedetails = get_device_information("{device_ip}", "{username}", "{password}")
if details:print(details)
else:print("Failed to retrieve device information.")

获取设备的系统时间

        GetSystemDateAndTime命令用于获取设备当前的系统日期和时间,对于同步设备时间、记录事件发生的具体时间点、验证设备时间设置等都非常重要。该命令的SOAP请求比较简单,可参考下面的示例报文。

<soapenv:Envelope ...><soapenv:Header></soapenv:Header><soapenv:Body><ns:GetSystemDateAndTime xmlns:ns="http://www.onvif.org/ver10/device/wsdl"/></soapenv:Body>
</soapenv:Envelope>

        设备接收到请求命令后,会返回给客户端SOAP响应。SOAP响应中包含时间类型、UTC时间、本地时间以及夏令时(DST)的状态等信息,可参考下面的示例报文。

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Body><tds:GetSystemDateAndTimeResponse xmlns:tds="http://www.onvif.org/ver10/device/wsdl"><tds:SystemDateAndTime><!-- 时间类型,例如Manual(手动设置)、NTP(网络时间协议)等 --><tt:DateTimeType>Manual</tt:DateTimeType><!-- 是否为夏令时 --><tt:DaylightSavings>false</tt:DaylightSavings><tt:TimeZone><!-- 时区,比如:GMT+08:00表示东八区 --> <tt:TZ>GMT+08:00</tt:TZ></tt:TimeZone><!-- UTC时间 --><tt:UTCDateTime><!-- 时间点,使用ISO 8601格式 --><tt:Time>2024-06-02T10:00:00Z</tt:Time></tt:UTCDateTime><!-- 可能有其他字段,比如:LocalDateTime,具体取决于ONVIF版本和设备实现 --></tds:SystemDateAndTime></tds:GetSystemDateAndTimeResponse></s:Body>
</s:Envelope>

获取设备的能力信息

        GetCapabilities命令用于获取设备或特定服务的能力信息,包括:支持的服务、媒体配置、网络能力等,是了解设备所有功能和特性的入口。该命令的SOAP请求比较简单,可参考下面的示例报文。

<soapenv:Envelope ...><soapenv:Body><ns:GetCapabilities xmlns:ns="..."></ns:GetCapabilities></soapenv:Body>
</soapenv:Envelope>

        设备接收到请求命令后,会返回给客户端SOAP响应。SOAP响应的Capabilities元素下,包含设备支持的各种能力的详细描述,这些能力通常包括以下几个大的分类。

        Device: 设备的基本信息,比如:制造商、型号、序列号等。

        Media: 媒体服务的能力,比如:视频流、音频流、PTZ(云台)控制等。

        Events: 事件通知的能力,比如:移动检测、视频丢失等。

        Analytics: 视频分析的能力,比如:人脸识别、车牌识别等(如果设备支持的话)。

        PTZ: 云台控制的能力(如果设备支持的话)。

        Extensions: 自定义的能力(如果设备支持的话)。

        在Capabilities元素下,每个能力都会有一个或多个子元素来描述其具体的功能和限制。以Media为例,可能会有VideoSources、AudioSources、Profiles等子元素来描述视频源、音频源和媒体配置文件的详细信息。

<s:Envelope ...><s:Body><tds:GetCapabilitiesResponse ...><tds:Capabilities><tds:Device><!-- 设备信息 --></tds:Device><tds:Media><tds:VideoSources><!-- 视频源信息 --></tds:VideoSources><!-- 其他媒体服务信息 --></tds:Media><!-- 其他能力信息 --></tds:Capabilities></tds:GetCapabilitiesResponse></s:Body>
</s:Envelope>

获取设备的配置文件

        GetProfiles命令用于获取设备的媒体配置文件(Profiles),每个媒体配置文件定义了一套特定的媒体配置,包括:视频流参数、编码设置、视频源配置(比如:分辨率、帧率)、音频配置等。这些配置文件有助于简化对设备的管理和控制,用户可以根据不同的应用场景选择合适的配置文件来启动或修改媒体流。该命令的SOAP请求比较简单,可参考下面的示例报文。

<soapenv:Envelope ...><soapenv:Body><ns:GetProfiles xmlns:ns="http://www.onvif.org/ver10/media/wsdl"/></soapenv:Body>
</soapenv:Envelope>

        设备接收到请求命令后,会返回给客户端SOAP响应。SOAP响应通常包含一个或多个配置文件的详细信息,每个配置文件都是一个Profile元素,内部包含如下的子元素。

        Name:配置文件的名称。

        Token:配置文件的唯一标识符。

        VideoSourceConfiguration:视频源的配置详情。

        AudioSourceConfiguration:可选,音频源的配置详情。

        VideoEncoderConfiguration:视频编码器的配置详情,包括分辨率、帧率、编码格式等。

        AudioEncoderConfiguration:可选,音频编码器的配置详情。

        PTZConfiguration:可选,如果设备支持PTZ(云台、变焦、倾斜)控制,则包含PTZ的相关配置。

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><ns:GetProfilesResponse xmlns:ns="http://www.onvif.org/ver10/media/wsdl"><Profiles><Profile token="Profile1"><Name>Default Profile</Name><VideoSourceConfiguration><!-- 视频源配置详情 --></VideoSourceConfiguration><VideoEncoderConfiguration><!-- 视频编码配置详情 --></VideoEncoderConfiguration><!-- 其他配置,比如:音频、PTZ等 --></Profile><!-- 可能还有其他Profile --></Profiles></ns:GetProfilesResponse></soapenv:Body>
</soapenv:Envelope>

相关文章:

从零开始精通Onvif之获取设备信息

&#x1f4a1; 如果想阅读最新的文章&#xff0c;或者有技术问题需要交流和沟通&#xff0c;可搜索并关注微信公众号“希望睿智”。 与设备交互的第一步 发现设备之后&#xff0c;与设备进行交互的第一步&#xff0c;是连接上设备&#xff0c;并获取设备的信息。连接设备&#…...

FiRa标准UWB MAC实现(三)——距离如何获得?

继续前期FiRa MAC相关介绍,将FiRa UWB MAC层相关细节进一步进行剖析,介绍了UWB技术中最重要的一个点,高精度的距离是怎么获得的,具体使用的测距方法都有哪些,原理又是什么。为后续FiRa UWB MAC的实现进行铺垫。 3、测距方法 3.1 SS-TWR SS-TWR为Single-Sided Two-Way Ra…...

基于百度翻译API的火车头PHP翻译插件,可以翻译HTML片段

关于火车头的百度翻译插件&#xff0c;相信大家在火车头官网或网上都能找到相关代码&#xff0c;百度翻译插件是PHP写的&#xff0c;就一个PHP文件&#xff0c;简单灵活&#xff0c;不受火车头软件版本限制&#xff0c;任何有PHP插件权限的火车头版本都可以使用。但是百度API翻…...

mysql高级用法常用函数

mysql高级用法 1、自定义排序 select * from movies order by field(actors, 成龙, 靳东, 刘亦菲, 范冰冰); // 字段中存在null值 select * from movies order by field (coalesce(actors,null),成龙, 靳东, 刘亦菲, 范冰冰,null)2、空值NULL排序&#xff08;ORDER BY IF(ISN…...

【打印100个常用Linux命令】

#!/bin/bash 定义一个函数&#xff0c;用于打印100个常用Linux命令 print_commands() { echo “以下是一些常用的Linux命令&#xff1a;” echo “----------------------------------” echo “1. pwd - 显示当前工作目录” echo “2. ls - 列出当前目录下的文件和文件夹” …...

友情提示:lazarus的tsortgrid.autofillcolumns存在BUG

直接在tsortgrid的属性中设置autofillcolumns为true&#xff0c;会提示&#xff1a;123个错误。即使修改为false&#xff0c;编译运行照样会出现上述错误。唯一解决的办法就是删除sortgrid重新添加一个。 代码设置SortGrid1.AutoFillColumns : TRUE不受影响。...

github的个人readme文件

一个好的svg图: Simon-He95/profile-3d-contrib/profile-season-animate.svg at 4281d9f46e3d5416bd8f8cc5779157bfdaa8589d Simon-He95/Simon-He95 GitHub 请访问他的主页从提交记录就可以看到这个立体的登录github的图...

java面试题: HashMap、HashSet 和 HashTable 的区别

HashMap 常用方法 HashMap 是一个基于哈希表的 Map 接口的实现。它允许使用 null 值和 null 键。 java 复制 // 创建一个HashMap HashMap<KeyType, ValueType> map new HashMap<>(); // 添加元素 map.put(key, value); // 获取元素 ValueType value map.get…...

CPP初级:模板的运用!

目录 一.泛型编程 二.函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 三.函数模板的实例化 1.隐式实例化 2.显式实例化 3.模板参数的匹配原则 四.类模板 1.类模板的定义格式 2.类模板的实例化 一.泛型编程 泛型编程&#xff1a;编写与类型无关的通用代码…...

排序---基数排序

前言 个人小记 一、简介 基数排序是一种非比较排序&#xff0c;所以排序速度较快&#xff0c;当为32位int整数排序时&#xff0c;可以将数分为个位十位分别为2^16,使得拷贝只需要两轮&#xff0c;从而达到2*n&#xff0c;然后给一个偏移量&#xff0c;使得可以对负数排序。以…...

“新高考”下分班怎么分?

来自安徽的张女士告诉我&#xff1a;上一年孩子升入了高中&#xff0c;但没想到才高一&#xff0c;孩子就面临了一个困难的挑选&#xff1a;312”分班&#xff01; 什么是312”分班呢&#xff1f;许多人或许不明白&#xff0c;便是要求学生在高一入学时&#xff0c;针对于3门必…...

二叉树的层序遍历-力扣

本题是二叉树的层序遍历&#xff0c;通过一个队列来控制遍历的节点&#xff0c;二叉树每层的节点和上一层入队的节点个数是相同的&#xff0c;根据这一点编写循环条件。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …...

N32G45XVL-STB之移植LVGL(lvgl-8.2.0)

目录 概述 1 软硬件介绍 1.1 软件版本信息 1.2 ST7796-LCD 1.3 MCU IO与LCD PIN对应关系 2 认识LVGL 2.1 LVGL官网 2.2 LVGL库文件下载 3 移植LVGL 3.1 准备移植文件 3.2 添加lvgl库文件到项目 3.2.1 src下的文件 3.2.2 examples下的文件 3.2.3 配置文件路径 3.2…...

【设计模式】创建型设计模式之 原型模式

介绍 原型模式是一种创建型设计模式&#xff0c;主要用于创建重复的对象&#xff0c;而无需重新初始化它们&#xff0c;从而提高效率并简化对象的创建过程。此模式的核心思想是利用已存在的对象实例&#xff0c;通过复制&#xff08;克隆&#xff09;的方式来生成新的对象&…...

【类型商店】字符字符串(下)

啊&#xff0c;哈喽&#xff0c;小伙伴们大家好。我是#Y清墨&#xff0c;今天呐&#xff0c;我要介绍的是字符与字符串。 导语 前两期&#xff0c;我们已经懂得了概念&#xff0c;今天来看些函数。 正题 一.增加或连接 &#xff08;1) 后面增加() string s1,s2; //定义 s…...

『 Linux 』内存管理与文件系统

文章目录 交换分区页与页框(页帧)交换分区与内存之间的交换操作系统如何管理内存物理地址转换页号与页内偏移量 内存管理,文件系统与文件管理之间的联系 交换分区 在Linux的安装过程中,用户将会被提示创建一个交换分区; 这是一个特殊的分区,其大小可以由用户根据系统内存需求和…...

线性代数|机器学习-P8矩阵低秩近似eckart-young

文章目录 1. SVD奇异值分解2. Eckart-Young2.1 范数 3. Q A Q U Σ V T QAQU\Sigma V^T QAQUΣVT4. 主成分分析图像表示 1. SVD奇异值分解 我们知道&#xff0c;对于任意矩阵A来说&#xff0c;我们可以将其通过SVD奇异值分解得到 A U Σ V T AU\Sigma V^T AUΣVT&#xff0…...

平面设计神器CorelDRAW2021精简版,你值得拥有!

亲爱的设计师小伙伴们&#xff0c;今天我要为大家种草一款神奇的软件——CorelDRAW平面设计软件2021精简版&#xff01;&#x1f929;✨作为一名专业的图形设计师&#xff0c;我深知一个好工具对于我们的工作有多么重要。而这款软件简直就是我们设计师的救星&#xff01;&#…...

kafka是什么?

Kafka是一个由Apache软件基金会开发的开源流处理平台&#xff0c;最初由LinkedIn公司开发&#xff0c;使用Scala和Java编写。它是一个高吞吐量的分布式发布订阅消息系统&#xff0c;可以处理消费者在网站中的所有动作流数据&#xff0c;如网页浏览、搜索和其他用户行为等。Kafk…...

ABC351

C 栈的应用 #include<bits/stdc.h>using namespace std;stack<int>stk;int main() {int n;cin>>n;for(int i1;i<n;i){int a;cin>>a;while(!stk.empty()&&astk.top()){stk.pop();a;}stk.push(a);}cout<<stk.size()<<endl;retur…...

虚拟工业仿真软件能模拟实操吗?看完你就懂了

在高端制造与复杂工程场景中&#xff0c;工业仿真软件是否只是“纸上谈兵”&#xff1f;它能否真正模拟出真实的物理过程、操作流程与系统行为&#xff1f;答案是&#xff1a;可以&#xff0c;而且正在改变工业研发的逻辑。秩益科技自主研发的DIMAXER工业仿真软件&#xff0c;正…...

从‘Hello World’到打开PRT文件:一个完整的NX C++外部exe开发入门实战(VS2015 + NX12)

从‘Hello World’到打开PRT文件&#xff1a;一个完整的NX C外部exe开发入门实战&#xff08;VS2015 NX12&#xff09; 在工业设计领域&#xff0c;NX&#xff08;原Unigraphics&#xff09;作为一款功能强大的CAD/CAM/CAE软件&#xff0c;其二次开发能力为工程师提供了极大的…...

GPU内核优化:R3框架与分层自动调优实践

1. GPU内核优化的挑战与机遇在现代高性能计算和人工智能领域&#xff0c;GPU已经成为不可或缺的计算引擎。然而&#xff0c;随着硬件架构的快速迭代&#xff0c;保持应用程序的高性能表现变得越来越具有挑战性。传统的手工优化方法需要开发者投入数月时间&#xff0c;在算法设计…...

Neovim涂抹光标插件:提升编码体验的动态轨迹设计

1. 项目概述&#xff1a;一个为Neovim设计的“涂抹光标”插件 如果你和我一样&#xff0c;是个重度Neovim用户&#xff0c;每天有超过8小时的时间泡在终端和代码编辑器里&#xff0c;那你肯定对光标的“存在感”有要求。默认的方块或下划线光标&#xff0c;在长时间编码后&…...

Steam成就管理终极指南:三步掌握高效成就解锁技巧

Steam成就管理终极指南&#xff1a;三步掌握高效成就解锁技巧 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager Steam Achievement Manager&#xff08;SAM&…...

为什么83%的Enterprise客户在第6个月触发License超额预警?揭秘后台用量监控盲区与动态配额优化公式

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;License超额预警现象的全局观测与根本归因 License超额预警并非孤立事件&#xff0c;而是软件许可治理体系中多维耦合失衡的外在表征。在企业级 DevOps 平台&#xff08;如 GitLab Ultimate、JetBrains…...

从‘仿真’到‘半虚拟化’:一文读懂VMware虚拟网卡(E1000/E1000E/VMXNET3)的工作原理与演进史

从仿真到半虚拟化&#xff1a;虚拟网卡技术演进与设计哲学深度解析 虚拟化技术已经成为现代计算架构的基石&#xff0c;而网络虚拟化则是其中最为关键的组成部分之一。在虚拟化环境中&#xff0c;虚拟网卡作为连接虚拟机与外部世界的桥梁&#xff0c;其设计理念直接影响着整个…...

在vSphere ESXi 7.0上跑MacOS Big Sur?这份保姆级避坑指南帮你一次搞定

在vSphere ESXi 7.0上部署macOS Big Sur的深度避坑指南 虚拟化环境中运行macOS一直是技术爱好者和企业开发者的热门需求。本文将深入探讨在vSphere ESXi 7.0平台上安装macOS Big Sur时可能遇到的各种技术难题及其解决方案&#xff0c;帮助您避开那些让大多数用户头疼的"坑…...

手把手教你用STM32和电位器,临时搭建一个TTL转485调试器(附电路图)

应急调试利器&#xff1a;用STM32和电位器快速搭建TTL转485监听器 在嵌入式开发现场调试时&#xff0c;最让人头疼的莫过于设备串口输出异常却找不到合适的调试工具。上周在客户工厂就遇到了这样的窘境——需要监控设备TTL串口数据&#xff0c;但手边只有RS485转换器和几根杜邦…...

大模型动态计算:按需推理更高效

一种让大语言模型更智能地思考难题的方法 这项新技术使大语言模型能够根据问题的难度&#xff0c;动态调整用于推理的计算量。 为了使大语言模型在回答较难问题时更加准确&#xff0c;研究人员可以让模型花费更多时间来思考潜在解决方案。但是&#xff0c;赋予大语言模型这种能…...