一、概述
现代工业设备网络中,单一传感器难以支撑庞大而复杂的设备集群,往往是多传感融合,共同组成一个全面的感知体系。在多设备融合的过程中,时间是最基础且最重要的元素。如果不同传感器的时间不同,那么主机就难以将来自不同设备的数据加以处理。试想一下,传感器A、B同时感知到一个物体,A告诉你它是t1时刻感知到的,B告诉你它是t2时刻感知到的,那么问题来了,此时此刻,这个物体到底在不在这个位置?所以,时间同步是一个非常重要的前提条件。PTP(Precision Time Protocol) 是一个通过网络同步时钟的协议。本文将详细介绍PTP实现时间同步的原理以及实操。
二、PTP基本原理
PTP通过在主从时钟之间的传递消息来同步时间。主时钟将自己的时间戳广播到网络中,从时钟接收到广播的时间戳,根据网络传输的延时,就能得到一个精确的时间,将自身的时钟对其主时钟,这样就实现了主从时钟时间同步。如下图所示:

T1时刻,主时钟发送Sync报文,T2时刻从时钟收到Sync报文,需要注意的是,T2-T1并不一定是网络传输的延时delay,因为主从时钟的时间是不一样的,存在一定的偏移offset。 T3时刻,从时钟发送Delay Req报文,T4时刻主时钟收到报文。根据上述描述,可以得出来:
- 总延迟为(T4-T1)-(T3-T2),这可以消除主从时钟之间的偏移值,得出的是两次报文传输的总延时,所以:
- 单次延时delay = ((T4-T1)-(T3-T2))/2
- 主从时钟偏移offset = (T3+T2)/2 -(T4+T1)/2 计算出offset之后,从时钟就可以调整自身的时间,慢慢靠近主时钟,这样两者的时间就能同步起来,精度可以达到ns级。
三、应用
现在有两个设备,分别主机(主时钟)、相机(从时钟),通过PTP将相机的时间同步主机,保证主机接收到的图片的时间和本机时间是匹配的。
1、首先,需要在两台设备上安装PTP服务,Ubuntu可以通过apt安装
js
sudo apt update
sudo apt install linuxptp
linuxptp包含ptp和phc2sys,其中ptp用来广播报文,phc2sys用来将系统时间写入到网卡硬件时钟(或者反向)。可以先通过命令查看一下ptp和phc的参数:

ptp服务中,有几个参数需要关注:
- -H 表示硬件同步,通过硬件的方式来实现广播报文、同步时钟,精度更高,但是需要网卡设备硬件支持
- -S 相对的,表示通过软件的方式来进行时间同步
- -f 表示使用配置文件
- -O 表示手动设置offset,适用于明确知道不同设备时间偏移量的情况
- -m 表示通过标准输出的方式打印日志信息 其他大部分参数使用默认即可,对于特殊情况也可以自己修改对应参数。

phc2sys服务中,以下参数需要关注:
- -c 选择从时钟
- -s 选择主时钟
- -w 等待ptp服务
- -O 表示手动设置offset,适用于明确知道不同设备时间偏移量的情况
- -m 表示通过标准输出的方式打印日志信息 其他大部分参数使用默认即可,对于特殊情况也可以自己修改对应参数。
2、配置ptp服务参数
在主时钟设备上,新建ptp
参数文件,如/etc/linuxptp/ptp-master.conf
,配置如下:
js
[global]
priority1 128 # 优先级,0-255,值越小优先级越高,越有可能竞选主时钟
priority2 128 # 同上,当priority1相同时,比较priority2
slaveOnly 0 # 值为1表示强制设置为salve clock,不参与主时钟竞选
domainNumber 0 # PTP域编号,用于多域隔离,同一个域值须保持一致
timeSource 0x20 # 时间源
clockClass 6 # 时钟质量,值越小越好(0~255),决定是否成为主时钟
logAnnounceInterval 1
logSyncInterval -1 # 发送 Sync 包周期(单位:2^n 秒),`-1`表示 2^-1=0.5秒一次
logMinDelayReqInterval 0 # 发送 Delay_Req 包的周期,0表示 1秒一次
logging_level 6 # 日志等级,`6`是 INFO 级别,调试用
time_stamping hardware # 使用硬件时间戳(需要网卡和驱动支持)
twoStepFlag 1 # 启用两步时钟(Two-Step Clock),通常设为1,提高同步精度
tx_timestamp_timeout 20 #发送时间戳超时重试次数,保持默认
network_transport L2 # 使用二层网络(L2)传输 PTP 消息(以太网帧),L2适用于统一局域网内
[eth0]
delay_mechanism E2E # 延迟测量机制,E2E(端到端) 或P2P(点到点),局域网推荐E2E
创建ptp
、phc2sys
服务,如/etc/systemd/system/ptp-master.service
和/etc/systemd/system/phc2sys.service
,如下:
- ptp-master.service
js
[Unit]
Description=PTP Master Clock
After=network.target
[Service]
ExecStart=/usr/sbin/ptp4l -i eth0 -m -f /etc/linuxptp/ptp-master.conf
Restart=on-failure
[Install]
WantedBy=multi-user.target
- phc2sys.service
Description=Sync System Clock to PTP Hardware Clock
After=ptp-master.service
[Service]
Type=simple
ExecStart=/usr/sbin/phc2sys -s CLOCK_REALTIME -c eth0 -w -m
StandardOutput=append:/var/log/phc2sys.log
StandardError=append:/var/log/phc2sys.log
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
创建好服务文件后,通过systemctl
命令设置这些服务可以自启动:
js
systemctl enable ptp-master.service
systemctl enable phc2sys.service
在从时钟设备上,流程同上,不同的地方是个别参数配置,如/etc/linuxptp/ptp-slave.conf
,配置如下:
js
[global]
priority1 255
priority2 255
slaveOnly 1
domainNumber 0
clockClass 248
logAnnounceInterval 1
logSyncInterval -1
logMinDelayReqInterval 0
logging_level 6
time_stamping hardware
twoStepFlag 1
tx_timestamp_timeout 20
network_transport L2
[eth0]
delay_mechanism E2E
参数的含义可以对比master
端,更容易理解。 创建ptp
、phsysc
服务,如/etc/systemd/system/ptp-slave.service
和/etc/systemd/system/phc2sys.service
,如下:
- ptp-slave.service
js
[Unit]
Description=PTP slave Clock
After=network.target
[Service]
ExecStart=/usr/sbin/ptp4l -i eth0 -m -f /etc/linuxptp/ptp-slave.conf
Restart=on-failure
[Install]
WantedBy=multi-user.target
- phc2sys.service
js
[Unit]
Description=Sync System Clock to PTP Hardware Clock
Wants=network-online.target
After=network-online.target ptp-slave.service
Requires=ptp-slave.service
[Service]
Type=simple
ExecStart=/usr/sbin/phc2sys -s eth0 -c CLOCK_REALTIME -w -m
StandardOutput=append:/var/log/phc2sys.log
StandardError=append:/var/log/phc2sys.log
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
同样,设置他们开机自启动。
3、验证
配置好上述服务之后,重启主从设备,可以通过systemctl
命令查看服务的状态,如查看master服务:
js
systemctl status ptp-master.service
如果显示服务状态是active
,说明服务正常运行。 可以分别在主从设备上通过date
命令检查系统时间,观察时间是否一致。或者,在上面的service中,会将ptp和phs2sys服务的日志记录在/var/log目录下,可以查看日志文件,观察时间同步的效果。