Управление системным временем и RTC в высокоуровневых приложениях

RTC (часы реального времени) используется для поддержания времени на устройстве Azure Sphere, когда устройство теряет питание и не имеет доступа к сетевому подключению после перезагрузки устройства. Это позволяет устройству поддерживать время во время потери питания, даже если у него нет доступа к NTP-серверу.

Если задать системное время, оно не сохраняется при потере питания устройства. Чтобы сохранить время во время потери питания, необходимо вызвать функцию Applibs clock_systohc. При вызове clock_systohc системное время передается в RTC.

Требования К RTC

Приложения, использующие RTC, должны включать соответствующие файлы заголовков и добавлять параметры RTC в манифест приложения.

Файлы заголовков

Включите заголовок rtc в проект:

 #include <applibs\rtc.h>

Параметры манифеста приложения

Чтобы использовать API RTC и стандартных часов, необходимо добавить SystemTime возможность приложения в манифест приложения, а затем присвоить trueзначение . Манифест приложения Azure Sphere содержит дополнительные сведения о манифесте приложения.

{
  "SchemaVersion": 1,
  "Name" : "Mt3620App3_RTC",
  "ComponentId" : "bb267cbd-4d2a-4937-8dd8-3603f48cb8f6",
  "EntryPoint": "/bin/app",
  "CmdArgs": [],
   "Capabilities": {
    "AllowedConnections": [],
    "AllowedTcpServerPorts": [],
    "AllowedUdpServerPorts": [],
    "HardwareAddressConfig": true,
    "Gpio": [],
    "Uart": [],
    "WifiConfig": false,
    "NetworkConfig": false,
    "SystemTime": true,
    "TimeSyncConfig": true
  }
}

Получение системного времени

Чтобы получить системное время, вызовите стандартную clock_gettime функцию.

Установка системного времени

Чтобы задать системное время, вызовите стандартную clock_settime функцию.

Синхронизация системного времени с RTC

Если задано системное время, оно не сохраняется при потере питания устройства. Чтобы сохранить время во время потери питания, вызовите функцию Applibs clock_systohc . Когда clock_systohc называется, системное время передается в RTC.

Настройка клиентской службы NTP

Клиентская служба NTP включена по умолчанию. Если задать системное время при включении клиентской службы NTP, оно перезапишет время в формате UTC, когда устройство имеет подключение к Интернету. Службу клиента NTP можно отключить. Однако это может привести к сбою облачных обновлений на устройстве, если разница между системным и NTP-серверным временем слишком велика.

Установка часового пояса

Системное время и время RTC хранятся в формате GMT/UTC. Вы можете изменить часовой пояс, используемый приложением, вызвав функцию setenv для обновления переменной среды TZ, а затем вызвав функцию tzset .

В проекте SetTimeFromLocation показано, как использовать обратный ip-запрос для получения сведений о расположении, а затем получения времени для расположения и задания времени устройства. Этот проект входит в коллекцию Azure Sphere, коллекцию неуправляемых скриптов, служебных программ и функций.

ОС Azure Sphere поддерживает некоторые, но не все возможные форматы для переменной среды TZ:

  • Текущий часовой пояс можно задать с переходом на летнее время (DST) или без нее. Примеры: "EST+5", "EST+5EDT". Это значение является положительным, если местный часовой пояс находится к западу от простого меридиана, и отрицательным, если он находится на востоке.
  • Нельзя указать дату и время вступления в силу DST.
  • Невозможно указать файл часового пояса или базу данных.

Чтобы сохранить параметры часового пояса во время потери питания, можно использовать изменяемое хранилище , чтобы сохранить часовой пояс в постоянном хранилище, а затем отозвать параметр при перезагрузке устройства.

Указание NTP-сервера

Клиентская служба NTP может быть настроена для получения времени из нескольких источников. Источник времени по умолчанию — prod.time.sphere.azure.net, как указано в требованиях к сети ОС Azure Sphere.

Клиент NTP пытается синхронизировать время каждые 15 секунд до успешной синхронизации. После успешной синхронизации времени он пытается повторно синхронизировать время каждые 24 часа. Когда Azure Sphere выполняет синхронизацию времени, сначала использует случайный исходный порт клиента UDP в диапазоне от 32678 до 61000. В случае сбоя этого порта Azure Sphere попытается использовать порт 124 в качестве исходного порта клиента UDP.

Можно указать, что система получает время от DHCP-сервера, или указать источник времени в приложении с помощью функции Networking_TimeSync_EnableCustomNTP или Networking_TimeSync_EnableDefaultNtp.

Если настроено использование DHCP для источников сервера времени, Azure Sphere обработает параметр DHCP 042, а клиент NTP будет обрабатывать только первые две записи, отправленные в параметре DHCP, которые должны быть перечислены в порядке предпочтения. Они будут рассматриваться как сервер-источник и сервер-получатель.

Вы также можете настроить сервер времени с помощью Networking_TimeSync_EnableCustomNTP , если вы хотите указать основной и дополнительный сервер времени через приложение. Максимальная длина для каждого полного доменного имени сервера составляет 255 символов.

Резервный

  • Если клиент NTP настроен для получения серверов времени через DHCP или API, для указания резервного поведения требуется дополнительный параметр.

  • Клиент сначала попытается связаться с основным сервером времени. Если клиенту не удается получить допустимый ответ сервера времени, он попытается использовать сервер-получатель времени (если он указан).

  • Если указан сервер вторичного времени и он завершается сбоем или если параметр возврата к ОС по умолчанию через сбой Networking_NtpOption_FallbackServerEnabled , система свяжется с источником времени ОС по умолчанию prod.time.sphere.azure.net.

    • В течение следующего 24-часового интервала синхронизации ОС вернется и попытается запросить основной сервер времени.
  • Если вы указали Networking_NtpOption_FallbackServerDisabled, ОС будет продолжать запрашивать сервер-источник и сервер-получатель каждые 15 секунд, пока он не будет успешно синхронизирован с одним из серверов времени.

Устройства с несколькими адресами

Параметры сервера времени являются глобальными, а не параметрами для каждого интерфейса. Если устройство Azure Sphere является многосетевым и оба интерфейса получают сведения о сервере NTP через DHCP, побеждает последний обработанный набор параметров NTP DHCP.

Пример системного времени

В примере системного времени показано, как управлять системным временем и использовать аппаратный RTC. Пример приложения задает системное время, а затем использует функцию clock_systohc для синхронизации системного времени с RTC.

В проекте SetTimeFromLocation показано, как использовать обратный ip-запрос для получения сведений о расположении, а затем получения времени для расположения и задания времени устройства. Этот проект входит в коллекцию Azure Sphere, коллекцию неуправляемых скриптов, служебных программ и функций.

Пример пользовательского NTP

В примере пользовательского NTP показано, как настроить клиентскую службу NTP для получения времени из нескольких источников.