Usar serviços de rede

O Azure Sphere pode executar um endereço IP estático, um servidor DHCP (protocolo de configuração de host dinâmico) e um servidor SNTP (protocolo de tempo de rede) simples para uma interface de rede. O servidor DHCP permite que aplicativos do Azure Sphere configurem parâmetros de rede para um dispositivo externo na rede. O dispositivo externo pode usar o servidor SNTP para sincronizar seu tempo com o Azure Sphere.

Configuração de rede

Você pode configurar uma Ethernet e uma interface de rede Wi-Fi para ser executada simultaneamente em um dispositivo do Azure Sphere. As interfaces de rede Ethernet e Wi-Fi podem ser conectadas a redes públicas (conectadas à Internet) ou privadas. Pelo menos uma interface deve estar conectada a uma rede pública. Somente uma interface Ethernet pode ser configurada por vez.

Interfaces de rede pública e privada

Se você usar interfaces de rede públicas e privadas, como ethernet privada com Wi-Fi público, o dispositivo do Azure Sphere não atuará como um roteador. Ele não passará automaticamente pacotes recebidos na rede Ethernet para a rede Wi-Fi ou vice-versa. Seu aplicativo deve implementar toda a lógica que envia e recebe informações em ambas as redes.

Interfaces de rede pública duplas

Se você usar duas interfaces de rede que têm o endereço IP dinâmico habilitado, o sistema operacional tentará usar a primeira interface conectada à rede quando selecionar endereços de servidor DNS para resolução de nome do host. Se uma interface se desconectar da rede, os endereços do servidor DNS da outra interface conectada serão usados automaticamente.

Endereço IP estático

Você pode configurar um endereço IP estático em uma interface Ethernet ou Wi-Fi. Para configurar uma configuração de endereço IP estático, seu aplicativo deve usar a API de rede applibs e o manifesto do aplicativo deve habilitar o recurso NetworkConfig .

Ao configurar um endereço IP estático, o DNS personalizado também deve ser definido para garantir que o sistema operacional do Azure Sphere continue funcionando conforme o esperado.

O exemplo de Serviços de Rede Privada demonstra como conectar o Azure Sphere a uma rede privada e usar vários serviços de rede.

Este snippet de código demonstra como configurar uma interface de rede com um endereço IP estático.

Inclua a seguinte linha na seção Recursos do arquivo app_manifest.json da seguinte maneira:

"Capabilities": {
  "NetworkConfig": true
}

Inclua esses arquivos de cabeçalho em seu aplicativo:

#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <applibs/log.h>
#include <applibs/networking.h>

Defina o endereço IP, a máscara de sub-rede e o gateway para a configuração de IP.

static const char staticIpInDotNotation[] = "yourStaticIp"; // Your static IP in x.x.x.x notation.
static const char subnetMaskInDotNotation[] =
    "yourSubnetMask"; // Your subnet mask in x.x.x.x notation.
static const char gatewayIpInDotNotation[] = "yourGatewayIp"; // Your gateway IP in x.x.x.x notation.

Especifique a interface de rede a ser configurada:

static const char networkInterfaceToConfigure[] = "yourNetworkInterface"; // Your network interface.

Converta os endereços de rede em inteiros e aplique-os à interface de rede especificada.

struct in_addr staticIpAddress;
struct in_addr subnetMask;
struct in_addr gatewayIpAddress;

Networking_IpConfig ipConfig;

// Convert the addresses from the numbers-and-dots notation into integers.
if (inet_pton(AF_INET, staticIpInDotNotation, &staticIpAddress) != 1) {
    Log_Debug("ERROR: Invalid static IP address or address family specified.\n");
    return -1;
}
if (inet_pton(AF_INET, subnetMaskInDotNotation, &subnetMask) != 1) {
    Log_Debug("ERROR: Invalid subnet mask or address family specified.\n");
    return -1;
}
if (inet_pton(AF_INET, gatewayIpInDotNotation, &gatewayIpAddress) != 1) {
    Log_Debug("ERROR: Invalid gateway IP address or address family specified.\n");
    return -1;
}

Networking_IpConfig_Init(&ipConfig);
Networking_IpConfig_EnableStaticIp(&ipConfig, staticIpAddress, subnetMask, gatewayIpAddress);

int result =
    Networking_IpConfig_EnableCustomDns(&ipConfig, dnsServers, numOfDnsServerAddressSpecified);

if (result != 0) {
    Log_Debug("ERROR: Networking_IpConfig_EnableCustomDns: %d (%s)\n", errno, strerror(errno));
    Networking_IpConfig_Destroy(&ipConfig);
    return -1;
}

int result = Networking_IpConfig_Apply(networkInterfaceToConfigure, &ipConfig);
Networking_IpConfig_Destroy(&ipConfig);

if (result != 0) {
    Log_Debug("ERROR: Networking_IpConfig_Apply: %d (%s)\n", errno, strerror(errno));
    return -1;
}

Endereço DNS estático

Se você tiver configurado um dispositivo com um IP estático e exigir resolução de nomes, seu aplicativo deverá definir um endereço DNS estático. Use Networking_IpConfig_EnableCustomDns e defina um ou mais resolvedores DNS válidos. Se vários resolvedores forem definidos, todos eles serão consultados e a primeira resposta DNS válida atenderá à consulta. Networking_IpConfig_EnableCustomDns também podem ser usados para substituir o resolvedor atual se um for definido via DHCP.

