For whoever runs the base: how the Leica GS10, the Raspberry Pi guta.local and the caster at ntrip.pavlokostiuk.cloud fit together. Flying a drone? Use the pilot guide instead.
| Piece | State | Notes |
|---|---|---|
| GS10 web UI over Bluetooth | working | Through the Pi bridge, opened on the Mac at http://localhost:8253 |
NTRIP caster /GS10 | live | NTRIP v1 and v2 (Aircast QGC, Mission Planner, RTKLIB). Connection from Aircast QGC verified on 2026-10-10 |
| Live dashboard | live | Caster, correction stream and GS10 status (battery, satellites, fix). The GS10 part needs gs10status.py running on the Pi |
| Pi → caster relay | ready | Connects to both the GS10 and the caster; nothing to send yet |
| RTCM 3 output on the GS10 | blocked | Both RTK base outputs use Leica’s own format. Changing it needs a Leica controller (step 4) |
| Drone GPS | check | Must be RTK-capable (u-blox F9P, Unicore UM980/UM982 or similar). Pilots connect with the pilot guide |
GS1532392, address 00:13:43:02:E9:EF, PIN 0000, Class 2 (about 10 m range)192.168.253.2, reachable only over a Bluetooth network link (PAN)macOS 27 can’t join a Bluetooth network link, so the Pi does it. A small bridge script on the Pi talks to the GS10 over Bluetooth and serves its web UI on the Pi. An SSH tunnel brings it to the Mac. The script needs no sudo and no pairing.
ssh pi@guta.local 'curl -fsSO https://rtk.pavlokostiuk.cloud/gs10pan.py && nohup python3 gs10pan.py > gs10pan.log 2>&1 < /dev/null &' ssh pi@guta.local 'cat gs10pan.log'
ready: 127.0.0.1:8253 -> 192.168.253.2:80.ssh -fN -L 8253:127.0.0.1:8253 pi@guta.local
http://192.168.253.2 won’t load from the Mac.To stop the bridge and the tunnel:
ssh pi@guta.local 'pkill -f "^python3 gs10pan.py"' pkill -f 'ssh -fN -L 8253'
Browsing only. The bridge is a minimal network link built for viewing pages and changing settings. Don’t upload firmware through it.
Base or rover mode, antenna type and height, base position, satellite systems and cut-off angle, raw data logging to the SD card, licence keys and firmware. It has no setting for the RTK output format or port.
Needs a Leica CS10 or CS15 controller running SmartWorx Viva. Borrow one, buy a used one, or ask a Leica dealer. The GS10 keeps the settings afterwards, so it’s needed only once.
Check on the web UI: Current Status → RTK base should show RTCM instead of Leica.
Once the GS10 sends RTCM 3 on its Bluetooth port, gs10ntrip.py on the Pi forwards it to the caster. It reconnects on its own if either side drops. The source password is in Vaultwarden under NTRIP caster — ntrip.pavlokostiuk.cloud.
ssh pi@guta.local 'curl -fsSO https://rtk.pavlokostiuk.cloud/gs10ntrip.py && NTRIP_SOURCE_PASS=<source password> nohup python3 gs10ntrip.py > gs10ntrip.log 2>&1 < /dev/null &' ssh pi@guta.local 'tail -f gs10ntrip.log'
Data is flowing when the log shows … bytes sent. Stop it with ssh pi@guta.local 'pkill -f "^python3 gs10ntrip.py"'.
Both scripts run until the Pi reboots. To keep the relay running across reboots, install it as a systemd service (needs sudo once). Do it through the Pi’s deploy scripts rather than by hand.
[Unit] Description=GS10 RTCM to NTRIP caster After=bluetooth.service network-online.target [Service] User=pi Environment=NTRIP_SOURCE_PASS=<source password> ExecStart=/usr/bin/python3 /home/pi/gs10ntrip.py Restart=always [Install] WantedBy=multi-user.target
gs10status.py reads the GS10’s status pages through the bridge every 20 s and sends them to the dashboard. It needs the bridge from step 3 running, and the dashboard token, which is in the same Vaultwarden item.
ssh pi@guta.local 'curl -fsSO https://rtk.pavlokostiuk.cloud/gs10status.py && DASH_TOKEN=<dashboard token> nohup python3 gs10status.py > gs10status.log 2>&1 < /dev/null &'
The bridge reconnects to the GS10 by itself, for example after the receiver restarts or goes out of range.
ntrip.pavlokostiuk.cloud:2101, NTRIP v1 and v2/GS10, clients log in with HTTP Basic auth. The base logs in with the source password (NTRIP v1 SOURCE)ntrip → compose caster, service web. One Python process (/home/admin/ntrip/dash.py) runs the caster on 2101 and the manual, dashboard and API on this siteNTRIP_SOURCE_PASS, NTRIP_USERS (user:pass,user2:pass2), DASH_TOKEN. The sourcetable line is NTRIP_STR in the compose file. Change them, then redeployntrip → caster → Environment, add the pilot to NTRIP_USERS, comma-separated: drone:pass1,anna:pass2. One login per pilot lets you revoke one without breaking the others.Check the sourcetable from anywhere:
printf 'GET / HTTP/1.0\r\nUser-Agent: NTRIP test\r\n\r\n' | nc -w 5 ntrip.pavlokostiuk.cloud 2101
| Option | Cost | How |
|---|---|---|
| GEOCORS, Georgia’s national correction service | registration | Sign up at geocors.napr.gov.ge, then put their caster details into RTK/GPS Inject. No base or Pi needed |
| Own base, F9P or UM980 | $150–250 | Plug it into the Pi and stream with str2str -in serial://ttyACM0:115200 -out ntrips://:<source password>@ntrip.pavlokostiuk.cloud:2101/GS10 (from the Debian rtklib package) |
| Public casters | free | Not usable here. The nearest base on rtk2go, Centipede or CRTK is 688 km away; RTK needs one within about 30 km |
| Symptom | Fix |
|---|---|
Pi can’t see the GS10; bluetoothctl show says off-blocked | The radio is blocked: echo 0 | sudo tee /sys/class/rfkill/rfkill0/soft |
Bridge log says BNEP channel closed | The GS10 turned off or went out of range. Start the bridge again |
Browser times out on 192.168.253.2 | Use http://localhost:8253 with the tunnel open |
Tunnel says Address already in use | It’s already running: pgrep -fl 'ssh -fN -L 8253' |
Relay log says ERROR - Bad Password | Wrong source password. Check Vaultwarden |
Mission Planner gets 401 Unauthorized, or QGC says Authentication failed (401) | Wrong client user or password |
| QGC or Mission Planner connects, then drops with “not found” | No base is pushing to /GS10. The dashboard shows “No base connected” |
| Relay connected but no bytes sent | The GS10 isn’t sending RTCM on Bluetooth yet (step 4), or it has no satellite fix |
| Stuck at RTK Float | Check sky view at both ends, the baseline distance, GPS + GLONASS on the rover, and the base coordinates |
| Mac doesn’t list the GS10 in Bluetooth settings | Normal: it announces itself as a computer. blueutil --inquiry 20 finds it |