2025年9月2日 星期二

WS-Discovery(Web Services Discovery)網路協定

 WS-Discovery(Web Services Discovery)是一種網路協定,主要目的是讓裝置或服務能在本機網路上自動被發現,而不需要使用者手動輸入IP位址或其他設定資訊。

你可以把它想像成一個「尋找服務的廣播系統」。當一個新裝置(例如IP攝影機、印表機或智慧型家電)連上網路後,它會自動發送廣播訊息,宣告自己的存在;而其他裝置(例如NVR主機或電腦)則會監聽這些廣播,或主動發出「尋找」的廣播,來發現這些新裝置。


WS-Discovery 的運作原理

WS-Discovery 的運作基於 多點傳播(Multicast) 技術,這是一種一對多的通訊方式。它的核心流程如下:

  1. 探測(Probe): 尋找服務的客戶端(如您的NVR主機)會透過多點傳播位址,發送一個探測訊息(Probe Message),廣播給同一個區域網路上的所有裝置。這個探測訊息通常會包含它想要尋找的服務類型。

  2. 回應(ProbeMatch): 區域網路上的所有裝置收到這個探測訊息後,如果發現自己提供了客戶端正在尋找的服務,就會直接向該客戶端單獨發送一個回應訊息(ProbeMatch Message),告知自己的服務資訊,例如IP位址、服務名稱等。

  3. 上線(Hello)與離線(Bye): 此外,裝置在首次上線時,也會主動發送一個「Hello」訊息,宣告自己的存在;當裝置正常關機或離線時,則會發送「Bye」訊息,告知其他裝置自己即將離線。

透過這種廣播和回應的機制,裝置之間可以動態地互相發現,不需要依賴一個中央伺服器來管理所有裝置的清單。


在監控領域的應用

WS-Discovery 在監控領域中扮演著非常關鍵的角色,特別是在 ONVIF(開放網路視訊介面論壇) 協定中。

當您將一台支援 ONVIF 的IP攝影機接入網路後,它會自動發送 WS-Discovery 廣播。接著,您的NVR主機(如果它也支援 ONVIF)會自動探測到這台攝影機,並將其顯示在裝置清單中,讓您可以一鍵加入,省去了手動輸入攝影機IP位址的繁瑣步驟。

簡單來說,WS-Discovery 讓「隨插即用」(Plug and Play)在網路監控攝影機上得以實現,大幅簡化了安裝和設定的過程。


WS-Discovery 概要

  • 定義:基於 SOAP over UDP 的裝置自動發現協定。用於同網段的零設定探索。

  • 傳輸:UDP/3702,多播至 239.255.255.250:3702(IPv4)。回覆通常為單播。

  • 物件:以 SOAP 訊息封裝 XML。核心元素為 TypesScopesXAddrs

    • Types:服務類型,例如 ONVIF 常用 dn:NetworkVideoTransmitter

    • Scopes:字串標籤,如 onvif://www.onvif.org/name/StoreCam1.../location/Lobby

    • XAddrs:可連線服務的 URL(如 http://IP:80/onvif/device_service)。

訊息種類

  • Hello:裝置上線廣播。

  • Bye:裝置下線廣播。

  • Probe:用戶端發出「誰符合某 Types/Scopes?」的查詢(多播)。

  • ProbeMatches:裝置回覆,提供 XAddrs

  • Resolve / ResolveMatches:已知 EPR 位址時解析詳細資訊(較少用)。

ONVIF 中的流程

  1. Client 多播 Probe(Types= dn:NetworkVideoTransmitter)。

  2. IPCam 單播 ProbeMatches,內含 XAddrs

  3. Client 對 XAddrs(通常 http://IP:80/onvif/device_service)建立 SOAP 連線。

  4. 呼叫 GetCapabilitiesMedia.GetProfilesGetStreamUri 取得 RTSP。

網路與相容性重點

  • 只保證同 L2 網段可用。跨 VLAN/子網需多播路由或代理。

  • 交換器啟用 IGMP Snooping 時,需正確的 IGMP Querier 才不會丟多播。

  • 防火牆需放行 UDP/3702 多播與單播回覆。

  • 預設 TTL=1。若有跨子網需求,提升 TTL 並配置路由端支援多播。

  • 無加密與驗證。只用於發現,不用於敏感控制。

除錯與測試

  • Wireshark 篩選:udp.port == 3702

  • 常見失敗原因:

    • 不同網段或 Wi-Fi AP 隔離多播 → 看不到回覆。

    • Windows/Linux 防火牆擋 UDP/3702。

    • 裝置未啟用 ONVIF 或關閉 WS-Discovery。

實作提示(Python)

  • 發送多播:設 IP_MULTICAST_TTLIP_MULTICAST_IF,送出 Probe。

  • 接收回覆:用 recvfrom 收單播,解析 XML 找 XAddrs 抽 IP。

  • 取得串流:對 XAddrs 走 ONVIF Media 服務拿 RTSP,再交給 ffplay/OpenCV。

適用場景

  • 初次佈署 IPCam/NVR 時的自動掃描。

  • 動態環境上線/下線通知(靠 Hello/Bye)做即時資源表更新。


沒有留言:

張貼留言