如何保持树莓派计时准确?

How can I keep raspberry timekeeping accurate?

我有 3 台 Raspberry 3 B 型设备。他们的操作系统是Windows10 IOT,他们是同一天(昨天)安装的。

我对他们的计时有非常奇怪的体验,他们非常不准确。其中一些比正确时间晚了几秒,而另一些则晚了 3-4 分钟。常见的行为是不准确。

我尝试通过在启动计划脚本中调用 "w32tm /resync /force" 来在每次启动时强制进行时间同步。好像一点用都没有。

我也尝试过使用不同的 Wi-Fi 网络(来自不同的供应商),所有这些都存在问题。

当通过 w32tm /query /status 查询时间状态时,我得到以下结果:

设备 1

跳跃指示器:3(最后一分钟有 61 秒) 层数:0(未指定) 精度:-23(每滴答 119.209ns) 根延迟:0.0000000s 根散布:0.0000000s ReferenceId:0x00000000(未指定) 上次成功同步时间:未指定 来源:本地 CMOS 时钟 轮询间隔:10 (1024s)

设备 2

跳跃指示器:0(无警告) 层数:3(次要参考 - 由 (S)NTP 同步) 精度:-23(每滴答 119.209ns) 根延迟:0.1734432s 根色散:0.4173777s ReferenceId:0x338C7FC5(来源IP:51.140.127.197) 上次成功同步时间:7/14/2017 7:48:12 AM 来源:time.windows.com,0x9 轮询间隔:15 (32768s)

设备 3

跳跃指示器:0(无警告) 层数:3(次要参考 - 由 (S)NTP 同步) 精度:-23(每滴答 119.209ns) 根延迟:0.1850726s 根色散:16.7226250s ReferenceId:0x338C7FC5(来源IP:51.140.127.197) 上次成功同步时间:7/14/2017 11:42:52 AM 来源:time.windows.com,0x9 轮询间隔:10 (1024s)

我在网上阅读了有关该问题的主题,但找不到任何可行的解决方案。对我来说似乎很奇怪,时间应该是大多数应用程序的关键因素,所以必须有一个解决方案。

你能帮我解决一下吗?非常感谢任何建议!

设备 1 似乎根本没有使用时间服务器,在所有设备上强制执行相同的配置。

我只是建议您尝试不同的时间服务器。 我遇到过类似的问题,有时这甚至与硬件无关,而是网络问题。没有人知道你和时间服务器之间有什么,然后尝试不同的网络就足够了。

http://www.pool.ntp.org/en/use.html

w32tm /config /syncfromflags:manual /manualpeerlist:"0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org"

它应该足够好... 但是 RPi 没有板载 RTC(实时时钟)。你可以买一个 google raspberry pie rtc

在没有 RTC 的情况下,RPi 会以其 CPU 周期构建时间。这些不是那么准确,当您超频 CPU.

时可能会更加漂移

这个问题可能在 https://raspberrypi.stackexchange.com/

上得到更好的回答

如果你不想买芯片,你可以尝试改变电压,让时间服务器更频繁地更新时间。

由于 Pi 缺少实时时钟,您应该选择双管齐下的方法以获得最佳结果。

选择不同的时间服务器进行长期校正,然后在其上安装与此类似的real-time clock module,以便在未连接到网络时保持时间非常接近。该模块 温度稳定,无需焊接,使用无处不在的 I2C 接口 ,并声称精度高,电池寿命长。对许多 Adafruit 产品感到满意。

至于时间服务器,请have a look at this resource。他们甚至包括(在他们的服务条款中)关于如何设置 ntp 以最佳使用(以及他们的池上的分布式负载)的指南。

尝试使用像 this because with some devices when you unplug it it will reset the time and date. If your clock's time is off by quite a bit. It may take up to 3 hours to correct itself, because changes from the server are applied gradually to your local clock. Network stability has the biggest impact on the accuracy, because a unpredictable network (something more wireless, like 3G) will make it very hard to be accurate. You can also find a support 这样的实时时钟 (RTC)。如果你有 fake-hwclock 包,它还会做一个时间戳保存技巧来防止时钟被重置。这不会在设备关闭时提前时间,因此它会滞后。内部时钟在打开时也会有一点漂移。

Sources

我可以根据经验提供一些见解。我们的机器设备有大量资源可用于更新时间。有点部署的要求。虽然我们的设备上有一个内部时钟,但电池不足以在每个安装的车辆不是 运行 的情况下长时间保持准确。 (已进行硬件升级以改善这一点。)

