Verwenden von Netzwerkdiensten

Azure Sphere kann eine statische IP-Adresse, einen DHCP-Server (Dynamic Host Configuration Protocol) und einen einfachen SNTP-Server (Network Time Protocol) für eine Netzwerkschnittstelle ausführen. Der DHCP-Server ermöglicht Es Azure Sphere-Anwendungen, Netzwerkparameter für ein externes Gerät im Netzwerk zu konfigurieren. Das externe Gerät kann den SNTP-Server verwenden, um seine Zeit mit Azure Sphere zu synchronisieren.

Netzwerkkonfiguration

Sie können eine Ethernet- und eine Wi-Fi Netzwerkschnittstelle so konfigurieren, dass sie gleichzeitig auf einem Azure Sphere-Gerät ausgeführt werden. Ethernet- und Wi-Fi Netzwerkschnittstellen können mit öffentlichen (ins Internet verbundenen) oder privaten Netzwerken verbunden werden. Mindestens eine Schnittstelle muss mit einem öffentlichen Netzwerk verbunden sein. Es kann jeweils nur eine Ethernet-Schnittstelle konfiguriert werden.

Private und öffentliche Netzwerkschnittstellen

Wenn Sie sowohl öffentliche als auch private Netzwerkschnittstellen verwenden, z. B. privates Ethernet mit öffentlichem WLAN, fungiert das Azure Sphere-Gerät nicht als Router. Pakete, die im Ethernet-Netzwerk empfangen werden, werden nicht automatisch an das Wi-Fi Netzwerk übergeben oder umgekehrt. Ihre Anwendung muss die gesamte Logik implementieren, die Informationen in beiden Netzwerken sendet und empfängt.

Duale öffentliche Netzwerkschnittstellen

Wenn Sie zwei Netzwerkschnittstellen verwenden, für die die dynamische IP-Adressierung aktiviert ist, versucht das Betriebssystem, die erste Schnittstelle zu verwenden, die mit dem Netzwerk verbunden ist, wenn es DNS-Serveradressen für die Hostnamenauflösung auswählt. Wenn eine Schnittstelle die Verbindung mit dem Netzwerk trennt, werden die DNS-Serveradressen der anderen verbundenen Schnittstelle automatisch verwendet.

Statische IP-Adresse

Sie können eine statische IP-Adresse auf einer Ethernet- oder Wi-Fi-Schnittstelle konfigurieren. Zum Einrichten einer statischen IP-Adresskonfiguration muss Ihre Anwendung die Applibs-Netzwerk-API verwenden, und das Anwendungsmanifest muss die NetworkConfig-Funktion aktivieren.

Beim Konfigurieren einer statischen IP-Adresse muss auch benutzerdefiniertes DNS festgelegt werden, um sicherzustellen, dass das Azure Sphere-Betriebssystem weiterhin wie erwartet funktioniert.

Im Beispiel private Netzwerkdienste wird veranschaulicht, wie Sie Azure Sphere mit einem privaten Netzwerk verbinden und mehrere Netzwerkdienste verwenden.

In diesem Codeausschnitt wird veranschaulicht, wie eine Netzwerkschnittstelle mit einer statischen IP-Adresse konfiguriert wird.

Fügen Sie die folgende Zeile wie folgt in den Abschnitt Capabilities der Datei app_manifest.json ein:

"Capabilities": {
  "NetworkConfig": true
}

Fügen Sie diese Headerdateien in Ihre Anwendung ein:

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

Legen Sie die IP-Adresse, die Subnetzmaske und das Gateway für die IP-Konfiguration fest.

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.

Geben Sie die zu konfigurierende Netzwerkschnittstelle an:

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

Konvertieren Sie die Netzwerkadressen in ganze Zahlen, und wenden Sie dies auf die angegebene Netzwerkschnittstelle an.

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

Statische DNS-Adresse

Wenn Sie ein Gerät mit einer statischen IP-Adresse konfiguriert haben und eine Namensauflösung benötigen, muss Ihre Anwendung eine statische DNS-Adresse festlegen. Verwenden Sie Networking_IpConfig_EnableCustomDns , und legen Sie mindestens einen gültigen DNS-Resolver fest. Wenn mehrere Resolver festgelegt sind, werden sie alle abgefragt, und die erste gültige DNS-Antwort erfüllt die Abfrage. Networking_IpConfig_EnableCustomDns kann auch verwendet werden, um den aktuellen Konfliktlöser zu überschreiben, wenn dieser über DHCP festgelegt wird.

