1 pontos por GN⁺ 1 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • Após o encerramento do serviço de localização GPS da Mozilla, a localização baseada em GeoClue no Linux ficou imprecisa, e o where-am-i identificava via GeoIP uma área próxima de Toronto com precisão de 25 km
  • Aproveitando o fato de que um servidor doméstico fixo não se move, foi configurado para emitir localmente as coordenadas GPS desejadas dentro da rede da casa
  • O GeoClue já vinha com network-nmea ativado por padrão em /etc/geoclue/geoclue.conf e obtinha as informações de GPS procurando um serviço mDNS _nmea-0183._tcp
  • O nmea-static-gps-server envia mensagens GPS em NMEA 0183 uma vez por segundo via TCP e registra o serviço _nmea-0183._tcp com o Avahi
  • Após reiniciar o GeoClue, o cliente passou a detectar imediatamente as coordenadas do servidor, e o resultado retornou a descrição GPS GGA+RMC com precisão de 0 meters; o Gnome Maps exibiu a localização correta na hora

Configuração do GeoClue e NMEA

  • Após o encerramento do serviço de localização GPS da Mozilla, a precisão de localização no Linux caiu, e o GeoClue, usado por Firefox e Gnome Maps em vários sistemas Linux, identificava via GeoIP uma área próxima de Toronto com precisão de 25 km segundo o where-am-i
  • A demonstração where-am-i pode ser instalada pelos pacotes da distribuição
    # Fedora  
      sudo dnf install geoclue2-demos  
    
    # Debian family  
      sudo apt install geoclue-2-demo  
    
  • Aproveitando o fato de que um servidor doméstico fixo não se move, foi configurado para emitir localmente as coordenadas GPS desejadas dentro da rede da casa
  • O protocolo usado foi o NMEA 0183, um conjunto de especificações para eletrônica naval, no qual as mensagens podem ser enviadas por porta serial ou socket TCP
  • As mensagens GPS de exemplo são compostas pelas linhas GPRMC e 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  
    
  • O GeoClue já estava com network-nmea ativado por padrão em /etc/geoclue/geoclue.conf
    # Network NMEA source configuration options  
      [network-nmea]  
    # Fetch location from NMEA sources on local network?  
      enable=true  
    
  • O GeoClue procura um serviço mDNS chamado _nmea-0183._tcp; quando encontra o registro, conecta-se ao endereço e obtém dele as informações de GPS

Implementação do servidor e verificação do funcionamento

  • O nmea-static-gps-server é um servidor TCP que envia informações de GPS uma vez por segundo e registra o serviço _nmea-0183._tcp com o Avahi
  • O Avahi é a implementação padrão de mDNS no Linux; no Mac, o Bonjour cumpre o mesmo papel, e o mDNS também é usado para endereços .local na rede local ou para descoberta de dispositivos como impressoras e TVs
  • O repositório inclui a seguinte configuração de serviço do Avahi
    <?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>  
    
  • Depois de copiar esse arquivo para /etc/avahi/services/nmea-statis-gpc.service, é possível confirmar a descoberta do serviço em outra máquina com 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 = []  
    
  • Quando o serviço está em execução em node05.local, o próprio servidor TCP também pode ser testado facilmente com telnet node05.local 10110
  • Ao reiniciar o GeoClue no cliente, ele passou a detectar imediatamente as coordenadas do servidor
    $ sudo systemctl restart geoclue  
    $ /usr/libexec/geoclue-2.0/demos/where-am-i  
    
  • O resultado retornou as coordenadas exatas do servidor e a descrição GPS GGA+RMC, com a precisão exibida como 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)  
    
  • O Gnome Maps exibiu imediatamente a localização correta, enquanto o Firefox precisou ser reiniciado
  • No Apple Maps do Mac, isso também pareceu funcionar quando os Location Services estavam desativados, mas o mapa não mostrava o ponto exato, apenas a região aproximada correta
  • Esse método faz com que máquinas Linux em casa obtenham imediatamente a localização correta sem esperar por uma consulta GPS lenta e imprecisa, e também pode ser usado para simular uma localização incorreta para convidados ou colegas que usam Linux
  • https://github.com/evert/nmea-static-gps-server

1 comentários

 
GN⁺ 1 시간 전
Comentários no Lobste.rs
  • Eu não fazia ideia de que existia um serviço mDNS padrão para anunciar GNSS na LAN, e isso resolveu na hora um problema em que eu vinha pensando de forma intermitente havia uns 6 meses

    • Pode compartilhar no que você está trabalhando? Meu pequeno projeto resolve um problema específico, mas eu estava curioso se haveria usos mais amplos
  • Falsificação de localização por GPS é uma boa ideia, mas parece dar relativamente bastante trabalho para implementar de verdade
    Seria bom se houvesse uma opção simples nas configurações do Android ou em uma extensão do Firefox, algo como “usar localização real / usar localização personalizada”
    Mas também fico curioso sobre quanto peso é dado à localização por GPS quando ela entra em conflito com outros fatores, como IP ou localidade
    Além disso, levei um susto por um momento ao ver a foto do Jeff Geerling no fim da página, antes de perceber que ele não era o autor, só tinha dado like
    Quando possível, normalmente evito o conteúdo dele

    • Por que você diz que “quando possível, normalmente evita o conteúdo dele”?
    • Acho que o Android tem esse recurso. É a função de desenvolvedor Mock Locations
      Eu já usei um receptor GNSS da Trimble e não lembro se era USB OTG ou BLE, mas o app da Trimble servia como fonte de Mock Locations para que qualquer app Android pudesse receber as coordenadas de alta precisão da haste de topografia, cerca de 2 cm, em vez da precisão relativamente baixa do próprio telefone
  • Interessante, mas eu mesmo poderia implementar isso e criar um script para transmitir a partir de um dispositivo Android quando ele estiver na rede doméstica
    Ainda não tenho certeza absoluta de que realmente preciso disso :p

  • Foi novidade para mim que NMEA 0183 é um conjunto de especificações para eletrônica marítima
    Eu nunca tinha ficado curioso o suficiente para procurar o significado de NMEA, mas conhecia o nome por causa do ModemManager e dos modems da 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