执行服务发现

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 记录。
  • 包含服务实例的详细信息(例如主机名和端口)的 SRVTXT 记录。
  • 包含 检索到的主机名的 IP 地址的记录。

在发送查询之前,需要创建并初始化它,然后添加请求 DNS 记录的查询消息。 可以通过调用 POSIX 函数 res_init () 来创建和初始化 DNS-SD 查询。 可以通过调用 POSIX 函数 res_mkquery () 为查询创建消息。

发送单播 DNS 查询

执行单播服务发现时,可以发送 DNS-SD 查询,并通过调用 POSIX 函数 res_send () 来检索响应。

若要通过多播链接发送 DNS-SD 查询,应用程序必须打开套接字,并通过套接字将请求发送到环回 IP 地址 127.0.0.1 (目标端口 53) 。 发送请求后,可能会返回多个响应。 应用程序应等待并侦听几秒钟以收集所有响应。 服务发现示例中演示了这一点。

重要

此环回 IP 地址是 Beta 版功能,将在将来的版本中停用并替换。 对于依赖于地址的应用程序来说,这是一个中断性变更。

具有多个 IP 地址的主机允许的连接

Azure Sphere 防火墙仅允许每个主机名连接到一个 IP 地址。 如果主机有多个 IP 地址,则 Azure Sphere 防火墙仅允许连接到其中一个地址。 应用程序可以使用 curl 向具有多个 IP 地址的主机发出 HTTPS 请求;curl 将尝试连接到每个 IP 地址,直到找到允许的地址。 但是,当应用程序找到允许的地址时,这可能会导致延迟。