Container image for the BKG NTRIP Client (BNC) built from official source. BNC is a software package for receiving, processing, and broadcasting GNSS data streams via NTRIP (Networked Transport of RTCM via Internet Protocol).
- NTRIP Client: Receive GNSS correction data from NTRIP casters
- NTRIP Server: Re-broadcast NTRIP streams to other clients
- RINEX v3 Output: Generate RINEX 3 observation files with configurable intervals
- Skeleton File Support: Use template files for proper RINEX header structure
- Headless Operation: Runs without GUI, suitable for containerized deployments
Receive NTRIP streams and generate RINEX files:
docker run -d --rm \
-v $(pwd)/bnc-client.conf:/srv/bnc/conf/bnc.conf \
-v $(pwd)/rnx:/srv/bnc/rnx \
-v $(pwd)/logs:/srv/bnc/logs \
bnc:latestReceive streams from a caster and re-broadcast them:
docker run -d --rm -p 2101:2101 \
-v $(pwd)/bnc-server.conf:/srv/bnc/conf/bnc.conf \
-v $(pwd)/rnx:/srv/bnc/rnx \
-v $(pwd)/logs:/srv/bnc/logs \
bnc:latestbnc-client.conf: Client-only configuration (receives streams, generates RINEX)bnc-server.conf: Server configuration (receives and re-broadcasts streams)
# Enable NTRIP client
ntripClient=1
ntripVersion=2
# NTRIP caster URL
casterUrlList=http://user:pass@caster.example.com:2101
# Mountpoints (format: //user:pass@host:port/mountpoint format country lat lon no 2)
mountPoints=//user:pass@caster.example.com:2101/MOUNTPOINT RTCM_3 NZL -41.20 174.93 no 2# Enable NTRIP server (for re-broadcasting)
ntripServer=1
ntripServerPort=2101# RINEX v3 output
rnxV3=2
rnxV3filenames=2
# Output directory
rnxPath=/srv/bnc/rnx
# Interval (15 minutes)
rnxIntr=15 min
# Sampling rate (1 second)
rnxSampl=1
# Use skeleton file as template (0 = optional, 1 = required)
rnxOnlyWithSKL=0
# Skeleton file
rnxSkel=SKLSkeleton files (.SKL) are RINEX header templates that define the observation types and station metadata. Place skeleton files directly in the RINEX output directory.
Example: For mountpoint AVLN00NZL0, create rnx/AVLN00NZL.SKL (or /srv/bnc/rnx/AVLN00NZL.SKL inside the container)
The skeleton file should contain a valid RINEX 3 header with:
- Marker name
- Receiver and antenna information
- Observation types for each GNSS system (GPS, GLONASS, Galileo, BeiDou, etc.)
- Approximate position
| Volume | Description | Required |
|---|---|---|
/srv/bnc/conf |
Configuration files | Yes |
/srv/bnc/logs |
Log files | Recommended |
/srv/bnc/rnx |
RINEX output files and skeleton files (.SKL) |
Recommended |
# Create directories (skeleton files go directly in rnx/)
mkdir -p logs rnx
# Run container
docker run -d --rm \
--name bnc-client \
-v $(pwd)/bnc-client.conf:/srv/bnc/conf/bnc.conf \
-v $(pwd)/rnx:/srv/bnc/rnx \
-v $(pwd)/logs:/srv/bnc/logs \
bnc:latest
# Check logs
docker logs bnc-client
cat logs/bnclog_*
# Check RINEX files (after first interval)
ls -lh rnx/# Run server (exposes port 2101)
docker run -d --rm \
--name bnc-server \
-p 2101:2101 \
-v $(pwd)/bnc-server.conf:/srv/bnc/conf/bnc.conf \
-v $(pwd)/rnx:/srv/bnc/rnx \
-v $(pwd)/logs:/srv/bnc/logs \
bnc:latest
# Connect to server from another client
# Use: your-host:2101 as the caster URL- Check logs:
docker logs <container-name>orcat logs/bnclog_* - Verify stream connection: Look for "1 stream(s)" in logs
- Check permissions: Ensure
rnxdirectory is writable - Wait for interval: RINEX files are created at the configured interval (default: 15 minutes)
The container automatically fixes permissions for mounted volumes. If you see permission errors:
# Fix permissions on host (if needed)
sudo chown -R 1000:1000 logs rnx- Ensure skeleton file name matches mountpoint name
- Check skeleton file is in the
rnx/directory (or/srv/bnc/rnx/inside container) - Verify
rnxSkelpath in configuration (use.for same directory as RINEX files, or absolute path like/srv/bnc/rnx)
Check your mountPoints configuration format:
mountPoints=//user:pass@host:port/MOUNTPOINT format country lat lon no 2
All fields are required. Example:
mountPoints=//user:pass@caster.com:2101/STATION RTCM_3 NZL -41.20 174.93 no 2
docker build -t bnc:latest .