Использование сетевых служб
Azure Sphere может запускать статический IP-адрес, DHCP-сервер и простой сервер протокола сетевого времени (SNTP) для сетевого интерфейса. DHCP-сервер позволяет приложениям Azure Sphere настраивать параметры сети для внешнего устройства в сети. Внешнее устройство может использовать сервер SNTP для синхронизации времени с Azure Sphere.
Конфигурация сети
Вы можете настроить ethernet и Wi-Fi сетевой интерфейс для одновременного выполнения на устройстве Azure Sphere. Сетевые интерфейсы Ethernet и Wi-Fi могут быть подключены к общедоступным (подключенным к Интернету) или частным сетям. К общедоступной сети должен быть подключен по крайней мере один интерфейс. Одновременно можно настроить только один интерфейс Ethernet.
Интерфейсы частной и общедоступной сети
Если вы используете как общедоступные, так и частные сетевые интерфейсы, например частный Ethernet с общедоступным Wi-Fi, устройство Azure Sphere не будет выступать в качестве маршрутизатора. Он не будет автоматически передавать пакеты, полученные в сети Ethernet, в сеть Wi-Fi или наоборот. Приложение должно реализовать всю логику, которая отправляет и получает информацию в обеих сетях.
Двойные общедоступные сетевые интерфейсы
При использовании двух сетевых интерфейсов с включенной динамической IP-адресацией ОС пытается использовать первый интерфейс, подключенный к сети, когда выбирает адреса DNS-сервера для разрешения имен узлов. Если интерфейс отключается от сети, автоматически используются адреса DNS-сервера из другого подключенного интерфейса.
Статический IP-адрес
Статический IP-адрес можно настроить в интерфейсе Ethernet или Wi-Fi. Чтобы настроить конфигурацию статического IP-адреса, приложение должно использовать API сети applibs, а манифест приложения должен включить возможность NetworkConfig .
При настройке статического IP-адреса необходимо также настроить настраиваемую СЛУЖБУ DNS , чтобы убедиться, что ОС Azure Sphere продолжит работать должным образом.
В примере служб частной сети показано, как подключить 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-серверов. Можно указать до трех DNS-серверов. Следующий код настраивает массив из трех IP-адресов DNS-сервера для использования.
// 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 переопределяет все DNS-серверы, указанные DHCP.
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 через интерфейс Ethernet, необходимо назначить IP-адрес и другие сетевые параметры, чтобы оно удостоверялось взаимодействие с серверным приложением на устройстве Azure Sphere. Однако некоторые внешние устройства не поддерживают способ настройки этих параметров. Azure Sphere поддерживает DHCP-сервер, с помощью которого приложение может предоставить такую конфигурацию. Приложение должно включить возможность DhcpService в манифесте приложения.
Приложение Azure Sphere вызывает Networking_DhcpServerConfig_Init , чтобы настроить сервер для предоставления IP-адреса, маски подсети, адреса шлюза, срока аренды и до трех адресов NTP-сервера клиентскому устройству. В текущем выпуске можно настроить только один IP-адрес. Затем он вызывает Networking_DhcpServer_Start для запуска сервера в определенном сетевом интерфейсе. После запуска DHCP-сервера клиентское устройство может отправлять широковещательные СООБЩЕНИЯ DHCP для обнаружения и запроса IP-адресов с DHCP-сервера в указанной подсети.
Сервер SNTP
Сервер SNTP позволяет клиентским устройствам синхронизировать системное время с временем устройства Azure Sphere. Чтобы использовать сервер, приложение Azure Sphere должно включить функцию SntpService в манифесте приложения.
Чтобы запустить сервер, приложение Azure Sphere вызывает Networking_SntpServer_Start и указывает сетевой интерфейс, на котором будет выполняться сервер. Клиентское устройство и устройство Azure Sphere должны находиться в одной локальной подсети сети, в которой работает сервер. Устройство Azure Sphere должно быть подключено по крайней мере к одной общедоступной сети, чтобы получить текущее время от сервера NTP. Сервер SNTP не отвечает на запросы, пока не будет установлено текущее время.
Примечание
Хотя приложение может задать системное время напрямую, это не рекомендуется, так как время не сохраняется, когда устройство теряет питание. Управление системным временем и RTC в Azure Sphere содержит дополнительные сведения.
Прослушивание портов
Если приложение Azure Sphere прослушивает входящие ПОДКЛЮЧЕНИЯ TCP или UDP, в манифесте приложения должны быть указаны порты, используемые приложением. Например:
"Capabilities": {
"AllowedTcpServerPorts": [ 11000 ],
"AllowedUdpServerPorts": [ 1024, 50000 ]
}
Образцы
- В примере обнаружения службы DNS показано, как запрашивать и обрабатывать ответы с DNS-сервера.
- В примере служб частной сети показано, как подключить Azure Sphere к частной сети и использовать несколько сетевых служб.