Partilhar via


Utilizar serviços de rede

O Azure Sphere pode executar um endereço IP estático, um servidor dhCP (dynamic host configuration protocol) e um servidor de protocolo SNTP (network time protocol) simples para uma interface de rede. O servidor DHCP permite que as aplicações do Azure Sphere configurem parâmetros de rede para um dispositivo externo na rede. O dispositivo externo pode utilizar o servidor SNTP para sincronizar o tempo com o Azure Sphere.

Configuração de rede

Pode configurar uma interface de rede Ethernet e Wi-Fi para ser executada em simultâneo num dispositivo do Azure Sphere. As interfaces de rede Ethernet e Wi-Fi podem ser ligadas a redes públicas (ligadas à Internet) ou privadas. Pelo menos uma interface tem de estar ligada a uma rede pública. Só é possível configurar uma interface Ethernet de cada vez.

Interfaces de rede privada e pública

Se utilizar interfaces de rede públicas e privadas, como o Ethernet privado com Wi-Fi público, o dispositivo do Azure Sphere não funcionará como router. Não transmitirá automaticamente pacotes recebidos na rede Ethernet para a rede Wi-Fi ou vice-versa. A sua aplicação tem de implementar toda a lógica que envia e recebe informações em ambas as redes.

Interfaces de rede pública dupla

Se utilizar duas interfaces de rede que têm o endereçamento IP dinâmico ativado, o SO tenta utilizar a primeira interface que ligou à rede quando seleciona endereços de servidor DNS para resolução de nomes de anfitrião. Se uma interface se desligar da rede, os endereços do servidor DNS da outra interface ligada são utilizados automaticamente.

Endereço IP estático

Pode configurar um endereço IP estático numa interface Ethernet ou Wi-Fi. Para configurar uma configuração de endereço IP estático, a aplicação tem de utilizar a API de rede applibs e o manifesto da aplicação tem de ativar a capacidade NetworkConfig .

Ao configurar um endereço IP estático, o DNS personalizado também tem de ser definido para garantir que o SO do Azure Sphere continua a funcionar conforme esperado.

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

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

Inclua a seguinte linha na secção Capacidades do ficheiro app_manifest.json da seguinte forma:

"Capabilities": {
  "NetworkConfig": true
}

Inclua estes ficheiros de cabeçalho na sua aplicação:

#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 do 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 configurar:

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

Converta os endereços de rede em números 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 tiver configurado um dispositivo com um IP estático e necessitar de resolução de nomes, a aplicação tem de definir um endereço DNS estático. Utilize Networking_IpConfig_EnableCustomDns e defina uma ou mais resoluções DNS válidas. Se estiverem definidas várias resoluções, todas serão consultadas e a primeira resposta DNS válida irá satisfazer a consulta. Networking_IpConfig_EnableCustomDns também pode ser utilizado para substituir a resolução atual se uma estiver definida através de DHCP.

Para configurar uma interface de rede com servidores DNS personalizados, o manifesto de aplicação tem de ativar a capacidade NetworkConfig.

Inclua a seguinte linha na secção Capacidades do ficheiro app_manifest.json da seguinte forma:

"Capabilities": {
  "NetworkConfig": true
}

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

Inclua estes ficheiros de cabeçalho na sua aplicação:

#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. Pode especificar até três servidores DNS. O código seguinte configura a matriz de três endereços IP do servidor DNS a utilizar.

// 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 configurar.

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

Converta os endereços de rede em números inteiros e aplique a configuração. Esta configuração de 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 que esteja ligado ao Azure Sphere através de uma interface Ethernet tem de ter um endereço IP e outros parâmetros de rede para que possa comunicar com uma aplicação de servidor no dispositivo do Azure Sphere. No entanto, alguns dispositivos externos não suportam uma forma de configurar estes parâmetros. O Azure Sphere suporta um servidor DHCP através do qual uma aplicação pode fornecer esta configuração. A aplicação tem de ativar a capacidade DhcpService no respetivo manifesto de aplicação.

A aplicação do 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 da concessão e até três endereços de servidor NTP para um dispositivo cliente. Apenas um endereço IP pode ser configurado na versão atual. Em seguida, chama Networking_DhcpServer_Start para iniciar o servidor numa interface de rede específica. Após o início do servidor DHCP, o dispositivo cliente pode enviar mensagens DHCP de difusão para detetar e pedir 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 utilizar o servidor, a aplicação do Azure Sphere tem de ativar a capacidade SntpService no respetivo manifesto de aplicação.

Para iniciar o servidor, a aplicação do 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 têm de estar na mesma sub-rede local da rede na qual o servidor está em execução. O dispositivo do Azure Sphere tem de estar ligado a, pelo menos, uma rede pública, para que possa obter a hora atual a partir de um servidor de protocolo de tempo de rede pública (NTP). O servidor SNTP não responde às consultas até ter a hora atual.

Nota

Embora uma aplicação possa definir a hora do sistema diretamente, tal não é recomendado porque a hora não persiste quando o dispositivo perde energia. Faça a gestão da hora do sistema e o RTC no Azure Sphere tem mais informações.

Portas de escuta

Se a aplicação do Azure Sphere escutar as ligações TCP ou UDP recebidas, o manifesto da aplicação tem de especificar as portas que a aplicação utiliza. Por exemplo:

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

Exemplos