我们提供网络服务和时间服务,每个服务都允许内部时钟每 24 小时或打开时更新一次。在某些情况下,时间包含在设备执行的一些数据传输中,并检查准确性并告知在差异太大时进行更新。在某些配置中,用户可以检查时间并在需要时激活和更新。有点老派,但这些已经存在了几年了。

如果设备解决方案需要,则应指定高质量的 RTC 和电池,如果确实需要,请不要吝啬该硬件。

这里也不错troubleshooting guide,我觉得是硬件不一样,原理差不多

这里有一些很好的列表 RTCs

还有一个link到Adafruit

首先声明一下,我还没有接触过Windows10,也没有接触过Raspberry。另一方面,我看到以下方法解决了这么多 Windows 各种机器的所有时间同步问题,您可以尝试一下。

问题(根据我的经验):

1) time.windows.com 极不靠谱。在我的设置和几个客户的设置中,在大多数情况下,在 Windows 的开箱即用安装后,即使不涉及无线连接并且即使有可靠的高数据,时间也不会可靠地同步与 Internet 提供商的速率/低延迟连接。

2) Windows 似乎以一种不寻常的(我们也可以说:错误的)方式查询 NTP 服务器。虽然我对 NTP 的了解还不够深入,无法给出详细的解释,但作为客户端的 Windows 似乎向服务器发送所谓的 "symmetric active" 数据包,而不是正常的 "client packets"。所以起初它与其他(标准)NTP 服务器的工作也非常不可靠。

可能的解决方案

问题 1) 的解决方案很明显:在网络中的某处安装标准 NTP 服务器。如果您手边有 Linux 框,我最终可以帮助您正确配置它。然后,通过电缆将您的 Raspberrys 连接到此 NTP 服务器,并在 Raspberrys 上应用问题 2 的解决方案(见下文)。

问题 2) 的解决方案不太明显,涉及为 Windows 设置一个未记录的标志(至少,它在我现在手头的 Windows 7 Pro 中没有记录)时间服务。您已经查询了 Windows 时间服务状态,并且向我们展示了输出。请注意输出中的以下部分(例如设备 2):

Source: time.windows.com,0x9 Poll Interval: 15 (32768s)

问题是 0x9,应该是 0x8。要更改该标志,请以管理员身份打开命令行 window (仅属于管理组是不够的)并执行以下命令:

w32tm /config /manualpeerlist:xxx.xxx.xxx.xxx,0x8 /syncfromflags:MANUAL

注意如何添加正确的标志 0x8(当然,xxx.xxx.xxx.xxx 是您的 NTP 服务器的 IP 地址,但您可以提供一个正常的主机名(例如 ntpserver.example.org )以及)。基本上,上面的行告诉 Windows 时间服务它应该同步到哪个服务器,它应该同步 到那个服务器,它应该发送正常的客户端请求数据包(而不是主动对称数据包)到该服务器。

完成此操作后,您必须通过重新启动 Windows 时间服务或更新其配置(我更喜欢第一个)来应用更改。

如果您再查询状态,您的输出中将有以下部分:

Source: xxx.xxx.xxx.xxx,0x8 Poll Interval: xx (xxxxxs)

请注意,输出中的标志现在已从 0x9 更改为 0x8

两个最后的笔记

1) 如果您坚持同步到 time.windows.com,我不确定问题 2) 的解决方案是否有效。由于它不可靠,我已经多年没有使用它了。如果您将上述标志从 0x9 更改为 0x8,但仍然使用 time.windows.com 作为 NTP 服务器,情况可能会变得更糟。

出于多种原因,在您的本地网络中设置您自己的 NTP 服务器是一个非常好的主意(我不会在这里详细介绍,因为这会离题)。如果您不能或不想这样做,我建议您使用其他 public 时间服务器(通过访问 http://www.ntp.pool.org 开始搜索)而不是 time.windows.com。他们肯定会解决问题 2)。

2) 作为最后的手段,您可以尝试在 Windows 中安装另一个时间服务。例如,Windows 有一个完整的 NTP 软件端口,但据我所知,仅适用于 Intel 平台。由于我对树莓派(ARM)平台一无所知,所以我根本不知道是否有其他时间服务软件,所以这只是一个想法,以防其他方法都失败。