LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

时间同步:基于PPS、NMEA协议,使用GPS模块、gpsd、chronyd构建时间同步方案

基于GPS(提供NMEA和PPS)获取精确时间,gpsd将时间提供给chronyd,进而完成精确时间同步。

1 时间同步框架

整个时钟同步框架实现包括:

  • GPS模块:通过UART传输NMEA协议信息;通过GPIO中断,传递PPS信号。
  • gpsd从PPS(/dev/pps0)和NMEA(/dev/ttyS0)获取UTC时间和PPS精准时钟校准信息。
  • chronyd是NTP服务器,通过共享内存从gpsd获取时间信息。

2 PPS、NMEA、PTP、NTP

PPS(Pulse Per Second)
PPS(每秒脉冲)是一种时间信号,用于提供精确的时间参考。PPS信号通常是通过硬件设备(如GPS接收器)提供的,它在每一秒的开始发送一个脉冲信号。这个脉冲可以用来同步计算机或其他设备的时钟,以确保它们的时间是准确的。PPS信号在需要精确时间戳的应用中非常有用,比如在测量、科学实验和某些类型的网络同步中。PPS协议通常与NTP或PTP协议结合使用,以提供更精确的时间同步。

NMEA(National Marine Electronics Association)
NMEA是国际海事电子协会,它是一个非盈利的组织,负责制定和维护船舶电子设备的标准。NMEA协议通常指的是NMEA 0183,这是一种数据通信协议,用于在船舶上的电子设备之间交换信息,如GPS位置、速度、航向等。NMEA 0183协议允许不同的设备和制造商之间的兼容性,使得数据可以轻松地从一个设备传输到另一个设备。

PTP(Precision Time Protocol)
PTP(精确时间协议)是一种网络协议,遵循IEEE 1588标准,用于实现网络节点之间的高精度频率同步和相位同步。PTP能够达到亚微秒级别的时钟同步精度,适用于广电网络、城市轨道交通、无线接入网络等场景。PTP协议通过在主从节点之间传输同步消息来实现时间同步,包括主同步消息、延迟响应消息和时钟延迟请求消息。PTP支持频率同步和相位同步,并且时间同步精度远高于NTP,可以达到亚微秒级别甚至几十纳秒。

NTP(Network Time Protocol)
NTP(网络时间协议)是一种用于网络时间同步的协议,旨在确保计算机和其他网络设备具有准确的时间,并通过与时间服务器进行通信来同步其时钟。NTP允许客户端从服务器请求和接收时间,而服务器又从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC。NTP以层级来组织模型结构,层级中的每层被称为Stratum,时钟层数的取值范围为1~16,取值越小,时钟准确度越高。NTP的时间同步精度通常在毫秒到微秒级别,适用于大多数一般性应用。

3 gpsd

3.1 gpsd编译

Utilities
    gpsd............................... An interface daemon for GPS receivers
    gpsd-clients....................................... GPS tools and clients
    gpsd-utils.............................................. GPS daemon utils

3.2 gpsd

/etc/rc.d/S50gpsd启动gpsd。

/etc/config/gpsd是 OpenWrt 系统中用于配置gpsd服务的 UCI(Unified Configuration Interface)配置文件。

3.3 gpsctl

gpsctl是一个用于控制和配置 GNSS(全球导航卫星系统)接收器的实用程序。

3.4 gpsmon

