ntrip-rtcm3-to-rtcm2p3
An NTRIP receiver + LAN rebroadcaster that also converts an RTCM 3.x reference stream into RTCM 2.3 DGPS corrections, so that legacy single-band receivers that only understand RTCM 2.3 (e.g. the u-blox 7) can benefit from a modern RTCM3-only correction network.
Built incrementally with a full test suite; every conversion stage is cross-checked against independent implementations (see the Validation docs).
📖 Documentation (Read the Docs)
Why
Modern correction networks (e.g. Geoscience Australia's
AUSCORS) broadcast RTCM 3.x only. A u-blox 7 / NEO-7
accepts RTCM 2.3 DGPS corrections but has no RTCM3 decoder. No off-the-shelf
tool converts RTCM3 → RTCM 2.3 (RTKLIB's
str2str can only emit RTCM3; the
BKG NTRIP Client (BNC) only decodes RTCM2).
RTCM 2.3 Type 1 messages are
derived pseudorange corrections, not a reformat — they must be computed from the
base station's observations, its known position, and satellite positions from
broadcast ephemeris.
Pipeline
obs + base position broadcast ephemeris
(RTCM3 MSM7 1077, 1006) (RTCM3 1019, separate mount)
│ │
▼ ▼
decode pseudoranges ───────────────► satellite position + clock
│ │
└───────────────┬───────────────────────┘
▼
per-SV PRC / RRC (DGPS reference-station math)
▼
encode RTCM 2.3 Type 1 / 3 (parity, IOD, scaling)
▼
serve as a local NTRIP mount alongside the raw RTCM3
Install
The packages are published as a signed apt repository per Debian suite:
trixie, forky and sid. They are Architecture: all, so the one build serves
every architecture. Put your suite's name in place of trixie below.
sudo install -d -m0755 /etc/apt/keyrings
curl -fsSL https://mith.ro/ntrip-rtcm3-to-rtcm2p3/ntrip-rtcm3-to-rtcm2p3.gpg | sudo tee /etc/apt/keyrings/ntrip-rtcm3-to-rtcm2p3.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/ntrip-rtcm3-to-rtcm2p3.gpg] https://mith.ro/ntrip-rtcm3-to-rtcm2p3/trixie/ ./" \
| sudo tee /etc/apt/sources.list.d/ntrip-rtcm3-to-rtcm2p3.list
sudo apt update
sudo apt install ntrip-rtcm3-to-rtcm2p3
The repository is signed with the key
36E5 D845 2935 9CFE 8874 F1F1 44EA 5E20 5EE9 F42E
(gpg --show-keys /etc/apt/keyrings/ntrip-rtcm3-to-rtcm2p3.gpg shows it).
It also carries the dependencies a suite's Debian archive doesn't have, so apt
finds every one: python3-pyrtcm in every suite, and python3-pynmeagps in
trixie (forky and sid have Debian's own).
ntrip-rtcm3-to-rtcm2p3 is the systemd service; python3-ntrip-rtcm3-to-rtcm2p3
alone is the library and the command. Set the upstream caster, credentials and
bind addresses in /etc/ntrip-rtcm3-to-rtcm2p3/env, then
sudo systemctl restart ntrip-rtcm3-to-rtcm2p3. See the
usage documentation.
Development
uv run --extra dev pytest # test suite
uv run --extra dev ruff check . # lint
The Debian packages workflow runs the tests in each suite's container, then
builds the packages with
mithro/apt-repo-action's shared
build-deb action, install-tests them (packaging/install-test.sh) and, from
main, publishes them. The version comes from git describe plus the suite's
~deb<R> (0.1.0.post25~deb13; nothing for sid). There is no committed
debian/changelog: the build writes one with just its own entry, and git
ignores it.
The same workflow builds python3-pyrtcm and python3-pynmeagps from their
PyPI sdists (packaging/build-pypi-deb.sh), but only for a suite whose Debian
archive doesn't have the package: the script asks the suite's own apt, so our
build never shadows Debian's. Their version is
<upstream>-0+welland<M>[~deb<R>], with PyPI's version as <upstream> and
nothing for sid, as above. <M> counts the commits that changed the script,
and the -0 sorts below Debian's own -1, so on an upgrade to a suite that
has the package, Debian's replaces ours. Neither part follows this
repository's own commits, so the two packages are republished at the same
version until the script or the release on PyPI changes.
License
Apache-2.0. See LICENSE.
Metadata
Release files for ntrip-rtcm3-to-rtcm2p3 0.1.0.post39
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ntrip_rtcm3_to_rtcm2p3-0.1.0.post39.tar.gz | 24.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ntrip_rtcm3_to_rtcm2p3-0.1.0.post39-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 53.6 kB
Release files / ntrip_rtcm3_to_rtcm2p3-0.1.0.post39.tar.gz
| Download URL | ntrip_rtcm3_to_rtcm2p3-0.1.0.post39.tar.gz |
|---|---|
| Size | 24.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d4d7d3d98aef03761585da350a3b35532597b6efce07e8ca29b9a718d70e3f6f
|
|
BLAKE2b-256 checksum How to use checksums |
7508c4b7c12fb46cc09a287f1fa54c0f98df933621177b2e019b80a99d14ad47
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.
Transparency logRelease files / ntrip_rtcm3_to_rtcm2p3-0.1.0.post39-py3-none-any.whl
| Download URL | ntrip_rtcm3_to_rtcm2p3-0.1.0.post39-py3-none-any.whl |
|---|---|
| Size | 28.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3eecc14372edccf3e46fbd3af871437aad66dd3792fb47921ab48c1073022043
|
|
BLAKE2b-256 checksum How to use checksums |
1ccc01557e3d6d6ae1c978fc93305dd54a7a83636cf3104642556d4d6ba33e01
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.
Transparency log