Transmitindo GPS na rede local
(evertpot.com)- 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-iidentificava 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-nmeaativado por padrão em/etc/geoclue/geoclue.confe 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._tcpcom 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+RMCcom 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-ipode 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
GPRMCeGPGGA$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._tcpcom 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
.localna 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 comavahi-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 comtelnet 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 metersClient 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
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
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
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