用Raspberry Pi 2和GPS接收机做一个精确的NTP服务器

时间:2022-01-23 11:27:44

开始之前

我们需要准备一些工具包括,GPS接收机天线、GPS接收机(我用的是ublox)和Raspberry Pi 2。由于ublox可以输出高精度的授时信号(PPS和ZDA),我们主要配置树莓派作为NTP服务器,同时可以接收ublox输出的高精度授时信号来校正自身的时间,以达到提高授时精度的目的。

硬件连接

将接收机天线放置户外,方向朝向西南方,注意不要上其它物体遮挡天线;接收机和天线连接;接收机的PPS信号连接到树莓派的18管脚,接收机的串口与树莓派的串口连接(注意电平);最后将树莓派的网口通过网线和路由器或交换机连接使其可以访问到互联网,同时也要确认可以被你的主机访问。

配置和更新Raspberry Pi 2

配置串口

首先需要禁止掉串口终端功能,输入如下命令:

sudo raspi-config

出现下图中的配置窗口:
用Raspberry Pi 2和GPS接收机做一个精确的NTP服务器
这里选择

9 Advanced Options

回车,然后出现下图所示的界面:
用Raspberry Pi 2和GPS接收机做一个精确的NTP服务器
这里选择

A8 Serial

回车,然后选择Disable选项,最后需要重启。

之后我们需要更新Raspberry Pi 2:

sudo apt-get update
sudo apt-get dist-upgrade
sudo rpi-update
sudo reboot

安装minicom

sudo apt-get install minicom

配置/dev/ttyAMA0串口波特率为9600

minicom -b 9600 -o -D /dev/ttyAMA0

测试串口

在终端输入如下命令:

cat /dev/ttyAMA0

串口有类似信息输出说明串口可正常使用:

$GPGSA,A,3,02,04,12,25,24,05,10,,,,,,02.4,01.1,02.1*07 
$GPGLL,2834.2631,N,07720.5426,E,102954.00,A,A*6E
$GPGSV,3,1,07,02,71,345,50,04,40,038,48,12,62,315,47,25,20,321,45*7F
$GPGSV,3,2,07,05,41,167,23,10,48,086,23,24,24,236,30,,,,*48
$GPGSV,3,3,07,,,,,,,,,,,,,,,,*7E

在Raspberry Pi 2上安装PPS

安装PPS-tools

在网络终端输入如下命令:

sudo apt-get install pps-tools
sudo apt-get install libcap-dev
sudo apt-get install libssl-dev(可选)
sudo dpkg-reconfigure tzdata(可选)

配置相关文件

在终端输入如下命令:

sudo vim /boot/config.txt

在文件的最后加入如下内容保存退出

dtoverlay=pps-gpio,gpiopin=18

如下图所示:
用Raspberry Pi 2和GPS接收机做一个精确的NTP服务器

在终端输入如下命令:

sudo vim /etc/modules

在文件的最后加入如下内容保存并退出

pps-gpio

如下图所示:
用Raspberry Pi 2和GPS接收机做一个精确的NTP服务器

配置完成后需要重新启动树莓派。

验证PPS是否工作

我们需要用lsmod 命令去检验PPS模块是否被加载了:

lsmod | grep pps

如果正常加载应输出如下类似信息:

pps_gpio          2555   0
pps_core 7092 1 pps_gpio

使用dmesg 命令检查PPS GPIO是否被配置:

dmesg | grep pps

应当输出类似下图所示的信息:
用Raspberry Pi 2和GPS接收机做一个精确的NTP服务器

使用ppstest 命令检查pps模块是否工作:

sudo ppstest /dev/pps0

应当输出类似下图所示信息:
用Raspberry Pi 2和GPS接收机做一个精确的NTP服务器
(按 CTRL+C 退出)

在Raspberry Pi 2上安装NTP

安装NTP

在终端输入下面的命令,来下载、编译、安装NTP:

wget http://archive.ntp.org/ntp4/ntp-4.2/ntp-4.2.8p3.tar.gz
tar zxvf ntp-4.2.8p3.tar.gz
cd ntp-4.2.8p3
./configure --enable-linuxcaps
make
sudo make install
sudo service ntp stop
sudo cp /usr/local/bin/ntp* /usr/bin/
sudo cp /usr/local/sbin/ntp* /usr/sbin/

配置NTP

使用如下命令编辑ntp.conf文件:

sudo vim /etc/ntp.conf

在文件的服务器列表后增加对GPS和PPS的支持,增加的内容如下:

# NMEA refclock driver directly from serial port
server 127.127.20.1 mode 24 minpoll 4 iburst prefer true
fudge 127.127.20.1 flag1 1 flag2 0 flag3 0 flag4 0 time1 0.00 refid GPS
# ATOM PPS driver directly from interrupt through /dev/pps1
server 127.127.22.1 minpoll 4 maxpoll 4 iburst true
fudge 127.127.22.1 flag2 0 flag3 0 flag4 1 time1 0.0 refid PPS

保存退出即可。
以上内容的参数说明可参考NTP源码目录下的帮助文档:

  • ntp-4.2.6p5/html/drivers/driver20.html
  • ntp-4.2.6p5/html/drivers/driver22.html

在Raspberry Pi 2运行NTP

在运行NTP之前我们还需要创建两个软连接以是NTP软件能够识别我们的PPS信号和ZDA信号,并处理它们。使用如下命令创建软连接:

ln -s /dev/ttyAMA0 /dev/gps1
ln -s /dev/pps0 /dev/gpspps1

我们的软连接命令应符合/dev/gpsX这样的格式,其中的X应与上面的127.127.20.X中的X相匹配,同样/dev/gpsppsX中的X应与上面的127.127.22.X相匹配。(X = 0,1,2……)

从新启动NTP:

service ntp restart

然后使用如下命令检查ntpd是否在用GPS NMEA和PPS工作:

watch ntpq -p

应当会输出类似如下的信息:

    remote           refid       st t when poll reach   delay   offset  jitter
==============================================================================
-120-88-47-10.in 103.1.106.69 2 u 43 64 377 51.624 537.091 1.517
+27.114.150.13 130.133.1.10 2 u 36 64 377 222.386 481.023 0.583
+77.235.14.49 131.188.3.220 2 u 41 64 377 284.982 510.672 1.408
*GPS_NMEA(1) .GPS. 0 l 10 16 377 0.000 1.996 0.204
oPPS(1) .PPS. 0 l 9 16 377 0.000 -469.94 0.191