使用网络服务

Azure Sphere 可以运行静态 IP 地址、 动态主机配置协议 (DHCP) 服务器,以及用于网络接口 的简单网络时间协议 (SNTP) 服务器 。 DHCP 服务器允许 Azure Sphere 应用程序为网络上的外部设备配置网络参数。 外部设备可以使用 SNTP 服务器将其时间与 Azure Sphere 同步。

网络配置

可以将以太网和 Wi-Fi 网络接口配置为在 Azure Sphere 设备上同时运行。 以太网和 Wi-Fi 网络接口可以连接到公共 (Internet 连接) 或专用网络。 必须至少有一个接口连接到公用网络。 一次只能配置一个以太网接口。

专用和公用网络接口

如果使用公共和专用网络接口(例如具有公共 Wi-Fi 的专用以太网),Azure Sphere 设备将不充当路由器。 它不会自动将以太网网络上收到的数据包传递到 Wi-Fi 网络,反之亦然。 应用程序必须实现在两个网络上发送和接收信息的所有逻辑。

双公共网络接口

如果使用两个启用了动态 IP 寻址的网络接口,则操作系统在选择 DNS 服务器地址进行主机名解析时,会尝试使用连接到网络的第一个接口。 如果某个接口与网络断开连接,则会自动使用来自另一个已连接接口的 DNS 服务器地址。

静态 IP 地址

可以在以太网或 Wi-Fi 接口上配置静态 IP 地址。 若要设置静态 IP 地址配置,应用程序必须使用 applibs 网络 API,并且 应用程序清单 必须启用 NetworkConfig 功能。

配置静态 IP 地址时,还必须设置 自定义 DNS ,以确保 Azure Sphere OS 继续按预期运行。

专用网络服务示例演示如何将 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 响应将满足查询。 如果 通过 DHCP 设置了解析程序,则Networking_IpConfig_EnableCustomDns也可用于替代当前解析程序。

若要使用自定义 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 服务器的数量。 最多可以指定三个 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 的外部客户端设备分配 IP 地址和其他网络参数,以便它可以与 Azure Sphere 设备上的服务器应用程序进行通信。 但是,某些外部设备不支持配置这些参数的方法。 Azure Sphere 支持 DHCP 服务器,应用程序可以通过该服务器提供此配置。 应用程序必须在其应用程序清单中启用 DhcpService 功能。

Azure Sphere 应用程序调用 Networking_DhcpServerConfig_Init 来配置服务器,以便向客户端设备提供 IP 地址、子网掩码、网关地址、租约持续时间和最多三个 NTP 服务器地址。 当前版本中只能配置一个 IP 地址。 然后,它调用 Networking_DhcpServer_Start 在特定网络接口上启动服务器。 DHCP 服务器启动后,客户端设备可以发送广播 DHCP 消息,从指定子网上的 DHCP 服务器发现和请求 IP 地址。

SNTP 服务器

SNTP 服务器使客户端设备能够将其系统时间与 Azure Sphere 设备的系统时间同步。 若要使用服务器,Azure Sphere 应用程序必须在其应用程序清单中启用 SntpService 功能。

若要启动服务器,Azure Sphere 应用程序调用 Networking_SntpServer_Start 并指定运行服务器的网络接口。 客户端设备和 Azure Sphere 设备必须位于运行服务器的网络的同一本地子网中。 Azure Sphere 设备必须至少连接到一个公用网络,以便它可以从公用网络时间协议 (NTP) 服务器获取当前时间。 SNTP 服务器在具有当前时间之前不会响应查询。

注意

尽管应用程序可以直接设置系统时间,但不建议这样做,因为设备断电时不会保留时间。 管理系统时间和 Azure Sphere 上的 RTC 包含详细信息。

侦听端口

如果 Azure Sphere 应用程序侦听传入 TCP 或 UDP 连接, 则应用程序清单 必须指定应用程序使用的端口。 例如:

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

样品

  • DNS 服务发现示例演示如何查询和处理来自 DNS 服务器的响应。
  • 专用网络服务示例演示如何将 Azure Sphere 连接到专用网络并使用多个网络服务。