Executar a descoberta de serviçoPerform service discovery

Recurso BETABETA feature

Aplicativos de alto nível no Azure Sphere podem executar a descoberta de serviço por meio da DNS-SD (descoberta de serviço DNS).High-level applications on Azure Sphere can perform service discovery by using DNS service discovery (DNS-SD). Os aplicativos podem usar a descoberta de serviço para encontrar serviços de rede e executar a resolução de nome de host para que eles possam interagir com o serviço por meio do firewall do Azure Sphere.Applications can use service discovery to find network services and perform host name resolution so they can interact with the service through the Azure Sphere firewall. O mDNS (DNS multicast) também pode ser usado para executar a descoberta de ponto a ponto em uma rede local, o que é especialmente útil quando os endereços IP e os nomes de host do ponto de extremidade de destino não são conhecidos no tempo de design.Multicast DNS (mDNS) can also be used to perform peer-to-peer discovery on a local network, which is especially useful when the IP addresses and host names of the destination endpoint aren't known at design time.

Os aplicativos usam consultas de DNS-SD para recuperar os registros de DNS dos servidores DNS não locais ou por um link de multicast.Applications use DNS-SD queries to retrieve DNS records from non-local DNS servers or over a multicast link. Se o nome que está sendo consultado estiver sob o TLD (domínio de nível superior) .local, a consulta será feita por multicast na rede local em todas as interfaces de rede habilitadas; caso contrário, a descoberta de serviço unicast será executada.If the name being queried is under the .local top-level domain (TLD), the query is multicast on the local network through all enabled network interfaces; otherwise, unicast service discovery is performed. O Exemplo de descoberta de serviço demonstra como executar a descoberta de serviço no Azure Sphere.The Service discovery sample demonstrates how to perform service discovery on Azure Sphere.

Observação

O firewall do Azure Sphere impede que os aplicativos comuniquem-se com serviços não autorizados.The Azure Sphere firewall prevents applications from communicating with unauthorized services. No entanto, permitir conexões de saída para TLDs .local no manifesto do aplicativo pode aumentar o risco de segurança a um dispositivo ao permitir que um aplicativo conecte-se com serviços não autorizados anunciados na rede local.However, allowing outbound connections to .local TLDs in the application manifest may increase the security risk to a device by allowing an application to connect with unauthorized services that are advertised on the local network. Os aplicativos só devem permitir conexões de saída para TLDs .local em ambientes seguros que impeçam que partes não autorizadas anunciem serviços.Applications should only allow outbound connections to .local TLDs in secured environments that prevent unauthorized parties from advertising services. Para fornecer proteção adicional nesse cenário, o Azure Sphere requer que os serviços descobertos na rede local também residam na sub-rede local.To provide additional protection in this scenario, Azure Sphere requires that services that are discovered on the local network also reside on the local subnet.

Incluir arquivos de cabeçalhoInclude header files

Aplicativos que executam a descoberta de serviço devem incluir o arquivo de cabeçalho resolv:Applications that perform service discovery must include the resolv header file:

 #include <resolv.h>

Permitir uma conexão de serviçoAllow a service connection

Antes de executar uma consulta DNS-SD, você deve adicionar o serviço para o recurso de AllowedConnections do Manifesto do aplicativo.Before you perform a DNS-SD query, you must add the service to the AllowedConnections capability of the Application manifest. O firewall do Azure Sphere então permitirá que o aplicativo conecte-se a instâncias de serviço descobertas usando os respectivos endereços IP e nomes de host associados.The Azure Sphere firewall will then allow the application to connect to the discovered service instances using their associated host names and IP addresses. Se um serviço TLD .local for especificado, o firewall só permitirá conexões a recursos descobertos na sub-rede local.If a .local TLD service is specified, the firewall will only allow connections to discovered resources on the local subnet.

