摘要:本文介绍了在不联网情况下,利用现有设备TVZ3100和RaspberryPi服务器完成为非编网服务器和工作站授时的技术方案、服务安装配置、物理接线和PYTHON代码实现。
关键词:非编网;GPS授时;NTP集群
前言
我台新闻非编网在建设时并没有配套授时设备,但经过了一段时间的运行维护,发现各个设备的系统时钟误差越来越大,导致许多服务器的日志记录对比核查比较麻烦。恰巧,机房内有两台供演播室倒计时钟授时的TVZ3100 GPS校时钟,于是,我们结合现实条件,对系统进行改造,用较小的成本完成了这个需求。
一、技术方案
技术方案如下图1所示,用RaspberryPi服务器来获取TVZ3100 GPS校时钟的RS232时钟信号输出,然后RaspberryPi服务器安装配置NTP服务,为非编网服务器、工作站等设备提供标准的NTP授时服务。
图1
二、系统安装
首先,我们采用Raspberry Pi服务器官方定制的操作系统镜像(2020-02-13-raspbian-buster-full.img)来完成系统安装,只需用工具balenaEtcher或win32diskimager把镜像烧入TF卡,然后把TF卡插入
Raspberry Pi服务器卡机即可按提示完成系统安装。
系统安装好后,我们需要完成VNC、WIFI、NTP服务、keepalived服务、UFW服务、串口重分配的安装配置。
三、VNC配置
VNC服务用于我们远程登录、维护系统,我们安装的最新版系统已默认安装了VNC服务,只需要开启即可。
1、打开终端命令行,运行:sudo raspi-config
2、如下图2、3、4所示,开启VNC服务即可。
四、WiFi服务配置
配置WiFi服务同样也是为了方便我们登录、维护系统。配置好后,只要在服务器旁边打开手机热点,Raspberry Pi服务器会自动接入热点,然后我们可以通过热点手机上的VNC登录Raspberry Pi服务器了,非常方便。具体配置如下:
1、打开/etc/wpa_supplicant/wpa_supplicant.conf
2、增加一段配置:
network={
ssid="test"
psk="123245678"
key_mgmt=WPA-PSK
priority=1
}
其中,test为需要自动连接的手机热点的SSID,12345678为设计热点的密码,WPA-PSK为加密方式,priority=1是优先级。
五、NTP服务安装配置
NTP服务用于为非编网服务器和工作站提供标准的授时服务,具体安装、配置如下:
1、打开终端命令行,输入以下命令安装NTP服务:
sudo apt-get install ntp
2、修改/etc/ntp.conf如下:
driftfile /var/lib/ntp/drift
restrict default kod nomodify notarp nopeer noquery
restrict -6 default kod nomodify notarp nopeer noquery
restrict 192.168.50.0 mask 255.255.255.0 nomodify notrap
restrict 127.0.0.1
restrict ::1
server 127.127.1.0
fudge 127.127.1.0 stratum 2
3、输入以下命令启动NTP服务
service ntpd start
4、注意:NTP服务器配置、启动完毕后,需要等待5-10分钟才能与/etc/ntp.conf中配置的标准时间进行同步。
六、UFW服务配置
UFW是linux下的防火墙,配置简单方便,我们需要开启NTP服务、VNC服务、SSH服务的端口访问权限,禁止掉其他不用的端口访问权限,提高服务器的安全性,具体安装配置命令如下:
sudo apt-get install ufw
sudo ufw enable
sudo ufw default deny
sudo ufw allow 123
sudo ufw allow 5900
sudo ufw allow 22
以上命令的具体意思是:
1、安装ufw防火墙;
2、开启ufw防火墙;
3、默认禁止所有访问;
4、允许外部访问本机端口123(NTP服务)
5、运行外部访问本机端口5900(VNC服务)
6、运行外部访问本机端口22(ssh服务)
七、串口重分配
Raspberry Pi服务器的串口默认被其他设备占用,我们需要重新配置释放之后才能使用它来进行串口通信。具体配置如下:
1、修改配置文件 sudo nano /boot/config.txt注释掉最后一行 dtovrtlay=w1-gpio
2、修改配置文件 sudo vim /boot/cmdline.txt
删掉console=serial0,115200 (可以先对文件备份,sudo cp /boot/cmdline.txt /boot/cmdline.txt.bak 方便以后对配置文档进行恢复 )
3、重启: sudo reboot
八、RS232物理连接
Raspberry Pi服务器没有现成的RS232接口,需要做线实现从GPIO接口到RS232接口的物理连接。Raspberry Pi服务器GPIO接口的针脚定义、标准的RS232针脚定义如图5、图6所示,TVZ3100卫星校时钟说明书中关于RS232输出的定义如图7所示。
.png)
.png)
要实现双向串口通信,RS232和GPIO的对应针脚关系为:
RS232的2脚->GPIO的8脚
RS232的3脚-> GPIO的10脚
RS232的5脚->GPIO的6脚
而TVZ3100的说明书指出,TVZ3100是单向输出,不需要输入信号,所以,RS232的2脚->GPIO的8脚这一芯可以不用做。
九、PYTHON编程实现
完成物理连接后,我们就可以在PYTHON编程环境下,读取TVZ3100发送到授时信号,用来同步本机时间,再由NTP服务完成非编网服务器和工作站的授时需求。
具体代码如下:
import serial
import time
import datetime
import os
dc=1
#延时校正变量,根据服务器运行效率来设置,必须0<=dc<=5
while True:
ser = serial.Serial("/dev/ttyAMA0 ",4800,timeout=30)
#打开串口连接TVZ3100,波特率4800
while True:
while True:
if ser.read(1).hex() == "aa":
#检查信号同步字
break
print(datetime.datetime.now())
#本周期授时开始前,输出系统时间
dt1 = ser.read(8).hex()
#读取串口授时信号
if int(dt1[14:]) >= 15 :
continue
else:
dt2 =str(int(dt1[12:])-dc)
#校正时钟误差
setdate = 'sudo date -s "20' + dt1[2:8] + ' ' + dt1[10:12] + ':' + dt1[12:14] + ':' + dt2 + '"'
#拼接授时命令字符串
os.system(setdate)
#修改系统时钟
print(datetime.datetime.now())
#本周期授时完成后,输出系统时间
ser.close()
#关闭串口
time.sleep(600)
#延时600秒后,再循环获取授时信号
十、客户端配置
Windows系统的服务器和工作站只需要如下图8所示,填入NTP服务器的IP即可自动定期同步系统时钟;而linux系统的服务器则需要如前所述,安装NTP服务,把配置文件里的server 127.127.1.0的IP改成NTP服务器IP。
.png)
需要注意到是,如果系统时钟误差太大(约16分钟左右),是无法通过NTP服务器来同步的,需要先手动调整时间到差不多,才能依赖NTP服务来自动校正。
十一、总结
广电业内非编网大多与互联网隔离,因此不能直接获取公网NTP服务器的授时服务。本文是基于现有设备和环境的一个较低成本的实现,相较于日常x86服务器万元以上的价格, 一台基于ARM芯片的RaspberryPi服务器仅需不到500元人民币,且功耗低、linux系统稳定性好。日后需求增多,还可以扩展为服务器集群,增强性能和健壮性;扩展各种传感器,增强运维功能等等,是我们在计算机系统运维工作中一种很不错的选择。
参考文献:
[1]龙波,张宇,黄徐瑞晗,王菊凤,韩锋.基于NTP协议的网络授时系统设计[J].计量与测试技术.2019-05-30.
[2]杨明.基于CentOS操作系统部署NTP服务 电子世界2018-12-08
[3]刘瑜.Python编程从零基础到项目实战[M].水利水电出版社.2018-10
[4]Raspberry Pi开发实战 ?Simon?Monk[M].机械工业出版社出版.2015-04
[5]Python Programming with Raspberry Pi Sai Yamanoor Packt Publishing 2017-04-28