Efetuar a deteção de serviços

As aplicações de alto nível no Azure Sphere podem efetuar a deteção de serviços com a deteção do serviço DNS (DNS-SD). As aplicações podem utilizar a deteção de serviços para localizar serviços de rede e executar a resolução de nomes de anfitrião para que possam interagir com o serviço através da firewall do Azure Sphere. O DNS multicast (mDNS) também pode ser utilizado para realizar a deteção ponto a ponto numa rede local, o que é especialmente útil quando os endereços IP e os nomes de anfitrião do ponto final de destino não são conhecidos no momento da conceção.

As aplicações utilizam consultas DNS-SD para obter registos DNS de servidores DNS não locais ou através de uma ligação multicast. Se o nome que está a ser consultado estiver no domínio de nível superior (TLD) .local , a consulta é multicast na rede local através de todas as interfaces de rede ativadas; caso contrário, a deteção do serviço unicast é efetuada. O exemplo de Deteção de serviços demonstra como realizar a deteção de serviços no Azure Sphere.

Nota

A firewall do Azure Sphere impede que as aplicações comuniquem com serviços não autorizados. No entanto, permitir ligações de saída a TLDs .local no manifesto da aplicação pode aumentar o risco de segurança para um dispositivo ao permitir que uma aplicação se ligue a serviços não autorizados anunciados na rede local. As aplicações só devem permitir ligações de saída para TLDs .local em ambientes protegidos que impeçam entidades não autorizadas de anunciar serviços. Para fornecer proteção adicional neste cenário, o Azure Sphere requer que os serviços detetados na rede local também residam na sub-rede local.

Incluir ficheiros de cabeçalho

As aplicações que executam a deteção de serviços têm de incluir o ficheiro de cabeçalho de resolução:

 #include <resolv.h>

Permitir uma ligação de serviço

Antes de executar uma consulta DNS-SD, tem de adicionar o serviço à capacidade AllowedConnections do manifesto da Aplicação. Em seguida, a firewall do Azure Sphere permitirá que a aplicação se ligue às instâncias de serviço detetadas através dos nomes de anfitrião e endereços IP associados. Se for especificado um serviço .local TLD, a firewall só permitirá ligações para recursos detetados na sub-rede local.

Os seguintes tipos de nomes de serviço são suportados na capacidade AllowedConnections:

  • Nome do serviço DNS local, como "_sample._tcp.local"
  • Nome do serviço DNS não local, como "_sampleinstance._tcp.dns-sd.org"
  • Nome da instância do serviço local, como "_sampleinstance._tcp.hostname.local"
  • Nome de domínio, como "samplehost.contoso.com"
  • Endereço IP

Eis um excerto de um manifesto de aplicação que inclui um nome de serviço não local.

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

Executar uma consulta DNS-SD

Para executar uma consulta DNS-SD, tem de pedir vários tipos de registos DNS:

  • Registos PTR que enumeram instâncias de um serviço DNS.
  • Registos SRV e TXT que contêm detalhes das instâncias de serviço, como o nome do anfitrião e a porta.
  • Um registo que contém os endereços IP dos nomes de anfitrião obtidos.

Antes de enviar a consulta, tem de criá-la e inicializá-la e, em seguida, adicionar uma mensagem de consulta que pede o registo DNS. Pode criar e inicializar uma consulta DNS-SD ao chamar a função POSIX res_init(). Pode criar uma mensagem para a consulta ao chamar a função POSIX res_mkquery().

Enviar uma consulta DNS unicast

Ao realizar a deteção do serviço unicast, pode enviar a consulta DNS-SD e obter a resposta ao chamar a função POSIX res_send().

Para enviar uma consulta DNS-SD através de uma ligação multicast, a aplicação tem de abrir um socket e enviar o pedido através do socket para o endereço IP de loopback 127.0.0.1 (porta de destino 53). Depois de o pedido ser enviado, podem ser devolvidas várias respostas. A aplicação deve aguardar e escutar durante vários segundos para recolher todas as respostas. Isto é demonstrado no exemplo de Deteção de serviços.

Importante

Este endereço IP de loopback é uma funcionalidade Beta que será descontinuada e, em seguida, substituída em versões futuras. Esta será uma alteração interruptiva para as aplicações que dependem do endereço.

Ligações permitidas para anfitriões com vários endereços IP

A firewall do Azure Sphere só permite ligações a um endereço IP por nome de anfitrião. Se um anfitrião tiver vários endereços IP, a firewall do Azure Sphere só permite ligações a um dos endereços. Uma aplicação pode utilizar o curl para fazer pedidos HTTPS a um anfitrião que tenha vários endereços IP; O Curl tentará ligar a cada endereço IP até que o endereço permitido seja encontrado. No entanto, isto pode causar um atraso enquanto a aplicação encontra o endereço permitido.