通过 GPS 适配器设置时间

通过 GPS 适配器设置时间

有这段代码声称可以设置 Linux 环境的时间,

http://blog.petrilopia.net/linux/raspberry-pi-set-time-gps-dongle/

date -s '01/01/2014 00:01'
sleep 1
pkill ntpd
pkill gpsd
gpsd -b -n -D 2 /dev/ttyUSB0
sleep 2
GPSDATE=`gpspipe -w | head -10 | grep TPV | sed -r 's/.*"time":"([^"]*)".*/\1/' | head -1`
echo $GPSDATE
date -s "$GPSDATE"
/usr/sbin/ntpd

但是当我通过 puTTy 运行这段代码时,它会将我的时间设置为,

2010 年太平洋时间 8 月 8 日星期日 06:08:11

我想知道为什么它把我的 GPS 时间设置为 2010 年,而它是 2013 年。

gpspipe -w这是命令的输出

{"class":"TPV","tag":"MID2","device":"/dev/ttyUSB0","mode":1,"time":"1990-12-22T23:59:53.020Z","ept":0.005}
{"class":"TPV","tag":"MID2","device":"/dev/ttyUSB0","mode":1,"time":"1990-12-22T23:59:54.020Z","ept":0.005}
{"class":"SKY","tag":"MID4","device":"/dev/ttyUSB0","time":"1990-12-22T23:59:55.010Z"}
{"class":"TPV","tag":"MID2","device":"/dev/ttyUSB0","mode":1,"time":"1990-12-22T23:59:55.010Z","ept":0.005}
{"class":"TPV","tag":"MID2","device":"/dev/ttyUSB0","mode":1,"time":"1990-12-22T23:59:56.020Z","ept":0.005}
{"class":"TPV","tag":"MID2","device":"/dev/ttyUSB0","mode":1,"time":"1990-12-22T23:59:57.020Z","ept":0.005}

输出是连续的,这意味着它每秒都在变化。

答案1

由于$GPSDATE被报道为

Sun Aug 8 06:08:11 PKT 2010

date -s命令完全按照您的指示执行。为什么它报告了错误的年份(或根本没有报告)?我不知道。

既然您已经在使用,ntpd为什么您不满足于让 NTP 发挥作用呢?这是“我希望 gpsdate 能够工作,因为它就在那里”的问题吗?

帮助我们帮助您调试此问题的最佳方法是提供完整的输出

gpsdate -w

在你的问题中。

添加以响应 gpsdate 输出:

根据GPSD文档当 TPV 记录的模式字段为 时,1表示“无修复”。这意味着 GPS 接收器没有看到足够的(或任何)卫星数据。这意味着时间值是垃圾,如果您看到的是 1990 年或 2014 年,这当然是有意义的。在您的脚本中,sleep 2几乎没有时间来gpsd获得正确的 GPS 修复。等待更长时间可能会有所帮助,没有连接合适的天线意味着您将永远等待修复。

网络时间协议实现ntpd不需要 GPS 即可工作。它与其他互联网主机交换时间同步信息,其中一些主机确实从 GPS 等参考来源获取时钟。由于您的脚本会停止并重新启动 ntpd,因此您可以忘记 GPS 修复并使用它。例如,我输入此内容的机器使用 ntpd,并且与 UTC 相差 +4.7 毫秒,这对于许多用途来说都非常准确。您可以使用它ntpq -p来了解您的时钟是否同步以及同步程度如何。

答案2

… "mode":1 …

这就是为什么。您没有 GPS 定位,GPS 接收器可能不知道现在是什么时间。您希望众数为 3。

从 SKY 的报告没有任何附加数据这一事实来看,我进一步猜测你的接收器甚至还没有年鉴。

让 GPS 在天空晴朗的情况下运行至少 15 分钟(是的,确实如此)。这应该会改善情况。

文档在这里这些字段的含义。

相关内容