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

2024-06-10 14:44

本文主要是介绍从零开始精通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之获取设备信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja