There are a lot of interesting things hiding in plain sight on a P25 control channel.
Most people think of control channels as the place where trunking assignments, affiliations, and system housekeeping live. That’s true, but they also carry something surprisingly useful for experimenters and infrastructure nerds: time.
P25Time is a single-binary tool built from DSD-Neo that listens to a P25 Phase 1 control channel, decodes the Synchronization Broadcast messages, reconstructs UTC from the over-the-air timing data, and serves it out as an NTP source on your network.
In other words, it turns a live radio system into a usable clock.
What P25Time Does
At a high level, P25Time:
- Tunes a P25 Phase 1 control channel from an SDR source
- Decodes synchronization broadcast packets
- Extracts the UTC date/time and local time offset information
- Tracks the latest valid timing snapshot
- Serves that time through an embedded NTP responder
Once synchronized, it behaves like a local stratum-1 style source for lab use and experimentation.
That’s a fun sentence to write: your NTP server is now disciplined by a trunked radio control channel.
Why This Is Interesting
GPS gets all the attention when people talk about accurate time, and for good reason. But GPS is not always convenient:
- Indoor receive conditions can be poor
- Antenna placement can be annoying
- Some sites are air-gapped or RF-hostile
- Redundancy is always useful
P25 systems often carry stable time information as part of their own network synchronization model. If you’re already monitoring a control channel with solid reception, that timing data can be repurposed into something useful.
That makes P25Time interesting for:
- SDR labs
- radio monitoring stations
- packet capture correlation
- multi-receiver logging setups
- indoor timing references
- backup/secondary time distribution
It’s not a substitute for a PPS-disciplined lab standard, but it is a remarkably practical way to get very good network time from infrastructure that may already be on the air around you.
Running It
The binary is intentionally simple:
sudo ./P25Time -i rtl:0:771.18125M
By default, it binds its embedded NTP server to UDP/123, which is exactly what you want if you intend to point Linux time clients at it directly.
Once it has valid radio time, you can query it from another machine or from the same host with your preferred NTP tooling.
You can even sanity-check that it’s answering with a raw UDP query using nc:
(printf '\x23'; dd if=/dev/zero bs=1 count=47 2>/dev/null) | nc -u -w1 127.0.0.1 123 | wc -c
A correct NTP reply comes back as 48 bytes.
Real Uses for a Radio-Derived Time Source
This is where P25Time gets genuinely useful.
A control-channel-derived clock can help with:
- Network Time for Monitoring Systems
If you have one or more SDR hosts collecting recordings, event logs, or metadata, a shared local time source makes it much easier to align activity across machines.
- Multi-Site Correlation
Running several receivers at once is common in modern radio monitoring. If all of them are pointed at the same local NTP source, log correlation gets much cleaner.
- Indoor or GPS-Difficult Environments
If GPS reception is unreliable indoors, but a strong P25 control channel is available, P25Time can serve as a practical alternative timing reference.
- Backup Time Source
Even in systems that already use GPS or public NTP, redundancy matters. P25Time can make a good secondary or holdover-adjacent source for lab and hobby environments.
- Radio Network Analysis
Because the clock comes from the radio system itself, it also becomes a tool for observing the system’s timing quality. Comparing radio-derived UTC against GPS or another trusted source can reveal drift, offsets, or anomalies.
P25Time can be downloaded from: https://github.com/SarahRoseLives/P25Time