gpsmon是一个实时 GPS 数据包监控和控制工具,它用于监视来自 GPS 设备的数据包并显示它们以及诊断信息。

 详细解释如下:

  • Cooked TPV
    • Time: 2024-11-19T06:47:13.000Z,表示时间戳,UTC 时间。
    • Lat: 表示纬度。
    • Lon: 表示经度。
  • Sentences
    • GNGGA: 全球定位系统固定数据。
    • GNGLL: 全球定位系统位置数据。
    • GPDSA: 差分GPS数据。
    • GPGSV: 可见卫星信息。
    • GNRMC: 推荐的最小导航信息。
    • GNVTG: 地面速度信息。
    • GNZDA: 日期和时间信息。
    • GPTX: 传输信息。
  • GSV (Satellites in View)
    • SVID: 卫星ID。
    • PRN: 伪随机噪声码,用于识别卫星。
    • Az: 方位角,卫星相对于正北方向的角度。
    • El: 仰角,卫星相对于地平线的角度。
    • SN: 信号强度。
    • HU: 信号的信噪比。
  • GGA
    • Time: 064713.000,表示时间戳,UTC 时间。
    • Latitude: 表示纬度。
    • Longitude: 表示经度。
    • Altitude: 106.9,表示海拔高度,单位可能是米。
    • Quality: 1,表示定位质量,1通常表示定位有效。
    • Sats: 27,表示可见卫星的数量。
    • HDOP: 0.5,水平精度因子。
    • Geoid: 大地水准面与WGS-84椭球面之间的差异。
  • GSA+PPS
    • Mode: A,表示定位模式,A表示自动。
    • Sats: 3 4 16 +,表示用于定位的卫星。
    • DOP: 0.5,表示测距精度因子。
    • PPS: 1.0000145527,可能表示每秒脉冲的偏移量。
    • TOFF: 1.349161565,可能表示时间偏移。
  • GST
    • LAT: 表示纬度。
    • LON: 表示经度。
    • UTC: 064713,表示时间戳,UTC 时间。
    • RMS: 未显示,通常表示位置的均方根误差。
    • MIN: 未显示,可能表示最小值。
    • MAJ: 未显示,可能表示最大值。
    • ORI: 未显示,可能表示方向。
    • ALT: 未显示,可能表示海拔。
  • RMC
    • Time: 064713,这是UTC时间,格式为hhmmss,表示06时47分13秒。
    • Status: A,表示定位状态,A代表数据有效(Active)。
    • Latitude: 与Cooked TPV中的纬度相同。
    • Longitude: 与Cooked TPV中的经度相同。
    • Speed: 0.00,表示地面速度,单位为节(knots),这里显示速度为0,意味着设备可能处于静止状态。
    • Course: 10.17,表示航向,单位为度(degrees),这里显示航向为10.17度。
    • FAA: A,可能表示FAA(美国联邦航空管理局)模式,A代表正常模式。
    • MagVar: 未显示,通常表示磁偏角(Magnetic Variation),即磁北与真北之间的夹角。

3.5 gpsdecode

gpsdecode是一个用于批量处理的解码器,它能够将NMEA(National Marine Electronics Association)和各种与GPS、AIS(Automatic Identification System)、差分校正服务相关的二进制数据包格式转换为可读格式。它将标准输入的二进制数据转换为标准输出的JSON格式,使用与gpsd相同的解码逻辑,但具有更简单的接口,适用于数据文件的批处理。

3.6 gpsdctl

gpsdctl 是一个用于通过控制套接字向 gpsd 发送命令的工具,主要用于添加或从守护进程的设备列表中移除设备。这个工具并不打算由用户直接调用,而是由 Linux 热插拔系统和类似设施使用。

3.7 gpxlogger

gpxlogger 是一个 GPSD 客户端,它从 gpsd 守护进程收集数据点并以 GPX 格式(一种用于记录轨迹的 XML 配置文件)记录到标准输出。

3.8 cgps

cgps 是一个基于 curses 的 GPSD 客户端,它以文本界面的形式在终端中显示 GPS 数据。它提供了实时的 GPS 信息,包括位置、速度、航向等,并且可以配置显示不同的信息面板。

3.9 gpspipe

gpspipe 是一个命令行工具,用于连接 gpsd 守护进程并将接收到的数据输出到标准输出(stdout)。它通常用作从 gpsd 到另一个程序或文件的管道,允许用户获取实时的 GPS 数据流。

3.10 gpsrinex

gpsrinex 是一个 GPSD 客户端,用于将 GPS 数据转换为 RINEX(Receiver Independent Exchange Format)格式并保存到文件中。RINEX 是一种标准格式,用于存储全球导航卫星系统(GNSS)数据,广泛应用于精密定位和导航领域。

3.11 gpssnmp

gpssnmp 是一个 GPSD 客户端,它使用 SNMP(Simple Network Management Protocol)来提供 GPS 数据。它可以将 GPS 信息转换为 SNMP 格式,使得网络管理工具能够监控和获取 GPS 数据。

3.12 ntpshmmon

 ntpshmmon 是一个工具,用于监控 gpsd 更新的共享内存段,这些内存段可能被其他 NTP(Network Time Protocol)参考时钟源使用。它以与 ntpd(NTP 守护进程)相同的方式读取这些内存段,并且可以与 ntpd 并行运行而不干扰其正常操作。

4 chrony

