💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。
与设备交互的第一步
发现设备之后,与设备进行交互的第一步,是连接上设备,并获取设备的信息。连接设备,可以直接使用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 Fault
def 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 None
except HTTPError as e:
print(f"HTTP Error: {e}")
return None
except RequestException as e:
print(f"Request error: {e}")
return None
except Exception as e:
print(f"unexpected error: {e}")
return None
details = 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>