执行服务发现

重要

这是 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 要求在本地网络上发现的服务也驻留在本地子网中。

包括标头文件

执行服务发现的应用程序必须包含 resolv 头文件:

 #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 地址的 A 记录

在发送查询之前,需要创建并初始化查询,然后添加请求 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 地址,直到找到允许的地址。 但是,当应用程序找到允许的地址时,这可能会导致延迟。