前言

如果同时管理比较多的设备,不同的设备使用相对比较同步的时间,时候追溯日志之类的操作会显得更加方便;对于安全性、时效性比较高的业务,时间同步更有明确的价值。市售NTP服务器价格高昂,此系列给出一些实际例子。


CDMA版本

除了GPS信号,也有CDMA信号的,但是近些年电信开始清退2G CDMA网络,所以此方案不再发布。在过去几年的实际运用中,笔者更常用的就是CDMA方式。

理由:

1、机房肯定有手机信号覆盖;

2、CDMA终端均可以得到时间。不需要设备安装用户识别卡。

弊端:

1、自行做好安全防护。见过电信网优为了VIP客户,用手机操作向日葵远程控制软件,控制自己的笔记本电脑去重启基站。重启后CDMA基站设备未同步时间可能仍然会广播出错误的时间,发送的时间是重启的瞬间的时间,就会导致时间出现问题;或者因为配置不当,出现正好晚1个小时或者9个小时8个小时的情况。自行搜索类似的贴子,因为CDMA功能机以及早期CDMA安卓机不开放时间修改的功能就会导致手机时间出错。防止时间大幅度调整即可。部分时间服务端本身就能避免这种方式,比较长的时间调整需要加强制参数。

2、目前清退状态。有信号的地区清退也只是迟早的事。


成品

绝大多数都是大空壳卖高价。对外提供服务的软件构成很多都是上古Linux。虽然有一些看起来是商品,但是金玉其外败絮其中,强弱电没有严格的分离,看起来压根就不配取得3C。

曾帮助某单位修复过一台价值3万的NTP时间服务器。一个上古机顶盒RTD某型号的SOC核心板,辅以4G的EMMC,运行着debian7。无论是软件还是硬件,怎么看也不值这个价位。更别提这玩意儿虽然没开放什么端口服务,但是年久失修下仍然避免不了各种漏洞,让各种现成的漏洞演示脚本可以一键root了这台设备。

至于这种设备想要修复漏洞自然是不可能的。毕竟这种方案可没办法自行编译升级更新的内核,内核出了大洞缓解措施始终是有限的。当然,一般的技术人员人微言轻,说了也是白说,常见的安全扫描往往也漏过了这些更可能出现问题的设备。


硬件

硬件不做推荐,标准GPS设备均不影响。无论是2G/3G/4G/5G模块提供的GPS接口,还是专用的GPS模块均可以作为时间源。如果手头什么都没有,各种二手的廉价4G模块配合USB转换器以及天线成本大概也就50以内,同时还能作为接入4G网络的设备,提供备用的带外管理网络;如果需要全新的硬件,目前来说USB-TTL转换以及三模的定位模块也很便宜,还能接收到老的4G模块无法接收到的更准确地国货北斗信号、欧洲的伽利略信号,甚至是日本的那啥。

也有各种蓝牙、USB的GPS设备也是可以直接用的。安卓手机与电脑通过USB或者蓝牙连接之后,modem以及gps之类的设备也能在电脑上调用了,除了设备功能更多更复杂,使用起来与传统的3G/4G这些模块其实差不多。能直接提供WiFi联网的模块其实许多就运行了安卓系统,比如以拆机高通410利旧方案的那些4G网卡刷入Linux之后也可以直接这样玩。

如果接受条件合适,普通楼房、高层住宅窗边,由于搜星数量角度问题可能会难以定位(虽然实际测试中都能够迅速高精度定位),但是获取到准确的时间还是没什么难度的。

至于基站之类的专业设备使用1/2馈线连接蘑菇头,纯粹是为了得到更好的信号,以及减小微弱的信号在馈线的损失。在实际使用中,普通的天线足矣,如果将天线贴在窗户玻璃上,我反而要建议:小心雷雨天气。

当然,过于廉价的天线,或者不用天线的做法就不建议了。哪怕当前接收信号的条件良好,但是阴雨天气可能就没信号了。


部署

以Linux计算机为例,配置不限。不论是x86的小电脑、服务器,或者是arm的各种开发板、机顶盒,mips架构的路由器也不是不可以,都可以测试,如果用于部署线上环境,稳定的设备很有必要,性能本身也要足够满足客户端的请求量。

apt install gpsd*

这是一个方法,会同时安装gpsd gpsd-tools gpsd-clients。红帽系类似,大部分常用的Linux发行版的官方或者常用的源都有提供这些软件。用于生产场景可能要将gpsd开机自启动。以systemd管理的系统为例:

systemctl enable --now gpsd

也有的发行版可能默认在安装后就已经直接开始运行,以及默认自动运行了。所以这个命令可能不会有任何返回。

接下来就是配置GPSdaemon。如果是USB移动通信模块,连接后会见到多个接口。比较早的一些系统可能还需要设置usbmodeswitch,然后就会见到多个形如/dev/ttyUSBS0的设备,例如USB0 USB1 USB2;如果是使用开发版、路由器的TTL接口直接连接,可能是类似/dev/ttyS1之类的端口。

通过ntpd作为时间服务器是最常见的方式,编辑/etc/ntp.conf,自带的配置文件注释部分可能就有使用GPS的方式。

gpsd以及ntpd两个程序本身对性能要求极低,曾经一段时间就用这样的一款硬件作为时间服务器:

WR-703N,或者类似的设备。实际上当时我是使用了WR-702N,因为没有引出USB A口,更为简洁。

硬改电阻设定,将USB飞线到microusb供电口,将USB设置为SLAVE模式便于作为一个USB设备连接到其他的电脑。通过一根线同时完成供电和数据传输。然后引出ttl连接GPS定位模块。

然后这就完了?对,这就完了。市售的时间服务器内部很可能也就是这样的构造,程序也是差不多的。

前面提到的合同价格价值三万的时间服务器设备,经我对运行中的Linux系统的仔细研究,并没有什么高级的配置,甚至没有用上Linux与芯片本身却是能实际启用的watchdog。无非是多了一块以TTL方式单项传输的LCD1602显示器。当系统正常运行之后,能够在这块小屏幕上显示当前获取到的时间。1U的体积纯属是浪费空间,应该是三无电源发出吱吱的响声表明它还在工作,一块现成的核心板贴在简单简陋的双面PCB上,要我说?给100块都嫌多,而目前的状态,对我而言花20块钱当买了个铁壳、TTL方式刷新的LCD1602还行,多一毛都不要。它内置的ntpd配置文件完全就是官方提供的例子。


其他

其实有更简单的实现方式,但是好像没有现成的轮子可以用。电商平台上那种一个GPS模块与4位数码管组成的“GPS时速表”。这种GPS模块在通电热机后就会自动开始工作,不断地输出信息:NEMA,标准的GPS数据格式。每一行数据可能不能提供准确的定位信息,只要卫星信号足够,至少都包含准确的时间。

原理上是一致的,但是这种东西没准可以做出更稳定,更商用的作品?

我有一个设想,以ESP32搭配一个这样的模块,为ESP32配一个网口,如果有必要的再加上I2C的LCD1602甚至是LCD128*64的。

最后:GPS不大可能会出错,不过就算不提上个世纪那些特殊时期,实际生产场景一定要防范错误数据,或者无法接收到信号的情况。