設備發現的意義
????????在復雜的網絡環境中,如何快速而準確地識別網絡上的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通信,進行設備的配置、控制等其他操作。