1 poin oleh GN⁺ 2 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • Setelah layanan lokasi GPS Mozilla dihentikan, penentuan lokasi berbasis GeoClue di Linux menjadi tidak akurat, dan where-am-i menangkap lokasi dekat Toronto dengan akurasi 25 km menggunakan GeoIP
  • Dengan memanfaatkan fakta bahwa server rumah yang tetap tidak berpindah tempat, sistem dikonfigurasi agar menyiarkan koordinat GPS yang diinginkan secara lokal di dalam jaringan rumah
  • GeoClue memiliki network-nmea yang aktif secara bawaan di /etc/geoclue/geoclue.conf, lalu mencari layanan mDNS _nmea-0183._tcp untuk menerima informasi GPS
  • nmea-static-gps-server menyiarkan pesan GPS NMEA 0183 sekali per detik melalui TCP, dan mendaftarkan layanan _nmea-0183._tcp dengan Avahi
  • Setelah GeoClue di-restart, klien langsung mendapatkan koordinat server, dan hasilnya mengembalikan deskripsi GPS GGA+RMC serta akurasi 0 meters, sementara Gnome Maps segera menampilkan lokasi yang benar

Konfigurasi GeoClue dan NMEA

  • Setelah layanan lokasi GPS Mozilla dihentikan, akurasi lokasi di Linux menurun, dan GeoClue yang digunakan Firefox dan Gnome Maps di beberapa sistem Linux menangkap lokasi dekat Toronto dengan akurasi 25 km berdasarkan GeoIP menurut where-am-i
  • Demo where-am-i dapat diinstal melalui paket yang tersedia di masing-masing distribusi
    # Fedora  
      sudo dnf install geoclue2-demos  
    
    # Debian family  
      sudo apt install geoclue-2-demo  
    
  • Dengan memanfaatkan fakta bahwa server rumah yang tetap tidak berpindah tempat, sistem dikonfigurasi agar menyiarkan koordinat GPS yang diinginkan secara lokal di dalam jaringan rumah
  • Protokol yang digunakan adalah NMEA 0183, yaitu kumpulan spesifikasi untuk peralatan elektronik kapal yang dapat mengirim pesan melalui port serial atau socket TCP
  • Contoh pesan GPS terdiri dari baris GPRMC dan 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  
    
  • Di /etc/geoclue/geoclue.conf, network-nmea aktif secara bawaan
    # Network NMEA source configuration options  
      [network-nmea]  
    # Fetch location from NMEA sources on local network?  
      enable=true  
    
  • GeoClue mencari layanan mDNS bernama _nmea-0183._tcp, dan ketika menemukan record tersebut, ia terhubung ke alamat itu untuk menerima informasi GPS

Implementasi server dan verifikasi operasi

  • nmea-static-gps-server adalah server TCP yang menyiarkan informasi GPS sekali per detik, dan mendaftarkan layanan _nmea-0183._tcp melalui Avahi
  • Avahi adalah implementasi mDNS standar di Linux, sementara di Mac peran yang sama dijalankan oleh Bonjour, dan mDNS juga digunakan untuk alamat .local di jaringan lokal atau penemuan perangkat seperti printer dan TV
  • Repositori tersebut menyertakan konfigurasi layanan Avahi berikut
    <?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>  
    
  • Setelah menyalin file ini ke /etc/avahi/services/nmea-statis-gpc.service, pencarian layanan dapat dikonfirmasi dari mesin lain dengan avahi-browse
    $ 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 = []  
    
  • Saat layanan berjalan di node05.local, server TCP itu sendiri juga bisa diuji dengan mudah menggunakan telnet node05.local 10110
  • Setelah GeoClue di-restart pada klien, koordinat server langsung terdeteksi
    $ sudo systemctl restart geoclue  
    $ /usr/libexec/geoclue-2.0/demos/where-am-i  
    
  • Hasilnya mengembalikan koordinat tepat milik server dan deskripsi GPS GGA+RMC, dengan akurasi 0 meters
    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 langsung menampilkan lokasi yang benar, sementara Firefox perlu di-restart
  • Di Apple Maps pada Mac, ini juga tampak berfungsi saat Location Services dimatikan, tetapi titik yang benar-benar presisi tidak muncul di peta dan hanya wilayah kasarnya yang sesuai
  • Cara ini membuat mesin Linux di rumah langsung mendapatkan lokasi yang benar tanpa harus menunggu pencarian GPS yang lambat dan tidak akurat, dan juga bisa digunakan untuk memalsukan lokasi yang salah bagi tamu atau rekan kerja pengguna Linux
  • https://github.com/evert/nmea-static-gps-server

1 komentar

 
GN⁺ 2 jam lalu
Komentar Lobste.rs
  • Saya sama sekali tidak tahu bahwa ada layanan mDNS standar yang bisa mengiklankan GNSS di LAN, dan ini langsung menyelesaikan masalah yang sempat saya pikirkan secara berkala selama sekitar 6 bulan

    • Bisa berbagi sedang membuat apa? Proyek kecil saya memang menyelesaikan satu masalah tertentu, tapi saya penasaran apakah ada kegunaan yang lebih luas
  • Pemalsuan lokasi GPS adalah ide yang bagus, tetapi untuk benar-benar menerapkannya tampak membutuhkan cukup banyak pekerjaan
    Akan bagus kalau di pengaturan Android atau ekstensi Firefox ada opsi sederhana seperti “gunakan lokasi nyata / gunakan lokasi kustom”
    Namun, saya juga penasaran seberapa besar bobot yang diberikan pada lokasi GPS ketika bertentangan dengan faktor lain seperti IP atau locale
    Tambahan lagi, saya sempat kaget melihat foto Jeff Geerling di bagian bawah halaman, lalu belakangan sadar bahwa dia bukan penulisnya, hanya menekan suka
    Kalau bisa, saya biasanya menghindari hasil kerjanya

    • Kenapa begitu soal “saya biasanya menghindari hasil kerjanya kalau bisa”?
    • Sepertinya Android punya fitur seperti itu. Itu adalah Mock Locations, fitur khusus pengembang
      Saya pernah memakai penerima GNSS Trimble; saya tidak ingat apakah lewat USB OTG atau BLE, tetapi aplikasi Trimble menjadi sumber Mock Locations sehingga aplikasi Android apa pun bisa menerima koordinat berpresisi tinggi dari tongkat survei, sekitar 2 cm, alih-alih presisi yang relatif rendah dari ponsel itu sendiri
  • Menarik, tetapi saya juga bisa saja mengimplementasikannya sendiri dan membuat skrip yang menyiarkan ini dari perangkat Android saat berada di jaringan rumah
    Saya masih belum sepenuhnya yakin apakah saya benar-benar membutuhkannya :p

  • Baru tahu bahwa NMEA 0183 adalah kumpulan spesifikasi untuk perangkat elektronik kelautan
    Saya tidak pernah cukup penasaran untuk mencari tahu kepanjangan NMEA, tetapi saya tahu namanya lewat ModemManager dan modem Qualcomm

    $ 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