Utiliser les services réseau

Azure Sphere peut exécuter une adresse IP statique, un serveur DHCP (Dynamic Host Configuration Protocol) et un serveur SNTP (Simple Network Time Protocol) pour une interface réseau. Le serveur DHCP permet aux applications Azure Sphere de configurer les paramètres réseau d’un appareil externe sur le réseau. L’appareil externe peut utiliser le serveur SNTP pour synchroniser son heure avec Azure Sphere.

Configuration réseau

Vous pouvez configurer une interface réseau Ethernet et Wi-Fi pour qu’elles s’exécutent simultanément sur un appareil Azure Sphere. Les interfaces réseau Ethernet et Wi-Fi peuvent être connectées à des réseaux publics (connectés à Internet) ou privés. Au moins une interface doit être connectée à un réseau public. Une seule interface Ethernet peut être configurée à la fois.

Interfaces réseau privées et publiques

Si vous utilisez des interfaces réseau publiques et privées, telles qu’Ethernet privé avec wi-fi public, l’appareil Azure Sphere n’agit pas en tant que routeur. Il ne transmet pas automatiquement les paquets reçus sur le réseau Ethernet au réseau Wi-Fi, ou vice versa. Votre application doit implémenter toute la logique qui envoie et reçoit des informations sur les deux réseaux.

Interfaces réseau publiques doubles

Si vous utilisez deux interfaces réseau pour lesquelles l’adressage IP dynamique est activé, le système d’exploitation tente d’utiliser la première interface qui s’est connectée au réseau lorsqu’il sélectionne les adresses de serveur DNS pour la résolution de noms d’hôte. Si une interface se déconnecte du réseau, les adresses du serveur DNS de l’autre interface connectée sont automatiquement utilisées.

Adresse IP statique

Vous pouvez configurer une adresse IP statique sur une interface Ethernet ou Wi-Fi. Pour configurer une configuration d’adresse IP statique, votre application doit utiliser l’API réseau des bibliothèques d’applications et le manifeste de l’application doit activer la fonctionnalité NetworkConfig .

Lors de la configuration d’une adresse IP statique, le DNS personnalisé doit également être défini pour garantir que le système d’exploitation Azure Sphere continue de fonctionner comme prévu.

L’exemple Private Network Services montre comment connecter Azure Sphere à un réseau privé et utiliser plusieurs services réseau.

Cet extrait de code montre comment configurer une interface réseau avec une adresse IP statique.

Incluez la ligne suivante dans la section Fonctionnalités du fichier app_manifest.json comme suit :

"Capabilities": {
  "NetworkConfig": true
}

Incluez ces fichiers d’en-tête dans votre application :

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

Définissez l’adresse IP, le masque de sous-réseau et la passerelle pour la configuration 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.

Spécifiez l’interface réseau à configurer :

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

Convertissez les adresses réseau en entiers et appliquez-les à l’interface réseau spécifiée.

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

Adresse DNS statique

Si vous avez configuré un appareil avec une adresse IP statique et que vous avez besoin d’une résolution de noms, votre application doit définir une adresse DNS statique. Utilisez Networking_IpConfig_EnableCustomDns et définissez un ou plusieurs programmes de résolution DNS valides. Si plusieurs programmes de résolution sont définis, ils sont tous interrogés et la première réponse DNS valide répond à la requête. Networking_IpConfig_EnableCustomDns peut également être utilisé pour remplacer le programme de résolution actuel s’il est défini via DHCP.

Pour configurer une interface réseau avec des serveurs DNS personnalisés, le manifeste de l’application doit activer la fonctionnalité NetworkConfig.

Incluez la ligne suivante dans la section Fonctionnalités du fichier app_manifest.json comme suit :

"Capabilities": {
  "NetworkConfig": true
}

Cet extrait de code montre comment configurer une interface réseau avec des serveurs DNS personnalisés.

Incluez ces fichiers d’en-tête dans votre application :

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

Spécifiez le nombre de serveurs DNS. Jusqu’à trois serveurs DNS peuvent être spécifiés. Le code suivant configure le tableau de trois adresses IP de serveur DNS à utiliser.

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

Spécifiez l’interface réseau à configurer.

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

Convertissez les adresses réseau en entiers et appliquez la configuration. Cette configuration DNS remplace tous les serveurs DNS spécifiés par 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;
}

Serveur DHCP

Un appareil client externe connecté à Azure Sphere via une interface Ethernet doit se voir attribuer une adresse IP et d’autres paramètres réseau afin qu’il puisse communiquer avec une application serveur sur l’appareil Azure Sphere. Toutefois, certains appareils externes ne prennent pas en charge un moyen de configurer ces paramètres. Azure Sphere prend en charge un serveur DHCP par le biais duquel une application peut fournir cette configuration. L’application doit activer la fonctionnalité DhcpService dans son manifeste d’application.

L’application Azure Sphere appelle Networking_DhcpServerConfig_Init pour configurer le serveur afin de fournir une adresse IP, un masque de sous-réseau, une adresse de passerelle, une durée de bail et jusqu’à trois adresses de serveur NTP à un appareil client. Une seule adresse IP peut être configurée dans la version actuelle. Il appelle ensuite Networking_DhcpServer_Start pour démarrer le serveur sur une interface réseau particulière. Une fois le serveur DHCP démarré, l’appareil client peut envoyer des messages DHCP de diffusion pour découvrir et demander des adresses IP au serveur DHCP sur le sous-réseau spécifié.

Serveur SNTP

Le serveur SNTP permet aux appareils clients de synchroniser leur heure système avec celle de l’appareil Azure Sphere. Pour utiliser le serveur, l’application Azure Sphere doit activer la fonctionnalité SntpService dans son manifeste d’application.

Pour démarrer le serveur, l’application Azure Sphere appelle Networking_SntpServer_Start et spécifie l’interface réseau sur laquelle le serveur s’exécutera. L’appareil client et l’appareil Azure Sphere doivent se trouver dans le même sous-réseau local du réseau sur lequel le serveur s’exécute. L’appareil Azure Sphere doit être connecté à au moins un réseau public, afin qu’il puisse obtenir l’heure actuelle à partir d’un serveur NTP (Public Network Time Protocol). Le serveur SNTP ne répond pas aux requêtes tant qu’il n’a pas l’heure actuelle.

Note

Bien qu’une application puisse définir l’heure système directement, cela n’est pas recommandé, car l’heure ne persiste pas lorsque l’appareil perd de l’alimentation. Gérer le temps système et le RTC sur Azure Sphere contient plus d’informations.

Ports d’écoute

Si l’application Azure Sphere écoute les connexions TCP ou UDP entrantes, le manifeste de l’application doit spécifier les ports utilisés par l’application. Par exemple :

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

Échantillons