在高级应用程序中管理系统时间和 RTC

RTC (实时时钟) 用于在设备断电且设备重新启动后无法访问网络连接时保留 Azure Sphere 设备上的时间。 这允许设备在断电期间保持时间,即使它无权访问 NTP 服务器。

如果设置系统时间,则当设备断电时,系统时间不会保留。 若要在断电期间保留时间,必须调用 Applibs 函数 clock_systohc。 调用clock_systohc时,系统会将系统时间推送到 RTC。

RTC 要求

使用 RTC 的应用程序必须包含相应的头文件,并将 RTC 设置添加到 应用程序清单

头文件

在项目中包括 rtc 标头:

 #include <applibs\rtc.h>

应用程序清单设置

若要使用 RTC 和标准时钟 API,必须将应用程序功能添加到 SystemTime 应用程序清单,然后将值设置为 trueAzure 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 客户端服务时设置系统时间,它将覆盖设备已建立 Internet 连接的 UTC 时间。 可以 禁用 NTP 客户端服务;但是,如果系统时间和 NTP 服务器时间之间的差太大,这可能会导致设备上的云更新失败。

设置时区

系统时间和 RTC 时间以 GMT/UTC 格式存储。 可以通过调用 setenv 函数来更新 TZ 环境变量,然后调用 tzset 函数来更改应用程序使用的时区。

SetTimeFromLocation 项目演示如何使用反向 IP 查找获取位置信息、获取位置时间以及设置设备时间。 此项目是 Azure Sphere 库的一部分,该库是未经维护的脚本、实用工具和函数的集合。

Azure Sphere OS 支持 TZ 环境变量的某些(但不是全部)可能的格式:

  • 可以使用夏令时或不使用夏令时 (DST) 设置当前时区。 示例:“EST+5”、“EST+5EDT”。 如果本地时区位于主子午线以西,则此值为正值,如果为东部,则为负。
  • 无法指定 DST 生效的日期和时间。
  • 不能指定时区文件/数据库。

若要在断电期间维护时区设置,可以使用 可变存储 将时区存储在持久存储中,然后在设备重新启动时重新调用该设置。

指定 NTP 服务器

可将 NTP 客户端服务配置为从多个源获取时间。 默认时间源为 prod.time.sphere.azure.net,如 Azure Sphere OS 网络要求中所述。

NTP 客户端尝试每 15 秒同步一次,直到成功同步。 成功同步时间后,它会尝试每 24 小时重新同步一次时间。 当 Azure Sphere 执行时间同步时,它首先使用 32678-61000 之间的随机 UDP 客户端源端口。 如果此端口失败,Azure Sphere 会尝试使用端口 124 作为 UDP 客户端源端口。

可以指定系统从 DHCP 服务器获取时间,也可以通过 Networking_TimeSync_EnableCustomNTPNetworking_TimeSync_EnableDefaultNtp 函数在应用程序中指定时间源。

如果配置为将 DHCP 用于时间服务器源,Azure Sphere 将处理 DHCP 选项 042,NTP 客户端将仅处理 DHCP 选项中发送的前两个条目,这些条目应按优先顺序列出。 这些服务器将被视为主服务器和辅助服务器。

如果要通过应用程序指定主时间服务器和辅助时间服务器,还可以通过 Networking_TimeSync_EnableCustomNTP 配置时间服务器。 服务器 (FQDN) 每次完全限定域名的最大长度为 255 个字符。

后备

  • 如果将 NTP 客户端配置为通过 DHCP 或 API 获取时间服务器,则需要其他参数来指定回退行为。

  • 客户端将首先尝试联系主要时间服务器。 如果客户端无法获取有效的时间服务器响应,它将尝试辅助时间服务器 ((如果指定) )。

  • 如果指定了辅助时间服务器但失败,或者通过 Networking_NtpOption_FallbackServerEnabled 回退到 OS 默认值的选项失败,则系统会 prod.time.sphere.azure.net 联系默认 OS 时间源。

    • 在接下来的 24 小时时间同步间隔内,OS 将返回并尝试查询主时间服务器。
  • 如果指定 了Networking_NtpOption_FallbackServerDisabled,OS 将继续每 15 秒查询一次主服务器和辅助服务器,直到它与其中一个时间服务器成功同步。

多宿主设备

时间服务器设置是全局设置,而不是每个接口设置。 如果 Azure Sphere 设备是多宿主的,并且两个接口都通过 DHCP 获取 NTP 服务器信息,则最近处理的 DHCP NTP 选项集获胜。

系统时间示例

系统时间示例演示如何管理系统时间并使用硬件 RTC。 示例应用程序设置系统时间, clock_systohc 然后使用 函数将系统时间与 RTC 同步。

SetTimeFromLocation 项目演示如何使用反向 IP 查找获取位置信息、获取位置时间以及设置设备时间。 此项目是 Azure Sphere 库的一部分,该库是未经维护的脚本、实用工具和函数的集合。

自定义 NTP 示例

自定义 NTP 示例演示如何将 NTP 客户端服务配置为从多个源获取时间。