Para configurar uma interface de rede com servidores DNS personalizados, o manifesto do aplicativo deve habilitar o recurso NetworkConfig.

Inclua a seguinte linha na seção Recursos do arquivo app_manifest.json da seguinte maneira:

"Capabilities": {
  "NetworkConfig": true
}

Este snippet de código demonstra como configurar uma interface de rede com servidores DNS personalizados.

Inclua esses arquivos de cabeçalho em seu aplicativo:

#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <applibs/log.h>
#include <applibs/networking.h>

Especifique o número de servidores DNS. Até três servidores DNS podem ser especificados. O código a seguir configura a matriz de três endereços IP do servidor DNS a serem usados.

// A maximum of 3 DNS server addresses can be specified.
static const size_t numOfDnsServerAddressSpecified = 3;
static const char *dnsServerIpAddress[] = {
    "yourDnsServer1", "yourDnsServer2", "yourDnsServer3"}; // Your DNS servers in x.x.x.x notation.

Especifique a interface de rede a ser configurada.

static const char networkInterfaceToConfigure[] = "yourNetworkInterface"; // Your network interface.

Converta os endereços de rede em inteiros e aplique a configuração. Essa configuração DNS substitui todos os servidores DNS especificados pelo DHCP.

Networking_IpConfig ipConfig;

// Convert the addresses from the numbers-and-dots notation into integers.
struct in_addr dnsServers[numOfDnsServerAddressSpecified];
for (int i = 0; i < numOfDnsServerAddressSpecified; i++) {
    if (inet_pton(AF_INET, dnsServerIpAddress[i], &dnsServers[i]) != 1) {
        Log_Debug("ERROR: Invalid DNS server address or address family specified.\n");
        return -1;
    }
}

Networking_IpConfig_Init(&ipConfig);

int result =
    Networking_IpConfig_EnableCustomDns(&ipConfig, dnsServers, numOfDnsServerAddressSpecified);

if (result != 0) {
    Log_Debug("ERROR: Networking_IpConfig_EnableCustomDns: %d (%s)\n", errno, strerror(errno));
    Networking_IpConfig_Destroy(&ipConfig);
    return -1;
}

result = Networking_IpConfig_Apply(networkInterfaceToConfigure, &ipConfig);
Networking_IpConfig_Destroy(&ipConfig);

if (result != 0) {
    Log_Debug("ERROR: Networking_IpConfig_Apply: %d (%s)\n", errno, strerror(errno));
    return -1;
}

Servidor DHCP

Um dispositivo cliente externo conectado ao Azure Sphere por meio de uma interface Ethernet deve receber um endereço IP e outros parâmetros de rede para que ele possa se comunicar com um aplicativo de servidor no dispositivo Azure Sphere. No entanto, alguns dispositivos externos não dão suporte a uma maneira de configurar esses parâmetros. O Azure Sphere dá suporte a um servidor DHCP por meio do qual um aplicativo pode fornecer essa configuração. O aplicativo deve habilitar o recurso DhcpService em seu manifesto de aplicativo.

O aplicativo Azure Sphere chama Networking_DhcpServerConfig_Init para configurar o servidor para fornecer um endereço IP, máscara de sub-rede, endereço de gateway, duração de concessão e até três endereços de servidor NTP para um dispositivo cliente. Somente um endereço IP pode ser configurado na versão atual. Em seguida, ele chama Networking_DhcpServer_Start para iniciar o servidor em uma interface de rede específica. Depois que o servidor DHCP for iniciado, o dispositivo cliente poderá enviar mensagens DHCP de transmissão para descobrir e solicitar endereços IP do servidor DHCP na sub-rede especificada.

Servidor SNTP

O servidor SNTP permite que os dispositivos cliente sincronizem o tempo do sistema com o do dispositivo do Azure Sphere. Para usar o servidor, o aplicativo Azure Sphere deve habilitar o recurso SntpService em seu manifesto de aplicativo.

Para iniciar o servidor, o aplicativo Azure Sphere chama Networking_SntpServer_Start e especifica a interface de rede na qual o servidor será executado. O dispositivo cliente e o dispositivo do Azure Sphere devem estar na mesma sub-rede local da rede na qual o servidor está em execução. O dispositivo do Azure Sphere deve estar conectado a pelo menos uma rede pública, para que ele possa obter o tempo atual de um servidor NTP (protocolo de tempo de rede pública). O servidor SNTP não responde às consultas até que tenha o tempo atual.

Nota

Embora um aplicativo possa definir o tempo do sistema diretamente, isso não é recomendado porque o tempo não persiste quando o dispositivo perde energia. Gerenciar a hora do sistema e o RTC no Azure Sphere tem mais informações.

Portas de escuta

Se o aplicativo Azure Sphere escutar conexões TCP ou UDP de entrada, o manifesto do aplicativo deverá especificar as portas que o aplicativo usa. Por exemplo:

"Capabilities": {
  "AllowedTcpServerPorts": [ 11000 ],
  "AllowedUdpServerPorts": [ 1024, 50000 ]
} 

Amostras