PTP墙钟不实用且过于精确

Jeff Geerling 工具

摘要

使用树莓派和LED矩阵显示器构建PTP墙钟的指南,演示通过精确时间协议实现精确时间同步。

<p>在看了 Oliver Ettlin 在39C3上的演讲<a href="https://media.ccc.de/v/39c3-excuse-me-what-precise-time-is-it">请问,现在精确的时间是什么?</a>后,我想复现他现场用于演示PTP时钟同步的PTP(<a href="https://en.wikipedia.org/wiki/Precision_Time_Protocol">精确时间协议</a>)时钟:</p> <figure class="insert-image"><img src="https://www.jeffgeerling.com/blog/2026/ptp-wall-clock-impractical-too-precise/39c3-oliver-ettlin-ptp-clock.jpg" alt="Oliver Ettlin在39C3展会上展示PTP墙钟" width="700" height="auto"> </figure> <p>我在LinkedIn上联系了他,询问这个构建的细节(不止我一个人感兴趣!)。不久之后,他发布了<a href="https://github.com/Gemini2350/ptp-wallclock">Gemini2350/ptp-wallclock</a>仓库,里面包含构建的大致说明,以及一个用树莓派在两块LED矩阵显示屏上显示PTP时间(如果网络中可用)的C++应用程序。</p>
查看原文
查看缓存全文

缓存时间: 2026/05/16 03:38

