使用网络服务
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 ]
}