Os seguintes tipos de nomes de serviço são compatíveis com a capacidade AllowedConnections:The following types of service names are supported in the AllowedConnections capability:

  • Nome do serviço DNS local, como "_sample._tcp.local"Local DNS service name, such as "_sample._tcp.local"
  • Nome do serviço DNS não local, como "_sampleinstance._tcp.dns-sd.org"Non-local DNS service name, such as "_sampleinstance._tcp.dns-sd.org"
  • Nome da instância de serviço local, como "_sampleinstance._tcp.hostname.local"Local service instance name, such as "_sampleinstance._tcp.hostname.local"
  • Nome de domínio, como "samplehost.contoso.com"Domain name, such as "samplehost.contoso.com"
  • Endereço IPIP address

Veja aqui um trecho de um manifesto do aplicativo que inclui um nome de serviço não local.Here's an excerpt from an application manifest that includes a non-local service name.

"AllowedConnections": [ "_http._tcp.dns-sd.org" ]

Executar uma consulta DNS-SDPerform a DNS-SD query

Para executar uma consulta DNS-SD, você precisa solicitar vários tipos de registros DNS:To perform a DNS-SD query, you need to request several types of DNS records:

  • Registros PTR que enumeram as instâncias de um serviço DNS.PTR records that enumerate instances of a DNS service.
  • Registros SRV e TXT que contêm detalhes das instâncias de serviço, como nome do host e porta.SRV and TXT records that contain details of the service instances, such as host name and port.
  • Registros A que contêm os endereços IP de nomes do host recuperados.A records that contain the IP addresses of the retrieved host names.

Antes de enviar a consulta, você precisa criar e inicializar essa consulta, então adicionar uma mensagem de consulta que solicite o registro de DNS.Before you send the query, you need to create and initialize it, and then add a query message that requests the DNS record. Você pode criar e inicializar uma consulta DNS-SD ao chamar o função POSIX res_init().You can create and initialize a DNS-SD query by calling the POSIX function res_init(). Você pode criar uma mensagem para a consulta ao chamar o função POSIX res_mkquery().You can create a message for the query by calling the POSIX function res_mkquery().

Enviar uma consulta DNS por unicastSend a unicast DNS query

Ao executar a descoberta de serviço de unicast, você pode enviar a consulta DNS-SD e recuperar a resposta ao chamar o a função POSIX res_send().When performing unicast service discovery, you can send the DNS-SD query and retrieve the response by calling the POSIX function res_send().

Para enviar uma consulta DNS-SD em um link de multicast, o aplicativo deve abrir um soquete e enviar a solicitação do soquete para o endereço IP de loopback 127.0.0.1 (porta de destino 53).To send a DNS-SD query over a multicast link, the application must open a socket and send the request over the socket to the loopback IP address 127.0.0.1 (destination port 53). Depois que a solicitação é enviada, várias respostas podem ser retornadas.After the request is sent, multiple responses may be returned. O aplicativo deve aguardar e escutar por vários segundos para coletar todas as respostas.The application should wait and listen for several seconds to collect all responses. Isso é demonstrado no Exemplo de descoberta de serviço.This is demonstrated in the Service discovery sample.

Importante

Esse endereço IP de loopback é um recurso Beta que será preterido e substituído em versões futuras.This loopback IP address is a Beta feature that will be deprecated and then replaced in future releases. Essa será uma mudança significativa para aplicativos que dependem do endereço.This will be a breaking change for applications that rely on the address.

Conexões permitidas para hosts com vários endereços IPAllowed connections for hosts with multiple IP addresses

O firewall do Azure Sphere só permite conexões com um endereço IP por nome do host.The Azure Sphere firewall only allows connections to one IP address per host name. Se um host tiver vários endereços IP, o firewall do Azure Sphere só permitirá conexões para um dos endereços.If a host has multiple IP addresses, the Azure Sphere firewall only allows connections to one of the addresses. Um aplicativo pode usar o curl para fazer solicitações HTTPS a um host que tenha vários endereços IP. O curl tentará conectar-se a cada endereço IP até que o endereço permitido seja encontrado.An application can use curl to make HTTPS requests to a host that has multiple IP addresses; curl will try to connect to each IP address until the allowed address is found. No entanto, isso pode causar um atraso enquanto o aplicativo localiza o endereço permitido.However, this may cause a delay while the application finds the allowed address.