Skip to main content

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)

Source distribution for ntrip-rtcm3-to-rtcm2p3 0.1.0.post39
File Size Uploaded
ntrip_rtcm3_to_rtcm2p3-0.1.0.post39.tar.gz 24.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ntrip-rtcm3-to-rtcm2p3 0.1.0.post39
File Interpreter ABI Platform
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 log

Release 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
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page