1 Punkte von GN⁺ 2 시간 전 | 1 Kommentare | Auf WhatsApp teilen
  • Nach dem Ende von Mozillas GPS location service ist die standortbasierte Ermittlung über GeoClue unter Linux ungenauer geworden; where-am-i verortete 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-nmea in /etc/geoclue/geoclue.conf standardmäßig aktiviert, und es holte GPS-Informationen, indem es nach dem mDNS-Dienst _nmea-0183._tcp suchte
  • 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+RMC und 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-i per 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 GPRMC und GPGGA
    $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.conf standardmäß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._tcp und 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.service lässt sich die Dienstsuche auf einem anderen Rechner mit avahi-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.local läuft, lässt sich auch der TCP-Server selbst einfach mit telnet node05.local 10110 testen
  • 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 angezeigt
    Client 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

 
GN⁺ 2 시간 전
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

    • Kannst du teilen, woran du arbeitest? Mein kleines Projekt löst nur ein bestimmtes Problem, aber ich habe mich gefragt, ob es dafür breitere Einsatzmöglichkeiten gibt
  • 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

    • Warum ist das so, dass du „seine Arbeiten meide ich normalerweise, wenn möglich“ sagst?
    • Ich glaube, Android hat so eine Funktion. Das ist die Entwicklerfunktion Mock Locations
      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

    $ qmicli -d qrtr://0 --loc-get-nmea-types  
    Successfully retrieved NMEA types: gga, gsv, gsa  
    $ mmcli -m any --location-status  
      Location | capabilities: 3gpp-lac-ci, gps-raw, gps-nmea, agps-msa, agps-msb