chrony支持以下几种时间同步:

  • 与NTP服务器同步:chronyd 可以与NTP服务器同步系统时间。这是最常见的同步方式,可以通过配置文件中的 server 指令来指定要同步的NTP服务器。
  • 与参考时钟同步:chronyd 也可以与参考时钟(例如GPS接收设备)进行同步。
  • 手动输入时间同步:chronyd 还可以与手动输入的时间进行同步。
  • 作为NTP服务器提供时间同步服务:chronyd 可以作为一个NTPv4(RFC 5905)服务器,为其他计算机提供时间同步服务。
  • 硬件时间戳同步:chronyd 支持Linux上的硬件时间戳,允许在本地网络进行极其准确的同步。
  • 内核时间与RTC时间同步:通过 rtcsync 指令,chronyd 可以定期将系统时间复制到RTC时钟,并且不再尝试跟踪RTC时钟的偏移。

4.1 chrony编译

Network
    Time Synchronization
        chrony................... A versatile NTP client and server (without NTS)
        chrony-nts.................. A versatile NTP client and server (with NTS)

4.2 chronyd

/etc/init.d/chronyd用于启动和管理chronyd:

#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2015 OpenWrt.org

START=15
USE_PROCD=1
PROG=/usr/sbin/chronyd
CONFIGFILE=/etc/chrony/chrony.conf
INCLUDEFILE=/var/etc/chrony.d/10-uci.conf
RTCDEVICE=/dev/rtc0
...
start_service() {
    . /lib/functions/network.sh

    procd_open_instance
    procd_set_param command $PROG -n
    procd_set_param file $CONFIGFILE
    procd_set_param file $INCLUDEFILE
    procd_close_instance

    config_load chrony--加载chrony配置,写到/var/etc/chrony.d/10-uci.conf中。
    mkdir -p $(dirname $INCLUDEFILE)

    (
        config_foreach handle_source server server
        config_foreach handle_source pool pool
        config_foreach handle_source peer peer
        config_foreach handle_allow allow
        config_foreach handle_makestep makestep
        config_foreach handle_nts nts
    ) > $INCLUDEFILE
}

/etc/config/chrony包含了chrony的UCI配置,生成/var/etc/chrony.d/10-uci.conf:

config pool
    option hostname '2.openwrt.pool.ntp.org'
    option maxpoll '12'
    option iburst 'yes'

config dhcp_ntp_server
    option iburst 'yes'
    option disabled 'no'

config allow
    option interface 'lan'

config makestep
    option threshold '1.0'
    option limit '3'

config nts
    option rtccheck 'yes'
    option systemcerts 'yes'

/etc/chrony/chrony.conf包含了一些全局配置和对 UCI 配置文件的引用:

# Load UCI configuration
confdir /var/etc/chrony.d--指向/etc/config/chrony生成的UCI配置。

# Load NTP servers from DHCP if enabled in UCI
sourcedir /var/run/chrony-dhcp

# Log clock errors above 0.5 seconds
logchange 0.5

# Don't log client accesses
noclientlog

# Mark the system clock as synchronized
rtcsync

# Record the clock's drift
driftfile /var/run/chrony/drift

# Save NTS keys and cookies
ntsdumpdir /var/run/chrony

4.3 chronyc

chronyc 是 Chrony 套件中的一个命令行工具,用于监控和调整 Chrony 的运行状态。

chronyc sourcestats 是一个用于显示Chrony时间同步源统计信息的命令。

  • NP: Number of sample points in measurement set,即测量集中的样本点数量。
  • NR: Number of residual runs with same sign,即具有相同符号的残差运行次数。
  • Span: Length of measurement set (time),即测量集的时间跨度。
  • Frequency: Est. clock freq error (ppm),即估计的时钟频率误差(每百万分之几)。
  • Freq Skew: Est. error in freq.,即频率误差的估计值。
  • Offset: Est. offset,即估计的偏移量。
  • Std Dev: On the samples,即样本的标准偏差。

使用 chronyc sources 命令来查看 Chrony 当前正在使用的时间源以及它们的状态。

 chronyc tracking 命令显示了 Chrony 跟踪的时间源和它的偏移量等信息。

chronyc makestep会立即将系统时间跳跃到NTP服务器提供的时间,而不会逐渐调整时间

参考文档《嵌入式设备时间同步(gpsd pps chrony 校时)_gpsd+pps时间同步》《嵌入式Linux时间同步 gpsd+chrony+pps_linux pps-CSDN博客》。

posted on 2024-11-23 23:59  ArnoldLu  阅读(212)  评论(0编辑  收藏  举报

导航