GPS im lokalen Netzwerk broadcasten
(evertpot.com)- Nach dem Ende von Mozillas GPS location service ist die standortbasierte Ermittlung über GeoClue unter Linux ungenauer geworden;
where-am-iverortete per GeoIP einen Standort nahe Toronto mit einer Genauigkeit von 25 km - Da sich ein fest installierter Home-Server nicht bewegt, wurde er so eingerichtet, dass er im Heimnetz lokal die gewünschten GPS-Koordinaten ausgibt
- In GeoClue war
network-nmeain/etc/geoclue/geoclue.confstandardmäßig aktiviert, und es holte GPS-Informationen, indem es nach dem mDNS-Dienst_nmea-0183._tcpsuchte - nmea-static-gps-server sendet einmal pro Sekunde NMEA 0183-GPS-Nachrichten über TCP und registriert mit Avahi den Dienst
_nmea-0183._tcp - Nach einem Neustart von GeoClue übernahm der Client sofort die Server-Koordinaten; als Ergebnis wurden die Beschreibung
GPS GGA+RMCund eine Genauigkeit von 0 Metern zurückgegeben, und Gnome Maps zeigte sofort den korrekten Standort an
GeoClue- und NMEA-Konfiguration
- Seit dem Ende von Mozillas GPS location service ist die Standortgenauigkeit unter Linux gesunken, und GeoClue, das auf mehreren Linux-Systemen von Firefox und Gnome Maps verwendet wird, verortete laut
where-am-iper GeoIP einen Punkt nahe Toronto mit einer Genauigkeit von 25 km - Die
where-am-i-Demo lässt sich je nach Distribution über das Paketmanagement installieren# Fedora sudo dnf install geoclue2-demos # Debian family sudo apt install geoclue-2-demo - Da sich ein fest installierter Home-Server nicht bewegt, wurde er so eingerichtet, dass er im Heimnetz lokal die gewünschten GPS-Koordinaten ausgibt
- Verwendet wurde das Protokoll NMEA 0183, eine Sammlung von Spezifikationen für Schiffselektronik, bei der sich Nachrichten über eine serielle Schnittstelle oder einen TCP-Socket senden lassen
- Beispielhafte GPS-Nachrichten bestehen aus den Zeilen
GPRMCundGPGGA$GPRMC,204049.000,A,5308.3999,N,00601.9266,E,0.000,0.000,030526,,*02 $GPGGA,204049.000,5308.3999,N,00601.9266,E,1,08,1.0,119.0,M,0.0,M,,*6F - In GeoClue war network-nmea in
/etc/geoclue/geoclue.confstandardmäßig aktiviert# Network NMEA source configuration options [network-nmea] # Fetch location from NMEA sources on local network? enable=true - GeoClue sucht nach dem mDNS-Dienst
_nmea-0183._tcpund verbindet sich bei einem gefundenen Eintrag mit der betreffenden Adresse, um GPS-Informationen abzurufen
Server-Implementierung und Funktionsprüfung
- nmea-static-gps-server ist ein TCP-Server, der einmal pro Sekunde GPS-Informationen ausgibt, und registriert mit Avahi den Dienst
_nmea-0183._tcp - Avahi ist die Standardimplementierung von mDNS unter Linux; auf dem Mac übernimmt Bonjour dieselbe Rolle, und mDNS wird auch für
.local-Adressen im lokalen Netzwerk oder zum Erkennen von Geräten wie Druckern und Fernsehern verwendet - Das Repository enthält folgende Avahi-Dienstkonfiguration
<?xml version="1.0" standalone='no'?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name replace-wildcards="yes">NMEA GPS (%h)</name> <service> <type>_nmea-0183._tcp</type> <port>10110</port> </service> </service-group> - Nach dem Kopieren dieser Datei nach
/etc/avahi/services/nmea-statis-gpc.servicelässt sich die Dienstsuche auf einem anderen Rechner mitavahi-browseüberprüfen$ avahi-browse _nmea-0183._tcp -r -t + wlp192s0 IPv6 NMEA GPS (node05) _nmea-0183._tcp local + wlp192s0 IPv4 NMEA GPS (node05) _nmea-0183._tcp local = wlp192s0 IPv6 NMEA GPS (node05) _nmea-0183._tcp local hostname = [node05.local] address = [fe80::a8c2:15de:9af:19b] port = [10110] txt = [] = wlp192s0 IPv4 NMEA GPS (node05) _nmea-0183._tcp local hostname = [node05.local] address = [192.168.2.205] port = [10110] txt = [] - Wenn der Dienst auf
node05.localläuft, lässt sich auch der TCP-Server selbst einfach mittelnet node05.local 10110testen - Nach dem Neustart von GeoClue auf dem Client wurden die Koordinaten des Servers sofort übernommen
$ sudo systemctl restart geoclue $ /usr/libexec/geoclue-2.0/demos/where-am-i - Das Ergebnis lieferte die exakten Koordinaten des Servers sowie die Beschreibung
GPS GGA+RMC; die Genauigkeit wurde mit 0 Metern angezeigtClient object: /org/freedesktop/GeoClue2/Client/3 New location: Latitude: 43.645758° Longitude: -79.410510° Accuracy: 0 meters Altitude: 119.000000 meters Speed: 0.000000 meters/second Description: GPS GGA+RMC Timestamp: Sun 03 May 2026 04:58:58 PM (1777841938 seconds since the Epoch) - Gnome Maps zeigte sofort den korrekten Standort an, während Firefox einen Neustart benötigte
- In Apple Maps auf dem Mac schien es ebenfalls zu funktionieren, wenn die Ortungsdienste deaktiviert waren, allerdings erschien auf der Karte kein exakter Punkt, sondern nur ungefähr die richtige Region
- Diese Methode sorgt dafür, dass Linux-Rechner zu Hause nicht auf langsame und ungenaue GPS-Abfragen warten müssen, um sofort den korrekten Standort zu erhalten; sie lässt sich auch dafür nutzen, Linux-Gästen oder Kollegen einen falschen Standort vorzutäuschen
- https://github.com/evert/nmea-static-gps-server
1 Kommentare
Lobste.rs-Kommentare
Ich hatte überhaupt keine Ahnung, dass es einen standardisierten mDNS-Dienst gibt, mit dem man GNSS im LAN bekanntmachen kann, aber das hat sofort ein Problem gelöst, über das ich seit etwa 6 Monaten immer mal wieder nachgedacht habe
GPS-Standort-Spoofing ist eine gute Idee, aber für eine tatsächliche Umsetzung scheint es doch relativ viel Arbeit zu sein
Es wäre schön, wenn es in den Android-Einstellungen oder als Firefox-Erweiterung einfach eine Option wie „echten Standort verwenden / benutzerdefinierten Standort verwenden“ gäbe
Ich frage mich allerdings auch, wie stark GPS-Standorten Gewicht gegeben wird, wenn sie mit anderen Faktoren wie IP oder Locale kollidieren
Außerdem habe ich mich unten auf der Seite kurz erschrocken, als ich das Foto von Jeff Geerling gesehen habe, und erst später gemerkt, dass er nicht der Autor ist, sondern den Beitrag nur gelikt hat
Seine Arbeiten meide ich normalerweise, wenn möglich
Ich habe früher einen Trimble-GNSS-Empfänger verwendet; ich weiß nicht mehr, ob es über USB OTG oder BLE lief, aber die Trimble-App diente als Mock-Locations-Quelle, sodass beliebige Android-Apps statt der relativ ungenauen Koordinaten des Telefons selbst die hochpräzisen Koordinaten vom Vermessungsstab bekommen konnten, ungefähr auf 2 cm genau
Interessant, aber man könnte das auch selbst implementieren und ein Skript bauen, das dies auf einem Android-Gerät ausgibt, wenn man sich im Heimnetz befindet
Ich bin mir nur noch nicht ganz sicher, ob ich das tatsächlich brauche :p
Für mich war neu, dass NMEA 0183 ein Bündel von Spezifikationen für Marineelektronik ist
Ich war nie neugierig genug, um nachzuschlagen, wofür NMEA steht, aber ich kannte den Namen selbst schon über ModemManager und Qualcomm-Modems