1 puan yazan GN⁺ 2 시간 전 | 1 yorum | WhatsApp'ta paylaş
  • Mozilla'nın GPS konum hizmeti kapandıktan sonra Linux'ta GeoClue tabanlı konum belirleme doğruluğu düştü; where-am-i, GeoIP ile Toronto yakınlarını 25 km doğrulukla gösterdi
  • Sabit duran ev sunucusunun hareket etmemesinden yararlanarak, ev ağı içinde istenen GPS koordinatlarını yerel olarak yayınlayacak şekilde yapılandırıldı
  • GeoClue'da /etc/geoclue/geoclue.conf içinde network-nmea varsayılan olarak etkin durumdaydı ve _nmea-0183._tcp mDNS hizmetini bularak GPS bilgisini alıyordu
  • nmea-static-gps-server, saniyede bir kez NMEA 0183 GPS mesajlarını TCP üzerinden yayınlıyor ve Avahi ile _nmea-0183._tcp hizmetini kaydediyor
  • GeoClue yeniden başlatıldıktan sonra istemci sunucunun koordinatlarını hemen aldı; sonuçta GPS GGA+RMC açıklaması ve 0 meters doğruluk döndü, Gnome Maps de doğru konumu anında gösterdi

GeoClue ve NMEA yapılandırması

  • Mozilla'nın GPS konum hizmeti kapandıktan sonra Linux'ta konum doğruluğu düştü ve Firefox ile Gnome Maps'in kullandığı GeoClue, birden fazla Linux sistemde where-am-i ölçümüne göre GeoIP ile Toronto yakınlarını 25 km doğrulukla gösterdi
  • where-am-i demosu, dağıtıma göre paket olarak kurulabiliyor
    # Fedora  
      sudo dnf install geoclue2-demos  
    
    # Debian family  
      sudo apt install geoclue-2-demo  
    
  • Sabit duran ev sunucusunun hareket etmemesinden yararlanarak, ev ağı içinde istenen GPS koordinatlarını yerelden yayınlayacak şekilde yapılandırıldı
  • Kullanılan protokol NMEA 0183; denizcilik elektroniği için bir belirtim kümesi ve mesajlar seri port ya da TCP soketi üzerinden gönderilebiliyor
  • Örnek GPS mesajları GPRMC ve GPGGA satırlarından oluşuyor
    $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  
    
  • GeoClue'da /etc/geoclue/geoclue.conf içinde network-nmea varsayılan olarak etkindi
    # Network NMEA source configuration options  
      [network-nmea]  
    # Fetch location from NMEA sources on local network?  
      enable=true  
    
  • GeoClue, _nmea-0183._tcp adlı mDNS hizmetini arıyor; kaydı bulursa ilgili adrese bağlanıp GPS bilgisini alıyor

Sunucu uygulaması ve çalışmanın doğrulanması

  • nmea-static-gps-server, saniyede bir kez GPS bilgisini yayınlayan bir TCP sunucusu ve Avahi ile _nmea-0183._tcp hizmetini kaydediyor
  • Avahi, Linux'un standart mDNS uygulaması; Mac'te aynı işi Bonjour yapıyor ve mDNS, yerel ağdaki .local adresleri ya da yazıcı ve TV gibi cihazların keşfinde de kullanılıyor
  • Depoda aşağıdaki gibi bir Avahi hizmet yapılandırması yer alıyor
    <?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>  
    
  • Bu dosya /etc/avahi/services/nmea-statis-gpc.service konumuna kopyalandıktan sonra, başka bir makinede avahi-browse ile hizmet keşfi doğrulanabiliyor
    $ 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 = []  
    
  • Hizmet node05.local üzerinde çalışırken telnet node05.local 10110 ile TCP sunucusunun kendisi de kolayca test edilebiliyor
  • İstemci tarafında GeoClue yeniden başlatılınca sunucunun koordinatları hemen alındı
    $ sudo systemctl restart geoclue  
    $ /usr/libexec/geoclue-2.0/demos/where-am-i  
    
  • Sonuç, sunucunun tam koordinatlarını ve GPS GGA+RMC açıklamasını döndürdü; doğruluk da 0 meters olarak gösterildi
    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 doğru konumu anında gösterdi, Firefox içinse yeniden başlatma gerekti
  • Mac'teki Apple Maps'te de Konum Servisleri kapalıyken çalışıyor gibi göründü, ancak haritada tam doğru nokta çıkmadı; yalnızca yaklaşık bölge doğruydu
  • Bu yöntem, evdeyken Linux makinelerinin yavaş ve hatalı GPS sorgularını beklemeden doğru konumu hemen almasını sağlıyor; ayrıca Linux kullanan misafirler veya iş arkadaşları için yanlış konum spoofing'i yapmak amacıyla da kullanılabiliyor
  • https://github.com/evert/nmea-static-gps-server

1 yorum

 
GN⁺ 2 시간 전
Lobste.rs görüşleri
  • LAN üzerinde GNSS duyurmak için standart bir mDNS servisi olduğunu hiç bilmiyordum; yaklaşık 6 aydır aralıklı olarak kafamı kurcalayan bir sorunu bu sayede hemen çözmüş oldum

    • Ne üzerinde çalıştığını paylaşabilir misin? Benim küçük projem tek bir spesifik sorunu çözüyor ama daha geniş kullanım alanları olup olmadığını merak etmiştim
  • GPS konum sahteciliği iyi bir fikir, ama gerçekten hayata geçirmek için görece epey iş var gibi görünüyor
    Android ayarlarında ya da bir Firefox eklentisinde “gerçek konumu kullan / özel konum kullan” gibi basit bir seçenek olsa güzel olurdu
    Yalnız IP ya da yerel ayar gibi başka unsurlarla çakıştığında GPS konumuna ne kadar ağırlık verildiğini de merak ediyorum
    Ayrıca sayfanın en altındaki Jeff Geerling fotoğrafını görünce kısa süreliğine şaşırdım, ama sonradan onun yazar değil sadece beğeni veren kişi olduğunu fark ettim
    Mümkün olduğunda genelde onun işlerinden uzak dururum

    • “Mümkün olduğunda genelde onun işlerinden uzak dururum” derken neden?
    • Android’de böyle bir özellik var sanırım. Geliştiricilere özel Mock Locations özelliği.
      Bir zamanlar bir Trimble GNSS alıcısı kullanmıştım; USB OTG miydi yoksa BLE miydi hatırlamıyorum ama Trimble uygulaması bir Mock Locations kaynağı olarak çalışıyordu, böylece herhangi bir Android uygulaması telefonun kendi görece düşük hassasiyeti yerine ölçüm direğinin yüksek hassasiyetli koordinatlarını, yaklaşık 2 cm düzeyinde, alabiliyordu
  • İlginç, ama bunu kendim de yapabilir ve ev ağındayken Android cihazda bunu yayınlayan bir betik yazabilirim
    Gerçekten buna ihtiyacım olup olmadığından hâlâ tam emin değilim :p

  • NMEA 0183’ün deniz elektroniği için bir spesifikasyonlar paketi olduğunu öğrenmek benim için yeniydi
    NMEA’nın ne anlama geldiğini araştıracak kadar hiç merak etmemiştim ama ModemManager ve Qualcomm modemler sayesinde ismin kendisine aşinaydım

    $ 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