Um eine Netzwerkschnittstelle mit benutzerdefinierten DNS-Servern zu konfigurieren, muss das Anwendungsmanifest die NetworkConfig-Funktion aktivieren.

Fügen Sie die folgende Zeile wie folgt in den Abschnitt Capabilities der Datei app_manifest.json ein:

"Capabilities": {
  "NetworkConfig": true
}

Dieser Codeausschnitt veranschaulicht das Konfigurieren einer Netzwerkschnittstelle mit benutzerdefinierten DNS-Servern.

Fügen Sie diese Headerdateien in Ihre Anwendung ein:

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

Geben Sie die Anzahl der DNS-Server an. Es können bis zu drei DNS-Server angegeben werden. Der folgende Code richtet das Array von drei zu verwendenden DNS-Server-IP-Adressen ein.

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

Geben Sie die zu konfigurierende Netzwerkschnittstelle an.

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

Konvertieren Sie die Netzwerkadressen in ganze Zahlen, und wenden Sie die Konfiguration an. Diese DNS-Konfiguration setzt alle von DHCP angegebenen DNS-Server außer Kraft.

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

DHCP-Server

Einem externen Clientgerät, das über eine Ethernet-Schnittstelle mit Azure Sphere verbunden ist, müssen eine IP-Adresse und andere Netzwerkparameter zugewiesen werden, damit es mit einer Serveranwendung auf dem Azure Sphere-Gerät kommunizieren kann. Einige externe Geräte unterstützen jedoch keine Möglichkeit, diese Parameter zu konfigurieren. Azure Sphere unterstützt einen DHCP-Server, über den eine Anwendung diese Konfiguration bereitstellen kann. Die Anwendung muss die DhcpService-Funktion in ihrem Anwendungsmanifest aktivieren.

Die Azure Sphere-Anwendung ruft Networking_DhcpServerConfig_Init auf, um den Server so zu konfigurieren, dass er eine IP-Adresse, eine Subnetzmaske, eine Gatewayadresse, eine Leasedauer und bis zu drei NTP-Serveradressen für ein Clientgerät bereitstellt. In der aktuellen Version kann nur eine IP-Adresse konfiguriert werden. Anschließend wird Networking_DhcpServer_Start aufgerufen, um den Server auf einer bestimmten Netzwerkschnittstelle zu starten. Nachdem der DHCP-Server gestartet wurde, kann das Clientgerät DHCP-Broadcastnachrichten senden, um IP-Adressen vom DHCP-Server im angegebenen Subnetz zu ermitteln und anzufordern.

SNTP-Server

Der SNTP-Server ermöglicht Es Clientgeräten, ihre Systemzeit mit der des Azure Sphere-Geräts zu synchronisieren. Um den Server verwenden zu können, muss die Azure Sphere-Anwendung die SntpService-Funktion in ihrem Anwendungsmanifest aktivieren.

Zum Starten des Servers ruft die Azure Sphere-Anwendung Networking_SntpServer_Start auf und gibt die Netzwerkschnittstelle an, auf der der Server ausgeführt wird. Das Clientgerät und das Azure Sphere-Gerät müssen sich im selben lokalen Subnetz des Netzwerks befinden, in dem der Server ausgeführt wird. Das Azure Sphere-Gerät muss mit mindestens einem öffentlichen Netzwerk verbunden sein, damit es die aktuelle Zeit von einem NTP-Server (Public Network Time Protocol) abrufen kann. Der SNTP-Server reagiert erst dann auf Abfragen, wenn er die aktuelle Uhrzeit hat.

Hinweis

Obwohl eine Anwendung die Systemzeit direkt festlegen kann, wird dies nicht empfohlen, da die Zeit nicht beibehalten wird, wenn das Gerät die Stromversorgung verliert. Verwalten der Systemzeit und der RTC in Azure Sphere enthält weitere Informationen.

Überwachungsports

Wenn die Azure Sphere-Anwendung auf eingehende TCP- oder UDP-Verbindungen lauscht, muss das Anwendungsmanifest die ports angeben, die die Anwendung verwendet. Zum Beispiel:

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

Proben

  • Im Beispiel für die DNS-Dienstermittlung wird veranschaulicht, wie Antworten von einem DNS-Server abgerufen und verarbeitet werden.
  • Im Beispiel private Netzwerkdienste wird veranschaulicht, wie Sie Azure Sphere mit einem privaten Netzwerk verbinden und mehrere Netzwerkdienste verwenden.