# PTP 挂钟:不实用,但过于精准 来源:https://www.jeffgeerling.com/blog/2026/ptp-wall-clock-impractical-too-precise/ 在观看了 Oliver Ettlin 在 39C3 上的演讲《Excuse me, what precise time is It?》(https://media.ccc.de/v/39c3-excuse-me-what-precise-time-is-it) 之后,我想复刻他现场演示 PTP(精确时间协议,https://en.wikipedia.org/wiki/Precision_Time_Protocol)时钟同步时所用的那个 PTP 时钟: Oliver Ettlin 在 39C3 上的 PTP 挂钟 我在 LinkedIn 上联系他询问制作细节(我并不是唯一这么做的人!),不久之后,他发布了 [Gemini2350/ptp-wallclock](https://github.com/Gemini2350/ptp-wallclock) 这个仓库,里面包含了粗略的制作说明,以及一个用 C++ 编写的应用程序,用于在两组 LED 矩阵显示屏上显示 PTP 时间(如果网络上有 PTP 源的话),硬件平台是树莓派。 树莓派之所以适用,是因为它满足 PTP 时钟的两个要求: 1. 易于通过 GPIO 和 HAT 与 LED 矩阵显示屏连接 2. 它的博通网卡具备 [PTP 硬件时间戳能力](https://www.jeffgeerling.com/blog/2022/ptp-and-ieee-1588-hardware-timestamping-on-raspberry-pi-cm4/)。 我想为了自娱自乐复刻他的时钟,同时也为即将制作的关于 PTP 的视频提供一个视觉辅助。而且我成功了! 您的浏览器不支持视频标签。 在这篇文章中,我将详细介绍所使用的硬件、物理构建过程,以及如何从全新的树莓派操作系统安装一路走到在 128x32 RGB LED 矩阵上显示 PTP 时间!我还发布了一个关于此过程的 YouTube 视频,以防你想要更直观的指南: ## 所需硬件 PTP 挂钟所需硬件(松散组装) 所需硬件成本大约在 120-150 美元之间,取决于我们处在 AI 泡沫的哪个阶段: - **树莓派 4 Model B**([https://www.raspberrypi.com/products/raspberry-pi-4-model-b/](https://www.raspberrypi.com/products/raspberry-pi-4-model-b/))(树莓派 5 目前还不能与 RGB 矩阵正常工作,参见 [这个 issue](https://github.com/hzeller/rpi-rgb-led-matrix/issues/1603)) - **Adafruit RGB Matrix HAT + RTC 树莓派扩展板**([https://www.adafruit.com/product/2345](https://www.adafruit.com/product/2345)) - **Waveshare 64x32 像素 LED 矩阵面板**([https://www.waveshare.com/RGB-Matrix-P3-64x32.htm](https://www.waveshare.com/RGB-Matrix-P3-64x32.htm))× 2 - **Adafruit 5V 4A 电源**([https://www.adafruit.com/product/1466](https://www.adafruit.com/product/1466))或等效电源 - **32GB microSD 卡**([https://www.raspberrypi.com/products/sd-cards/](https://www.raspberrypi.com/products/sd-cards/)) 任何树莓派 4 都可以正常工作;你不需要大量内存。另外,显而易见的是,你还需要网络中有一个 **PTP 主时钟**([https://www.timebeat.app/post/understanding-precision-time-protocol-the-guide-to-ptp-grandmaster-boundary-and-transparent-clocks](https://www.timebeat.app/post/understanding-precision-time-protocol-the-guide-to-ptp-grandmaster-boundary-and-transparent-clocks)),它应该向标准的 PTP 多播 IPv4 地址 `224.0.1.129` 发送广播。你也可以拥有多个 PTP 主时钟,让树莓派使用 PTP 的 **最佳主时钟算法 (BMCA)**([https://blog.meinbergglobal.com/2013/11/14/makes-master-best/](https://blog.meinbergglobal.com/2013/11/14/makes-master-best/))来选择最佳时间源。 ## 硬件设置 Adafruit RGB Matrix HAT 需要一些焊接工作。它包含一个 2x20 母排针,可以插在树莓派的 GPIO 排针上,顶部有一个排线连接器,还有一个 5V 直流电源输出螺丝端子接头,用于为两个 LED 矩阵供电。 焊接 Adafruit 的 RGB Matrix HAT 完成后,只需将随两个 Waveshare LED 矩阵面板附带的线缆插入 Adafruit HAT 上的接头。一根排线从 HAT 连接到“右侧”LED 矩阵(从正面看)。然后,右侧矩阵通过另一根排线连接到左侧矩阵。电源线已经分叉成两个矩阵显示屏的接口,因此将 4 针插头插入电源输入,并将螺丝端子拧到 HAT 上的正极和负极螺丝端子上。它们会露出一半,所以……不要让它们短路。或者,剪掉线头,剥出一些导线,直接拧入螺丝端子。 一图胜千言: RGB Matrix HAT 插入树莓派 HAT 插入 5V DC 输入插孔(5.5mm x 2.5mm,中心正极)的是一个 5V 4A 电源。在上图中,我使用了 Werewolf VFLEX([https://werewolf.us/collections/werewolf-products/products/x-cable-5-5mm-od-2-5mm-id-barrel-jack](https://werewolf.us/collections/werewolf-products/products/x-cable-5-5mm-od-2-5mm-id-barrel-jack))适配器配合树莓派 USB-C 电源,但最好使用专用的 5V 4A 电源,以防止驱动显示屏时出现电压降(会导致闪烁)。 ## 软件设置 假设你的 microSD 卡上已经安装了全新的树莓派操作系统,软件设置分为几个阶段。第一步是配置树莓派,以优化 LED 矩阵的刷新性能。禁用通用 CPU 核心调度(以便线程更好地固定到单个核心),并禁用内置音频输出: ``` # 编辑 `/boot/firmware/cmdline.txt`,在该行末尾添加: isolcpus=3 # 在 `/boot/firmware/config.txt` 中将参数切换为 'off' 以禁用音频: dtparam=audio=off ``` 将 `snd_bcm2835` 内核模块加入黑名单([https://github.com/hzeller/rpi-rgb-led-matrix?tab=readme-ov-file#bad-interaction-with-sound](https://github.com/hzeller/rpi-rgb-led-matrix?tab=readme-ov-file#bad-interaction-with-sound)): ``` cat << EOF | sudo tee /etc/modprobe.d/blacklist-snd_bcm2835.conf blacklist snd_bcm2835 EOF ``` 重新启动后,下载并构建 RGB 矩阵代码库: ``` cd ~/Downloads git clone https://github.com/hzeller/rpi-rgb-led-matrix.git cd rpi-rgb-led-matrix make ``` 接下来,克隆 PTP 挂钟项目: ``` cd ~/Downloads git clone https://github.com/Gemini2350/ptp-wallclock.git apt-get install -y libpcap-dev ``` 在 PR #8([https://github.com/Gemini2350/ptp-wallclock/pull/8](https://github.com/Gemini2350/ptp-wallclock/pull/8))和 PR #11([https://github.com/Gemini2350/ptp-wallclock/pull/11](https://github.com/Gemini2350/ptp-wallclock/pull/11))合并之前,你需要将这些补丁应用到项目中,才能使其正常工作: ``` curl -sL https://github.com/Gemini2350/ptp-wallclock/pull/8.patch | git apply - curl -sL https://github.com/Gemini2350/ptp-wallclock/pull/11.patch | git apply - ``` 要编译应用程序,将 `ptp-clock.cpp` 文件复制到 `rpi-rgb-led-matrix` 目录中,然后在该目录中运行以下命令: ``` # 编译 PTP 挂钟应用程序。 g++ -O2 -std=c++17 ptp-clock.cpp -o ptp-clock \ -I./include -I./bindings \ -L./lib -lrgbmatrix -lpthread ``` 现在,你可以运行以下命令来启动编译好的 `ptp-clock` 应用程序: ``` $ sudo ./ptp-clock 正在监听 PTP 消息... ``` 如果 LED 矩阵上没有显示时间,这里有一些 PTP 调试步骤: 1. 你能否看到从运行 `ptp-clock` 的树莓派发出的网络 PTP 流量?安装 `tcpdump` 并运行 `sudo tcpdump -i eth0 -nn -v port 319 or port 320`。你应该会看到一些带有时间戳信息的消息。 2. 查看上面 `tcpdump` 命令输出中的 `msg type` 字段。如果你只看到 `sync msg` 消息,而没有 `follow up msg` 消息,那么 PTP 服务器可能配置为单步模式。在你的 PTP 服务器上,检查 ptp4l 配置中的 `twoStepFlag` 是否设置为 `1`。 我在 `ptp-wallclock` 仓库中提交了一个包含我自己调试步骤的 issue,如果你仍然遇到问题,可能会有所帮助:[无法在我的网络中获得 PTP 时间显示](https://github.com/Gemini2350/ptp-wallclock/issues/7)。 但如果一切正常,你应该能看到当前的 PTP 时间: 桌面上运行的 PTP 挂钟 > **注意**:在此 PR([https://github.com/Gemini2350/ptp-wallclock/pull/8](https://github.com/Gemini2350/ptp-wallclock/pull/8))被合并之前,你可能需要在编译前对 `ptp-clock.cpp` 文件应用补丁。如果你遇到错误或没有输出,并且确认 PTP 在你的网络上正常工作,请运行以下命令: > > ``` > cd ~/Downloads/ptp-wallclock > curl -L https://patch-diff.githubusercontent.com/raw/Gemini2350/ptp-wallclock/pull/8.patch | git apply -v > cp ptp-clock.cpp ../rpi-rgb-led-matrix > cd ../rpi-rgb-led-matrix > g++ -O2 -std=c++17 ptp-clock.cpp -o ptp-clock \ > -I./include -I./bindings \ > -L./lib -lrgbmatrix -lpthread > ``` ## 3D 打印支架 / 底座 没有任何支撑的话,它看起来有点乱,而且显示器的两个半部分如果没有固定到某个东西上,不容易保持在一起。每个显示器有四个磁性螺丝,所以如果你将它们固定在一个平坦的金属表面上,就可以让它们对齐。 PTP 挂钟 3D 打印支架,用于固定显示器 我设计了这款 3D 打印支架,它将两个显示器固定在一起,并留有一点余地以适应制造公差。我把它上传到了 Printables,如果你想复刻我的制作:[PTP 挂钟支架(Waveshare RGB 矩阵连接器)](https://www.printables.com/model/1624778-ptp-wall-clock-bracket-waveshare-rgb-matrix-connec)。 将来,我可能还会以某种方式将树莓派整合进来,比如放在桌面底座里。但我的安装支架使磁性螺丝高度与其他螺丝一致,所以你可以将它安装到冰箱或其他铁质表面,树莓派则悬在下方。或者,如果数据线和电源线需要在金属上开孔,也可以藏在后面。 ## 结论 您的浏览器不支持视频标签。 既然我有了这个漂亮的 PTP 时间显示器,我需要弄清楚为什么我的 GPS 衍生时间每隔几天就会与 UTC 偏差正负几秒。我认为我正在使用的 Intel i226 网卡处理 PPS 时间输入的方式有问题,我会在此 issue 中继续研究:[https://github.com/geerlingguy/time-pi/issues/28](https://github.com/geerlingguy/time-pi/issues/28)。我可能也会切换到另一个树莓派时间服务器,因为 i226 驱动总体上让我很沮丧。 我要衷心感谢 Oliver Ettlin 分享他的工作,以及他在 39C3 上关于 PTP 的精彩演讲!如果你对 PTP 或网络时间有任何兴趣,请务必观看。如果你想自己制作一个 PTP 挂钟,希望这篇博文对你有帮助 :)

相似文章

层级1 PTP主时钟:CM4 + SR1723U10(第一部分)

Lobsters Hottest

本文详细介绍了一个DIY构建的层级1 PTP主时钟,使用Raspberry Pi CM4和GPS模块,用于工业基础设施中的纳秒级精确时间同步,并将其与昂贵的商业解决方案进行比较。

如何制作圆形LCD时钟

Lobsters Hottest

一份详细的教程,介绍如何使用Waveshare的7英寸圆形LCD屏幕和树莓派制作定制挂钟,涵盖硬件组件、组装和软件配置。

一款更精美的电压表时钟

Hacker News Top

一份详细指南,介绍如何制作具有自定义贴花、CNC加工外壳和连续运动指针的模拟电压表时钟。

WiFi 时间

Hacker News Top

一篇关于一个已废弃项目的详细记录,该项目旨在构建一个“假的”GPS模块,通过WiFi使用NTP和ESP8266获取时间,目标达到亚毫秒精度,但最终因硬件限制未能实现。