使用網路服務
重要
這是 Azure Sphere (舊版) 檔。 Azure Sphere(舊版)將於 2027 年 9 月 27 日淘汰,且使用者此時必須移轉至 Azure Sphere(整合式)。 使用位於 TOC 上方的版本選取器來檢視 Azure Sphere (整合式) 檔。
Azure Sphere 可以執行靜態 IP 位址、 動態主機設定通訊協定 (DHCP) 伺服器,以及 網路介面的簡單網路時間通訊協定 (SNTP) 伺服器 。 DHCP 伺服器可讓 Azure Sphere 應用程式設定網路上外部裝置的網路參數。 外部裝置可以使用 SNTP 伺服器來同步處理其時間與 Azure Sphere。
網路組態
您可以設定乙太網路和Wi-Fi網路介面,以在 Azure Sphere 裝置上同時執行。 乙太網路和Wi-Fi網路介面可以連線到公用(因特網連線)或專用網。 至少必須有一個介面連線到公用網路。 一次只能設定一個乙太網路介面。
私人和公用網路介面
如果您使用公用和專用網介面,例如具有公用Wi-Fi的私人乙太網路,Azure Sphere 裝置將不會作為路由器。 它不會自動將乙太網路上收到的封包傳遞至Wi-Fi網路,反之亦然。 您的應用程式必須實作傳送和接收這兩個網路上資訊的所有邏輯。
雙重公用網路介面
如果您使用已啟用動態IP尋址的兩個網路介面,OS 會在選取 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 ]
}