coreSNTP 演示
简介
此演示展示了一个应用程序如何使用 coreSNTP 库,
通过设置 SNTP 客户端定期将系统时间与时间服务器同步,
以此来维持协调世界时 (UTC) 区的实时时钟(或挂钟时间)。演示还展示了如何通过双向身份验证使用 coreSNTP 库与 SNTP/NTP 服务器
进行安全通信。该示例使用基于对称密钥的 AES-128-CMAC 作为身份验证算法。要在启用认证的情况下运行该演示,
使用的服务器必须支持 AES-128-CMAC 算法验证,
在运行演示之前,必须在客户端(演示)和服务器之间生成并预先共享对称密钥。
(可选)设置基于 chronyd
的 NTP 服务器的说明
要使用基于 AES-128-CMAC 的身份验证运行 coreSNTP 演示,必须有支持用该算法进行身份验证的
NTP 服务器。可以使用 chronyd
软件包设置 NTP 服务器,支持 AES-128-CMACM
身份验证。chronyd
服务器可以配置为使用一组上游服务器来定期
同步其时间,以便能够准确响应 coreSNTP 演示客户端向其发出的时间请求。
请按照 的说明
用 chronyd
在 AWS EC2 Linux 实例中设置 NTP 服务器(启用身份验证),
该实例作为上游服务器提供 Amazon 时间同步服务。
多线程架构 - SNTP 客户端任务 & 示例应用程序任务
演示架构包含两个任务:
- SNTP 客户端任务 - 此任务是一个专用的 SNTP 客户端,定期
使用 coreSNTP 库与时间服务器同步时间。它根据收到的服务器时间校正系统时钟,
经计算的系统时钟相对于服务器时间漂移以将墙上时钟/实时时钟维持在 UTC 时区中。
SNTP客户端任务的逻辑可以在 GitHub 上的演示文件 SNTPClientTask.c 中找到。
- 示例应用程序任务 - 此任务是依赖于从系统中查询的实时信息的
示例应用程序任务。此基本应用程序任务定期打印从系统中查询的
实时/墙上时间 (UTC) 。该示例应用程序任务用于定期查询系统时间的代码
可以在 GitHub 上的
文件 SampleAppTask.c 中找到。
coreSNTP 库的所有用途都包含在 SNTP 客户端任务中,以展示如何可以
在FreeRTOS系统中设置 SNTP 客户端任务代理/实用程序,以服务来自多个应用程序任务的时间请求。
用于墙上时钟的系统时钟模型
演示显示没有实时时钟硬件模块的设备如何能够将实时时钟(或墙上时钟)
在 RAM 中维持在 UTC 时区内。演示使用以下数学模型,可以灵活进行更新,
定期与 SNTP 时间同步:
System Time = Base Time +
Time Elapsed since last SNTP time synchronization +
Slew Adjustment
where
BaseTime = Time set at boot or the last synchronized time
Slew Rate = Number of milliseconds of clock correction per system time second
No. of ticks since last SNTP sync = Current FreeRTOS Tick Count -
Tick count at last SNTP synchronization
Time Elapsed since last SNTP time synchronization =
No. of ticks since last SNTP synchronization
x
Number of milliseconds per FreeRTOS tick
Slew Adjustment = Slew Rate x Time Elapsed since last SNTP sync
在上述数学模型中,系统时钟振荡器中的任何频率差异都会导致时钟漂移,
使与实际/互联网时间相关的 FreeRTOS tick 的执行时间产生偏差。因此,将 Slew Adjustment 偏移量添加
系统时钟的计算中以校正总时钟漂移。以此方式使系统时间与
真实世界时间相匹配。Slew Adjustment取决于 Slew Rate,是
应定期应用于系统时间的调整,以对抗系统时钟的时钟漂移。此 rate
按照 coreSNTP 库在收到时间服务器的时间时提供的时钟偏移值
计算一次。
时钟校正/约束模型
演示结合 “step” 和 “slew” 两种方法来校正系统时钟,这会分别影响
上一节所述系统时钟的数学模型的 “Base Time” 和 “Slew Adjustment”
参数。
- “step” 校正从服务器收到时间时更新系统时钟的 Base Time
参数。此校正用于每个成功与时间服务器同步时间的周期,
以立即校正系统时钟 来匹配服务器时间。
- “slew” 校正方法用于补偿系统时钟漂移,该漂移会出现在
每次与时间服务器的成功时间同步之间的间隔。时钟漂移发生在该间隔中,因为
系统时间构建于 HW 系统时钟振荡器之上,其频率偏差导致了上述漂移。用于 slew 校正的
"Slew Rate" 仅在第二次与时间服务器
成功同步时间时计算一次。这是因为演示将系统时间初始化为
democonfigSYSTEM_START_YEAR
(的第一秒),因此漂移了一段时间的实际系统时钟
只有在演示系统时间与从时间服务器获取的真实世界时间同步一次后,
才能正确进行计算。鉴于第一次和第二次与时间服务器进行时间同步之间的间隔,
可以计算实际系统时钟漂移,并且可以正确建立用于时钟调整的 Slew Rate
。
以下是演示时钟约束方法如何影响系统的摘要:
On every time response recevied from time server,
Base Time = Time from Server
On the 2nd successful time synchronization with time server,
Slew Rate = Clock-Offset (calculated by coreSNTP library) / Poll Period
演示中的初始化时间
演示使用
democonfigSYSTEM_START_YEAR
宏将系统时间初始化为所配置年份的第一秒。例如,如果宏被配置为 2021 年,
演示会将系统时间初始化为 2021 年 1 月 1 日 0 时 0 分 0 秒。完成此操作后,系统时间不会
初始化为零,但用足够接近真实世界时间的时间来满足
应用程序执行操作的需要,例如验证服务器证书,在它能够与时间服务器同步时间,
获得准确的真实世界时间之前建立 TLS 连接。这对于那些
没有电池支持的实时时钟 (RTC) 硬件模块,且没有硬件机制
在系统启动时获取真实世界时间的设备平台很有用。
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.