네트워크 서비스 사용

Azure Sphere는 네트워크 인터페이스에 대해 고정 IP 주소, DHCP(동적 호스트 구성 프로토콜) 서버간단한 SNTP(네트워크 시간 프로토콜) 서버를 실행할 수 있습니다. DHCP 서버를 사용하면 Azure Sphere 애플리케이션이 네트워크의 외부 디바이스에 대한 네트워크 매개 변수를 구성할 수 있습니다. 외부 디바이스는 SNTP 서버를 사용하여 시간을 Azure Sphere와 동기화할 수 있습니다.

네트워크 구성

Azure Sphere 디바이스에서 동시에 실행되도록 이더넷 및 Wi-Fi 네트워크 인터페이스를 구성할 수 있습니다. 이더넷 및 Wi-Fi 네트워크 인터페이스는 공용(인터넷에 연결됨) 또는 프라이빗 네트워크에 연결할 수 있습니다. 하나 이상의 인터페이스를 공용 네트워크에 연결해야 합니다. 한 번에 하나의 이더넷 인터페이스만 구성할 수 있습니다.

프라이빗 및 공용 네트워크 인터페이스

공용 Wi-Fi를 사용하는 프라이빗 이더넷과 같은 퍼블릭 및 프라이빗 네트워크 인터페이스를 모두 사용하는 경우 Azure Sphere 디바이스는 라우터 역할을 하지 않습니다. 이더넷 네트워크에서 받은 패킷을 Wi-Fi 네트워크에 자동으로 전달하지 않거나 그 반대의 경우도 마찬가지입니다. 애플리케이션은 두 네트워크에서 정보를 보내고 받는 모든 논리를 구현해야 합니다.

이중 공용 네트워크 인터페이스

동적 IP 주소 지정을 사용하도록 설정된 두 개의 네트워크 인터페이스를 사용하는 경우 OS는 호스트 이름 확인을 위해 DNS 서버 주소를 선택할 때 네트워크에 연결된 첫 번째 인터페이스를 사용하려고 시도합니다. 인터페이스가 네트워크에서 연결이 끊어지면 연결된 다른 인터페이스의 DNS 서버 주소가 자동으로 사용됩니다.

고정 IP 주소

이더넷 또는 Wi-Fi 인터페이스에서 고정 IP 주소를 구성할 수 있습니다. 고정 IP 주소 구성을 설정하려면 애플리케이션에서 applibs 네트워킹 API를 사용해야 하며 애플리케이션 매니페스트NetworkConfig 기능을 사용하도록 설정해야 합니다.

고정 IP 주소를 구성할 때 Azure Sphere OS가 예상대로 계속 작동하도록 사용자 지정 DNS 도 설정해야 합니다.

Private Network Services 샘플에서는 Azure Sphere를 프라이빗 네트워크에 연결하고 여러 네트워크 서비스를 사용하는 방법을 보여 줍니다.

이 코드 조각은 고정 IP 주소를 사용하여 네트워크 인터페이스를 구성하는 방법을 보여 줍니다.

다음과 같이 app_manifest.json 파일의 기능 섹션에 다음 줄을 포함합니다.

"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 사용하고 하나 이상의 유효한 DNS 확인자를 설정합니다. 여러 확인자가 설정된 경우 모두 쿼리되고 첫 번째 유효한 DNS 응답이 쿼리를 충족합니다. Networking_IpConfig_EnableCustomDns DHCP를 통해 설정된 경우 현재 확인자를 재정의하는 데 사용할 수도 있습니다.

사용자 지정 DNS 서버를 사용하여 네트워크 인터페이스를 구성하려면 애플리케이션 매니페스트가 NetworkConfig 기능을 사용하도록 설정해야 합니다.

다음과 같이 app_manifest.json 파일의 기능 섹션에 다음 줄을 포함합니다.

"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 서버를 지정할 수 있습니다. 다음 코드는 사용할 세 개의 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 주소만 구성할 수 있습니다. 그런 다음 Networking_DhcpServer_Start 호출하여 특정 네트워크 인터페이스에서 서버를 시작합니다. DHCP 서버가 시작된 후 클라이언트 디바이스는 브로드캐스트 DHCP 메시지를 보내 지정된 서브넷의 DHCP 서버에서 IP 주소를 검색하고 요청할 수 있습니다.

SNTP 서버

SNTP 서버를 사용하면 클라이언트 디바이스가 시스템 시간을 Azure Sphere 디바이스와 동기화할 수 있습니다. 서버를 사용하려면 Azure Sphere 애플리케이션이 애플리케이션 매니페스트에서 SntpService 기능을 사용하도록 설정해야 합니다.

서버를 시작하기 위해 Azure Sphere 애플리케이션은 Networking_SntpServer_Start 호출하고 서버가 실행될 네트워크 인터페이스를 지정합니다. 클라이언트 디바이스와 Azure Sphere 디바이스는 서버가 실행 중인 네트워크의 동일한 로컬 서브넷에 있어야 합니다. NTP(공용 네트워크 시간 프로토콜) 서버에서 현재 시간을 가져올 수 있도록 Azure Sphere 디바이스를 하나 이상의 공용 네트워크에 연결해야 합니다. SNTP 서버는 현재 시간이 될 때까지 쿼리에 응답하지 않습니다.

참고

애플리케이션은 시스템 시간을 직접 설정할 수 있지만 디바이스 전원이 끊어질 때 시간이 지속되지 않으므로 권장되지 않습니다. 시스템 시간 관리 및 Azure Sphere의 RTC에 자세한 정보가 있습니다.

수신 대기 포트

Azure Sphere 애플리케이션이 들어오는 TCP 또는 UDP 연결을 수신 대기하는 경우 애플리케이션 매니페스트는 애플리케이션 에서 사용하는 포트를 지정해야 합니다. 예를 들어:

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

샘플

  • DNS 서비스 검색 샘플은 DNS 서버에서 응답을 쿼리하고 처리하는 방법을 보여 줍니다.
  • Private Network Services 샘플에서는 Azure Sphere를 프라이빗 네트워크에 연결하고 여러 네트워크 서비스를 사용하는 방법을 보여 줍니다.