ネットワーク サービスを使用する

Azure Sphere では、静的 IP アドレス、 動的ホスト構成プロトコル (DHCP) サーバー、およびネットワーク インターフェイス用の 単純なネットワーク タイム プロトコル (SNTP) サーバー を実行できます。 DHCP サーバーを使用すると、Azure Sphere アプリケーションでネットワーク上の外部デバイスのネットワーク パラメーターを構成できます。 外部デバイスは、SNTP サーバーを使用して、その時刻を Azure Sphere と同期できます。

ネットワーク構成

Azure Sphere デバイス上で同時に実行するように、イーサネットと Wi-Fi ネットワーク インターフェイスを構成できます。 イーサネットおよび Wi-Fi ネットワーク インターフェイスは、パブリック (インターネット接続) またはプライベート ネットワークに接続できます。 少なくとも 1 つのインターフェイスをパブリック ネットワークに接続する必要があります。 一度に構成できるイーサネット インターフェイスは 1 つだけです。

プライベート ネットワーク インターフェイスとパブリック ネットワーク インターフェイス

パブリック Wi-Fi でプライベート イーサネットなどのパブリック ネットワーク インターフェイスとプライベート ネットワーク インターフェイスの両方を使用する場合、Azure Sphere デバイスはルーターとして機能しません。 イーサネット ネットワークで受信したパケットは、Wi-Fi ネットワークに自動的には渡されません。その逆も同様です。 アプリケーションでは、両方のネットワークで情報を送受信するすべてのロジックを実装する必要があります。

デュアル パブリック ネットワーク インターフェイス

動的 IP アドレス指定が有効になっている 2 つのネットワーク インターフェイスを使用する場合、OS はホスト名解決のために DNS サーバー アドレスを選択するときに、ネットワークに接続されている最初のインターフェイスを使用しようとします。 インターフェイスがネットワークから切断された場合、他の接続インターフェイスからの DNS サーバー アドレスが自動的に使用されます。

静的 IP アドレス

イーサネットまたは Wi-Fi インターフェイスで静的 IP アドレスを構成できます。 静的 IP アドレス構成を設定するには、アプリケーションで applibs ネットワーク API を使用する必要があり、 アプリケーション マニフェストでNetworkConfig 機能を有効にする必要があります。

静的 IP アドレスを構成する場合は、Azure Sphere OS が引き続き期待どおりに機能するように カスタム DNS も設定する必要があります。

プライベート ネットワーク サービスのサンプルでは、Azure Sphere をプライベート ネットワークに接続し、複数のネットワーク サービスを使用する方法を示します。

このコード スニペットは、静的 IP アドレスを使用してネットワーク インターフェイスを構成する方法を示しています。

次のように、app_manifest.json ファイルの [Capabilities] セクションに次の行を含めます。

"Capabilities": {
  "NetworkConfig": true
}

アプリケーションに次のヘッダー ファイルを含めます。

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

IP 構成の 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.

構成するネットワーク インターフェイスを指定します。

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

ネットワーク アドレスを整数に変換し、これを指定されたネットワーク インターフェイスに適用します。

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

静的 DNS アドレス

静的 IP を使用してデバイスを構成し、名前解決を必要とする場合は、アプリケーションで静的 DNS アドレスを設定する必要があります。 Networking_IpConfig_EnableCustomDnsを使用し、1 つ以上の有効な DNS リゾルバーを設定します。 複数のリゾルバーが設定されている場合、それらはすべてクエリされ、最初の有効な DNS 応答がクエリを満たします。 Networking_IpConfig_EnableCustomDns は、DHCP を介して設定されている場合、現在のリゾルバーをオーバーライドするためにも使用できます。

カスタム DNS サーバーを使用してネットワーク インターフェイスを構成するには、アプリケーション マニフェストで NetworkConfig 機能を有効にする必要があります。

次のように、app_manifest.json ファイルの [Capabilities] セクションに次の行を含めます。

"Capabilities": {
  "NetworkConfig": true
}

このコード スニペットは、カスタム DNS サーバーを使用してネットワーク インターフェイスを構成する方法を示しています。

アプリケーションに次のヘッダー ファイルを含めます。

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

DNS サーバーの数を指定します。 最大 3 つの DNS サーバーを指定できます。 次のコードでは、使用する 3 つの DNS サーバー IP アドレスの配列を設定します。

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

構成するネットワーク インターフェイスを指定します。

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

ネットワーク アドレスを整数に変換し、構成を適用します。 この DNS 構成は、DHCP によって指定されたすべての DNS サーバーをオーバーライドします。

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 サーバー

イーサネット インターフェイスを介して Azure Sphere に接続されている外部クライアント デバイスには、Azure Sphere デバイス上のサーバー アプリケーションと通信できるように、IP アドレスとその他のネットワーク パラメーターを割り当てる必要があります。 ただし、一部の外部デバイスでは、これらのパラメーターを構成する方法がサポートされていません。 Azure Sphere では、アプリケーションがこの構成を提供できる DHCP サーバーがサポートされています。 アプリケーションマニフェストDhcpService 機能を有効にする必要があります。

Azure Sphere アプリケーションは Networking_DhcpServerConfig_Init を呼び出して、IP アドレス、サブネット マスク、ゲートウェイ アドレス、リース期間、最大 3 つの NTP サーバー アドレスをクライアント デバイスに提供するようにサーバーを構成します。 現在のリリースで構成できる IP アドレスは 1 つだけです。 その後、 Networking_DhcpServer_Start を呼び出して、特定のネットワーク インターフェイスでサーバーを起動します。 DHCP サーバーが起動した後、クライアント デバイスはブロードキャスト DHCP メッセージを送信して、指定されたサブネット上の DHCP サーバーから IP アドレスを検出して要求できます。

SNTP サーバー

SNTP サーバーを使用すると、クライアント デバイスはシステム時刻を Azure Sphere デバイスのシステム時刻と同期できます。 サーバーを使用するには、Azure Sphere アプリケーションで、そのアプリケーション マニフェストSntpService 機能を有効にする必要があります。

サーバーを起動するために、Azure Sphere アプリケーションは Networking_SntpServer_Start を呼び出し、サーバーを実行するネットワーク インターフェイスを指定します。 クライアント デバイスと Azure Sphere デバイスは、サーバーが実行されているネットワークの同じローカル サブネット内にある必要があります。 パブリック ネットワーク タイム プロトコル (NTP) サーバーから現在の時刻を取得できるように、Azure Sphere デバイスを少なくとも 1 つのパブリック ネットワークに接続する必要があります。 SNTP サーバーは、現在の時刻になるまでクエリに応答しません。

メモ

アプリケーションはシステム時刻を直接設定できますが、デバイスの電源が失われると時間が保持されないため、これはお勧めしません。 システム時刻を管理し、Azure Sphere 上の RTC に関する 詳細情報が表示されます。

リッスン ポート

Azure Sphere アプリケーションが受信 TCP または UDP 接続をリッスンする場合、 アプリケーション マニフェストは アプリケーションで使用するポートを指定する必要があります。 例えば:

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

サンプル