采用平头哥RVB2601制作一款高精度网络授时时钟
[复制链接]
本帖最后由 ylyfxzsx 于 2022-4-12 11:26 编辑
在开始制作前,需要先了解一下相关的知识,一起来跟着我学习吧。
1.时间相关的概念
----------------------------------------------------------------------------
- epoch
- 本意为纪元,也即一个时刻的开始。它在计算机计时系统中就是指时间基准点,在Unix系统中,这个基准点就是 UTC 时间的1970年1月1日0时0分0秒整那个时间点。只有有了参考点,计时系统才能工作,否则经过了10s,现在的时刻还是无法确定,有了基准点,只要计数了经过的秒数,就能计算出现在的年月日时分秒。
- GMT, UTC
-
GMT 是格林尼治时间(Greenwich Mean Time)的缩写,还叫做世界协调时 UTC(Coordinated Universal Time)。GMT的正午是指当太阳横穿格林尼治子午线(本初子午线)时的时间。但由于地球自转不均匀不规则,导致GMT不精确,现在已经不再作为世界标准时间使用。历史上,先有GMT,后有UTC。
UTC,即协调世界时。UTC是以原子时秒长为基础,是现在使用的时间标准,它根据原子钟来计算时间,在时刻上尽量接近于GMT的一种时间计量系统。为确保UTC与GMT相差不会超过0.9秒,在有需要的情况下会在UTC内加上正或负闰秒,UTC与GMT基本上等同,误差不超过0.9秒。UTC现在作为世界标准时间使用。
- 时区,TZ/TZONE
-
尽管有了时间基准,和精确计数时间的原子钟,已经可以精确地表示一个时间,但是很多情况下,还是要根据地区实际情况对时间进行一个调整,由于世界各国家与地区经度不同,地方时也有所不同,因此会划分为不同的时区。全球一共划分24个时区,其中 GMT 时间被定义为 0 时区,其他时区根据东西方向偏移,计算出本地时区的时间。
北京时间CST(China Standard Time)为东八区,也即 GMT+8,当前表示为 UTC+8。
- 夏令时,DST
- DST 全称是Daylight Saving Time,为了充分利用日光,减少用电,人为地对时间做出一个调整,这取决于不同国家和地区的政策法规。地球自西向东旋转,东边比西边先看到太阳,东边的时间也比西边的早。为了统一世界的时间,1884年的国际经度会议规规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为零时区(GMT+00),东1-12区,西1-12区,中国北京处于东8区(GMT+08)。若中国当前时间为8点整,则英国时间为0点整。
-
- 比如说,夏天天亮的很早,如果还是像冬天一样规定从早上9:00到5:00上班,就不能充分利用日照,这有两种做法,就是每个企业都规定一套自己的夏季上下班时间,这比较麻烦,那么统一由授时中心在进入夏天的某个时刻,通常为凌晨,人为将时间提前一小时,这样原来的早上9:00上班的规定没变,但是实际上已经是8:00上班了。等夏季过去,夏令时结束,再在某个时间点把时间推后一个小时。
-
2.获取时间的方法
----------------------------------------------------------------------------
- GPS授时
- GPS授时系统最开始是一个由美国国防部开发的空基全天侯导航系统,GPS授时系统用以满足军方在地面或近地空间内获取在一个通用参照系中的位置、速度和时间信息的要求。
- GPS授时系统授时原理是由每颗卫星上原子钟的铯和铷原子频标保持的。这些星钟一般来讲精确到世界协调时(UTC)的几纳秒以内,UTC是由海军观象台的“主钟”保持的,每台主钟的稳定性为若干个10-13秒。GPS卫星早期采用两部铯频标和两部铷频标,后来逐步改变为更多地采用铷频标。通常,在任一指定时间内,每颗卫星上只有一台频标在工作。我们想要得到高精度的导航定位结果,就需要对时间测量得很准的设备,这个在卫星上主要是通过星载原子钟得到的,星载原子钟包括氢原子钟、铷钟等设备。
- 授时是GNSS卫星导航系统三大基本服务之一,具有受众广、精确性好、长期稳定等特点,是目前主要的授时方法。高精度的星载原子钟和地面监测站的高精度时间尺度,是系统的核心技术之一,保障了GNSS系统时间与UTC时间同步在100ns以内。因此GNSS卫星信号可以传递标准时间UTC,使用接收机解算即可获取高精度时间。
-
- 网络授时
-
网络时间协议 (NTP) 是 Windows 时间服务在操作系统中使用的默认时间同步协议。 NTP 是一种容错、高度可缩放的时间协议,常用于通过指定的时间参考来同步计算机时钟。
NTP 时间同步发生在一段时间内,涉及通过网络传输 NTP 数据包。 NTP 数据包中的时间戳包括参与时间同步的客户端和服务器中的时间样本。
NTP 依赖参考时钟定义要使用的最精确时间,并将网络上的所有时钟与该参考时钟同步。 NTP 使用协调世界时 (UTC) 作为当前时间的通用标准。 UTC 不受时区影响,支持在世界各地使用 NTP,无需考虑时区设置。
简单的网络时间协议 (SNTP) 是一种简化的时间协议,适用于不需要 NTP 提供的精度的服务器和客户端。 SNTP 是更基本的 NTP 版本,并且是 Windows 2000 中使用的主要时间协议。 由于 SNTP 和 NTP 的网络数据包格式相同,这两种协议可彼此协作。 这两者之间的主要区别在于 SNTP 不具有 NTP 提供的错误管理和复杂筛选系统。
- 高精度RTC时钟
- 实时时钟的英文全称为Real-Time Clock,英文简称为RTC,它是一种被称为时钟芯片的集成电路。RTC可帮助我们获得精确的实时时间,如时间及日历、闹钟,考勤机、视频监控、定时器等,也可以为电子系统提供精确的时间基准,比如我们常用的DS1302 RTC模块,见下图。我们使用的PC电脑中的主板上也有一个称为实时时钟(RTC,Real-Time Clock)的硬件模块,它会实时记录UTC时间,该模块有单独的电池供电,即使关机也不影响。
-
- 原子钟
- 原子钟,是一种计时装置,精度可以达到每2000万年才误差1秒,它最初本是由物理学家创造出来用于探索宇宙本质的。
- 目前世界上最准确的计时工具就是原子钟,它是20世纪50年代出现的。原子钟是利用原子吸收或释放能量时发出的电磁波来计时的。由于这种电磁波非常稳定,再加上利用一系列精密的仪器进行控制,原子钟的计时就可以非常准确了。现在用在原子钟里的元素有氢(Hydrogen)、铯(Cesium)、铷(Rubidium)等。原子钟的精度可以达到每2000万年才误差1秒。
-
- 电波钟
- 电波钟表,也称为无线控制计时钟表(英文名称为:Radio controlled timepieces)。
电波钟表作为一个系统的技术原理是:首先,由标准时间授时中心将标准时间信号进行编码(商业码则进行加密),利用低频(20KHz~80KHz)载波方式将时间信号以无线电长波发播出去。
电波钟表通过内置微型无线电接收系统接受该低频无线电时码信号,由专用集成芯片进行时码信号解调,再由计时装置内设的控制机构自动调节钟表的计时。
通过这样一个技术过程,使得所有接收该标准时间信号的钟表(或其他计时装置)都与标准时间授时中心的标准时间保持高度同步,进而全部电波钟表显示严格一致的时间。
- 电波钟表技术系统本身与其他授时技术比较,主要是可以十分经济和方便地获取高精度的标准时间,满足广大民用标准时间的需求。
世界各国的电波钟表技术原理相同,但各主要国家关于标准时间信号的通过协议(简称码制)却不同。使得一个国家的电波钟表不能在另一个国家正常接收信号和校准时间。另外,不同国家和地区的无线电通信的电波环境不同,有的国家无线通信干扰小,如德国。而中国、美国的无线电环境较差。
-
3.开始构思
-------------------------------------------------------------------------------------------------------------------
如果我们的时间和成本充足,可以考虑加入GPS模块,电波钟模块,网络NTP授时,离线高精度RTC 甚至足够土豪不计成本,加入小型原子钟也是可以的,这么庞大的阵容如果 一起作为多选时钟源,无论哪一个单独的时钟源失效时,都不影响我们的时钟进行授时任务。 说到这里,我的脑海里想起了一部电影,关于无线电的 “永不消逝的电波”。如果能实现我上面的所有模块的叠加,是不是可以叫做永不时效的时钟,哈哈有点扯远了。
不过话说回来,盘了盘我手上还真有上面所有能用到的模块,碍于时间关系,就不再这个帖子里全部做累加了。RVB2601已经集成了无线网络WT800网卡,声卡带喇叭,带显示屏,那么我在这里就打算把这些现成的资源利用起来,制作成一个通过网络基于NTP协议授时的时钟。
4.NTP协议的初步了解
-------------------------------------------------------------------------------------------------------------------
NTP (Network Time Protocol, 网络时间协议) 是由 RFC5905 定义的时间同步协议, 用来在分布式时间服务器和客户端之间进行时间同步, 是一个跨越广域网或局域网的复杂的同步时间协议, 它通常可获得毫秒级的精度.
NTP 基于 UDP 报文进行传输, 使用的UDP端口号为 123.
使用 NTP 的目的是对网络内所有具有时钟的设备进行时钟同步, 使网络内所有设备的时钟保持一致, 从而使设备能够提供基于统一时间的多种应用.
对于运行 NTP 的本地系统, 既可以接收来自其他时钟源的同步, 又可以作为时钟源同步其他的时钟, 并且可以和其他设备相互同步.
NTP报文格式
NTP有两种不同类型的报文,一种是时钟同步报文,另一种是控制报文。控制报文仅用于需要网络管理的场合,它对于时钟同步功能来说并不是必需的,这里我们不做了解。
主要字段的解释如下:
l LI(Leap Indicator):长度为2比特,值为“11”时表示告警状态,时钟未被同步。为其他值时NTP本身不做处理。
l VN(Version Number):长度为3比特,表示NTP的版本号,目前的最新版本为3。
l Mode:长度为3比特,表示NTP的工作模式。不同的值所表示的含义分别是:0未定义、1表示主动对等体模式、2表示被动对等体模式、3表示客户模式、4表示服务器模式、5表示广播模式或组播模式、6表示此报文为NTP控制报文、7预留给内部使用。
l Stratum:系统时钟的层数,取值范围为1~16,它定义了时钟的准确度。层数为1的时钟准确度最高,准确度从1到16依次递减,层数为16的时钟处于未同步状态,不能作为参考时钟。
l Poll:轮询时间,即两个连续NTP报文之间的时间间隔。
l Precision:系统时钟的精度。
l Root Delay:本地到主参考时钟源的往返时间。
l Root Dispersion:系统时钟相对于主参考时钟的最大误差。
l Reference Identifier:参考时钟源的标识。
l Reference Timestamp:系统时钟最后一次被设定或更新的时间。
l Originate Timestamp:NTP请求报文离开发送端时发送端的本地时间。
l Receive Timestamp:NTP请求报文到达接收端时接收端的本地时间。
l Transmit Timestamp:应答报文离开应答者时应答者的本地时间。
l Authenticator:验证信息。
5.软件编写
-------------------------------------------------------------------------------------------------------------------
打开RVB2601的SDK,选个DEMO开始进行前期的验证,这里为了方便,我选择了带GUI显示的工程作为开发界面
打开工程后,编写网络连接函数,加入WIFI ssid和key:
打开组件,加入NTP组件
加入组件后,打开ntp.c文件,加入相关处理函数,将时区设置为东八区,再用ctime函数转换得到真实时间,在ntp.c文件里放一个全局变量time_str存储ctime函数得到的时间字符串,然后送到OLED屏幕显示,按F7编译。
6.下载调试
-------------------------------------------------------------------------------------------------------------------
把编译好的程序下载进开发板,复位,观察串口助手网络连接成功,时间获取成功,同时OLED屏幕亮起显示了我们通过网络得到的时间。
接下来,把通过NTP获取的准确时间数据更新到板载的RTC中,并通过刷新LED任何加入串口打印时间的函数
进一步的界面和功能优化还在持续中。
1.加入GPS模块
2.加入DS3231高精度RTC模块
3.规划GUI,加入日历,闹钟,按键设置 功能
*看情况,加入音乐播放,语音报时等
另感谢平头哥攻城狮,在WT800驱动的BUG上提供的解决方案,这里一起放出来给有需要的小伙伴参考。
解决RVB2601开发板NTP error以及“卡死”问题.pdf
(780.87 KB, 下载次数: 10)
|