Usar servicios de red

Azure Sphere puede ejecutar una dirección IP estática, un servidor de protocolo de configuración dinámica de host (DHCP) y un servidor de protocolo de tiempo de red simple (SNTP) para una interfaz de red. El servidor DHCP permite a las aplicaciones de Azure Sphere configurar parámetros de red para un dispositivo externo en la red. El dispositivo externo puede usar el servidor SNTP para sincronizar su tiempo con Azure Sphere.

Configuración de red

Puede configurar una interfaz de red Ethernet y una Wi-Fi para que se ejecuten simultáneamente en un dispositivo Azure Sphere. Las interfaces de red Ethernet y Wi-Fi se pueden conectar a redes públicas (conectadas a Internet) o privadas. Al menos una interfaz debe estar conectada a una red pública. Solo se puede configurar una interfaz Ethernet a la vez.

Interfaces de red privada y pública

Si usa interfaces de red públicas y privadas, como Ethernet privada con Wi-Fi público, el dispositivo Azure Sphere no actuará como enrutador. No pasará automáticamente los paquetes recibidos en la red Ethernet a la red Wi-Fi, o viceversa. La aplicación debe implementar toda la lógica que envía y recibe información en ambas redes.

Interfaces de red pública duales

Si usted utiliza dos interfaces de red que tienen el direccionamiento IP dinámico habilitado, el sistema operativo intenta utilizar la primera interfaz conectada a la red cuando selecciona las direcciones del servidor DNS para la resolución de nombres de host. Si una interfaz se desconecta de la red, las direcciones del servidor DNS de la otra interfaz conectada se utilizan automáticamente.

Dirección IP estática

Puede configurar una dirección IP estática en una interfaz ethernet o de Wi-Fi. Para configurar una dirección IP estática, la aplicación debe usar la API de red applibs y el manifiesto de la aplicación debe habilitar la funcionalidad NetworkConfig .

Al configurar una dirección IP estática, el DNS personalizado también debe configurarse para garantizar que el SO Azure Sphere siga funcionando según lo esperado.

El ejemplo de Servicios de red privada muestra cómo conectar Azure Sphere a una red privada y usar varios servicios de red.

Este fragmento de código muestra cómo configurar una interfaz de red con una dirección IP estática.

Incluya la línea siguiente en la sección Capabilities del archivo app_manifest.json de la siguiente manera:

"Capabilities": {
  "NetworkConfig": true
}

Incluya estos archivos de encabezado en la aplicación:

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

Establezca la dirección IP, la máscara de subred y la puerta de enlace para la configuración 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 la interfaz de red que se va a configurar:

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

Convierta las direcciones de red a enteros y aplíctelas a la interfaz de red 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;
}

Dirección DNS estática

Si ha configurado un dispositivo con una dirección IP estática y necesita una resolución de nombres, la aplicación debe establecer una dirección DNS estática. Use Networking_IpConfig_EnableCustomDns y establezca uno o varios solucionadores de DNS válidos. Si se establecen varios solucionadores, todos se consultarán y la primera respuesta DNS válida cumplirá la consulta. Networking_IpConfig_EnableCustomDns también se puede usar para invalidar la resolución actual si se establece a través de DHCP.

Para configurar una interfaz de red con servidores DNS personalizados, el manifiesto de la aplicación debe habilitar la funcionalidad NetworkConfig.

Incluya la línea siguiente en la sección Capabilities del archivo app_manifest.json de la siguiente manera:

"Capabilities": {
  "NetworkConfig": true
}

Este fragmento de código muestra cómo configurar una interfaz de red con servidores DNS personalizados.

Incluya estos archivos de encabezado en la aplicación:

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

Especifique el número de servidores DNS. Se pueden especificar hasta tres servidores DNS. El código siguiente configura la matriz de tres direcciones IP del servidor DNS que se va a usar.

// 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 la interfaz de red que se va a configurar.

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

Convierta las direcciones de red en enteros y aplique la configuración. Esta configuración DNS reemplaza los servidores DNS especificados por 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

Un dispositivo cliente externo conectado a Azure Sphere a través de una interfaz Ethernet debe tener asignada una dirección IP y otros parámetros de red para que pueda comunicarse con una aplicación de servidor en el dispositivo Azure Sphere. Sin embargo, algunos dispositivos externos no admiten una forma de configurar estos parámetros. Azure Sphere admite un servidor DHCP a través del cual una aplicación puede proporcionar esta configuración. La aplicación debe habilitar la funcionalidad DhcpService en el manifiesto de la aplicación.

La aplicación Azure Sphere llama a Networking_DhcpServerConfig_Init configurar el servidor para proporcionar una dirección IP, una máscara de subred, una dirección de puerta de enlace, una duración de concesión y hasta tres direcciones de servidor NTP a un dispositivo cliente. Solo se puede configurar una dirección IP en la versión actual. A continuación, llama a Networking_DhcpServer_Start para iniciar el servidor en una interfaz de red determinada. Después de que se inicie el servidor DHCP, el dispositivo cliente puede enviar mensajes DHCP de difusión para detectar y solicitar direcciones IP del servidor DHCP en la subred especificada.

Servidor SNTP

El servidor SNTP permite que los dispositivos cliente sincronicen la hora del sistema con la del dispositivo Azure Sphere. Para usar el servidor, la aplicación Azure Sphere debe habilitar la funcionalidad SntpService en el manifiesto de la aplicación.

Para iniciar el servidor, la aplicación Azure Sphere llama a Networking_SntpServer_Start y especifica la interfaz de red en la que se ejecutará el servidor. El dispositivo cliente y el dispositivo Azure Sphere deben estar en la misma subred local de la red en la que se está ejecutando el servidor. El dispositivo Azure Sphere debe estar conectado al menos a una red pública, para que pueda obtener la hora actual desde un servidor de protocolo de tiempo de red pública (NTP). El servidor SNTP no responde a las consultas hasta que tenga el tiempo actual.

Nota

Aunque una aplicación puede establecer la hora del sistema directamente, esto no se recomienda porque el tiempo no se conserva cuando el dispositivo pierde energía. Administre el tiempo del sistema y el RTC en Azure Sphere tiene más información.

Puertos de escucha

Si la aplicación Azure Sphere escucha conexiones TCP o UDP entrantes, el manifiesto de la aplicación debe especificar los puertos que usa la aplicación. Por ejemplo:

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

Muestras