Usare i servizi di rete

Azure Sphere può eseguire un indirizzo IP statico, un server DHCP (Dynamic Host Configuration Protocol) e un server SNTP (Simple Network Time Protocol) per un'interfaccia di rete. Il server DHCP consente alle applicazioni Azure Sphere di configurare i parametri di rete per un dispositivo esterno in rete. Il dispositivo esterno può utilizzare il server SNTP per sincronizzare il proprio tempo con Azure Sphere.

Configurazione della rete

È possibile configurare un ethernet e un'interfaccia di rete Wi-Fi per l'esecuzione simultanea su un dispositivo Azure Sphere. Le interfacce di rete Ethernet e Wi-Fi possono essere connesse a reti pubbliche (connesse a Internet) o private. Almeno un'interfaccia deve essere connessa a una rete pubblica. È possibile configurare una sola interfaccia Ethernet alla volta.

Interfacce di rete private e pubbliche

Se si utilizzano sia interfacce di rete pubbliche che private, ad esempio Ethernet privato con Wi-Fi pubblico, il dispositivo Azure Sphere non fungerà da router. Non passerà automaticamente i pacchetti ricevuti sulla rete Ethernet alla rete Wi-Fi o viceversa. L'applicazione deve implementare tutta la logica che invia e riceve informazioni su entrambe le reti.

Interfacce di doppia rete pubblica

Se si utilizzano due interfacce di rete con indirizzi IP dinamici abilitati, il sistema operativo tenta di utilizzare la prima interfaccia connessa alla rete quando seleziona gli indirizzi server DNS per la risoluzione dei nomi host. Se un'interfaccia si disconnette dalla rete, vengono usati automaticamente gli indirizzi del server DNS dall'altra interfaccia connessa.

Indirizzo IP statico

È possibile configurare un indirizzo IP statico in un'interfaccia Ethernet o Wi-Fi. Per configurare una configurazione dell'indirizzo IP statico, l'applicazione deve utilizzare l'API di rete applicata e il manifesto dell'applicazione deve abilitare la funzionalità NetworkConfig .

Quando si configura un indirizzo IP statico, è necessario impostare anche il DNS personalizzato per assicurarsi che il sistema operativo Azure Sphere continui a funzionare come previsto.

Nell'esempio Servizi di rete privati viene illustrato come connettere Azure Sphere a una rete privata e usare diversi servizi di rete.

Questo frammento di codice illustra come configurare un'interfaccia di rete con un indirizzo IP statico.

Includere la riga seguente nella sezione Funzionalità del file app_manifest.json nel modo seguente:

"Capabilities": {
  "NetworkConfig": true
}

Includere questi file di intestazione nell'applicazione:

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

Impostare l'indirizzo IP, la subnet mask e il gateway per la configurazione 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.

Specificare l'interfaccia di rete da configurare:

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

Convertire gli indirizzi di rete in numeri interi e applicarli all'interfaccia di rete specificata.

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;
}

Indirizzo DNS statico

Se è stato configurato un dispositivo con un IP statico e viene richiesta la risoluzione dei nomi, l'applicazione deve impostare un indirizzo DNS statico. Usare Networking_IpConfig_EnableCustomDns e impostare uno o più resolver DNS validi. Se sono impostati più resolver, verranno tutti sottoposti a query e la prima risposta DNS valida soddisferà la query. Networking_IpConfig_EnableCustomDns può essere utilizzato anche per eseguire l'override del resolver corrente, se uno è impostato tramite DHCP.

Per configurare un'interfaccia di rete con server DNS personalizzati, il manifesto dell'applicazione deve abilitare la funzionalità NetworkConfig.

Includere la riga seguente nella sezione Funzionalità del file app_manifest.json nel modo seguente:

"Capabilities": {
  "NetworkConfig": true
}

Questo frammento di codice illustra come configurare un'interfaccia di rete con server DNS personalizzati.

Includere questi file di intestazione nell'applicazione:

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

Specificare il numero di server DNS. È possibile specificare fino a tre server DNS. Il codice seguente configura la matrice di tre indirizzi IP del server DNS da utilizzare.

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

Specificare l'interfaccia di rete da configurare.

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

Convertire gli indirizzi di rete in numeri interi e applicare la configurazione. Questa configurazione DNS esegue l'override di tutti i server DNS specificati da 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;
}

Server DHCP

A un dispositivo client esterno connesso ad Azure Sphere tramite un'interfaccia Ethernet deve essere assegnato un indirizzo IP e altri parametri di rete in modo che possa comunicare con un'applicazione server sul dispositivo Azure Sphere. Tuttavia, alcuni dispositivi esterni non supportano un modo per configurare questi parametri. Azure Sphere supporta un server DHCP tramite il quale un'applicazione può fornire questa configurazione. L'applicazione deve abilitare la funzionalità DhcpService nel manifesto dell'applicazione.

L'applicazione Azure Sphere chiama Networking_DhcpServerConfig_Init per configurare il server in modo da fornire un indirizzo IP, una subnet mask, un indirizzo gateway, una durata del lease e fino a tre indirizzi server NTP a un dispositivo client. Nella versione corrente è possibile configurare un solo indirizzo IP. Chiama quindi Networking_DhcpServer_Start per avviare il server su una particolare interfaccia di rete. Dopo l'avvio del server DHCP, il dispositivo client può inviare messaggi DHCP di trasmissione per individuare e richiedere gli indirizzi IP dal server DHCP nella subnet specificata.

Server SNTP

Il server SNTP consente ai dispositivi client di sincronizzare l'ora di sistema con quella del dispositivo Azure Sphere. Per usare il server, l'applicazione Azure Sphere deve abilitare la funzionalità SntpService nel manifesto dell'applicazione.

Per avviare il server, l'applicazione Azure Sphere chiama Networking_SntpServer_Start e specifica l'interfaccia di rete su cui verrà eseguito il server. Il dispositivo client e il dispositivo Azure Sphere devono trovarsi nella stessa subnet locale della rete in cui è in esecuzione il server. Il dispositivo Azure Sphere deve essere connesso ad almeno una rete pubblica, in modo che possa ottenere l'ora corrente da un server NTP (Public Network Time Protocol). Il server SNTP non risponde alle query fino a quando non ha l'ora corrente.

Nota

Anche se un'applicazione può impostare direttamente il tempo di sistema, non è consigliabile, perché l'ora non persiste quando il dispositivo perde l'alimentazione. Gestisci l'ora del sistema e RTC su Azure Sphere contiene ulteriori informazioni.

Porte di ascolto

Se l'applicazione Azure Sphere è in ascolto delle connessioni TCP o UDP in ingresso, il manifesto dell'applicazione deve specificare le porte utilizzate dall'applicazione. Per esempio:

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

Campioni