執行服務探索
重要
這是 Azure Sphere (舊版) 檔。 Azure Sphere(舊版)將於 2027 年 9 月 27 日淘汰,且使用者此時必須移轉至 Azure Sphere(整合式)。 使用位於 TOC 上方的版本選取器來檢視 Azure Sphere (整合式) 檔。
Azure Sphere 上的高階應用程式可以使用 DNS 服務探索 (DNS-SD) 來執行服務探索。 應用程式可以使用服務探索來尋找網路服務並執行主機名解析,讓應用程式可以透過 Azure Sphere 防火牆與服務互動。 多播 DNS (mDNS) 也可以用來在局域網路上執行點對點探索,這在設計時間不知道目的地端點的 IP 位址和主機名時特別有用。
應用程式會使用 DNS-SD 查詢,從非本機 DNS 伺服器或透過多播連結擷取 DNS 記錄。 如果查詢的名稱位於 .local 最上層網域 (TLD), 查詢會透過所有啟用的網路介面在局域網路上進行多播,否則會執行單播服務探索。 服務探索範例示範如何在 Azure Sphere 上執行服務探索。
注意
Azure Sphere 防火牆可防止應用程式與未經授權的服務通訊。 不過,允許對應用程式指令清單中的 .local TLD 進行輸出連線,可能會藉由允許應用程式與在局域網路上公告的未經授權服務連線,來增加裝置的安全性風險。 應用程式應只允許在安全環境中連至 .local TLD 的輸出連線,以防止未經授權的合作對象發佈服務。 若要在此案例中提供額外的保護,Azure Sphere 會要求在局域網路上探索到的服務也位於本機子網上。
包含頭檔
執行服務探索的應用程式必須包含解析頭檔:
#include <resolv.h>
允許服務連線
執行 DNS-SD 查詢之前,您必須將服務新增至應用程式指令清單的 AllowedConnections 功能。 然後,Azure Sphere 防火牆會允許應用程式使用其相關聯的主機名和IP位址連線到探索到的服務實例。 如果指定了 .local TLD 服務,防火牆將只允許連線到本機子網上探索到的資源。
AllowedConnections 功能支援下列類型的服務名稱:
- 本機 DNS 服務名稱,例如 “_sample._tcp.local”
- 非本機 DNS 服務名稱,例如 “_sampleinstance._tcp.dns-sd.org”
- 本機服務實例名稱,例如 “_sampleinstance._tcp.hostname.local”
- 功能變數名稱,例如 “samplehost.contoso.com”
- IP 位址
以下是包含非本地服務名稱的應用程式指令清單摘錄。
"AllowedConnections": [ "_http._tcp.dns-sd.org" ]
執行 DNS-SD 查詢
若要執行 DNS-SD 查詢,您需要要求數種類型的 DNS 記錄:
- 列舉 DNS 服務的實例的 PTR 記錄。
- 包含服務實例詳細數據的SRV 和 TXT 記錄,例如主機名和埠。
- 包含所擷取主機名IP位址的記錄。
傳送查詢之前,您必須建立並初始化它,然後新增要求 DNS 記錄的查詢訊息。 您可以呼叫 POSIX 函 式 res_init() 來建立和初始化 DNS-SD 查詢。 您可以呼叫 POSIX 函式 res_mkquery() 來建立查詢的訊息。
傳送單播 DNS 查詢
執行單播服務探索時,您可以呼叫 POSIX 函式res_send() 來傳送 DNS-SD 查詢並擷取回應。
透過多播連結傳送查詢
若要透過多播連結傳送 DNS-SD 查詢,應用程式必須開啟套接字,並將要求透過套接字傳送至回送 IP 位址 127.0.0.1(目的地埠 53)。 傳送要求之後,可能會傳回多個回應。 應用程式應該等候並接聽數秒以收集所有回應。 這會在服務探索範例中示範。
重要
此回送IP位址是Beta功能,將在未來的版本中淘汰並加以取代。 對於依賴位址的應用程式而言,這會是重大變更。
具有多個IP位址的主機允許連線
Azure Sphere 防火牆只允許每個主機名連線到一個IP位址。 如果主機有多個IP位址,Azure Sphere防火牆只允許連線到其中一個位址。 應用程式可以使用 curl 對具有多個 IP 位址的主機提出 HTTPS 要求;curl 會嘗試連線到每個 IP 位址,直到找到允許的地址為止。 不過,當應用程式找到允許的位址時,這可能會導致延遲。