Skip to content
אצלי
Go back

Guia prático: todas as formas de ver o ADS-B em tempo real

Mapa web do tar1090 com quatro aeronaves ao vivo sobre a região de Guarulhos e tabela de voos ao lado

Sexto artigo da série, e este é diferente dos anteriores: menos narrativa, mais guia de consulta. Com o pipeline inteiro no ar, ficou a pergunta prática do dia a dia: “quero ver os aviões agora, qual comando eu rodo?”. Este post é a resposta, com todas as interfaces que o readsb expõe, da mais técnica à mais amigável.

A série até aqui: o primeiro artigo apresentou o projeto de gerar meus próprios dados do mundo físico; o segundo explicou o protocolo ADS-B e sua falta de autenticação; o terceiro cobriu o hardware RTL-SDR v4 e a instalação do driver; o quarto montou o pipeline de decodificação com o readsb até as primeiras aeronaves no terminal; e o quinto trocou o fork do readsb e colocou o mapa web ao vivo no ar com o tar1090.

O ponto de partida deste guia: o serviço readsb já roda em background (systemctl status readsb) e expõe os dados por várias portas TCP locais. Abaixo, os comandos pra cada forma de visualização, e os apps GUI instalados que servem de apoio.

1. Visualização interativa no terminal: viewadsb

A forma mais direta de “ver os aviões” sem precisar de mapa web. É um cliente ncurses que já vem com o readsb, conecta em 127.0.0.1:30005 (Beast) por padrão.

viewadsb

Mostra uma tabela ao vivo, com um cabeçalho assim:

Hex    Mode  Sqwk  Flight     Alt   Spd  Hdg      Lat     Long  RSSI  Msgs Seen

Ctrl+C pra sair.

Importante: precisa rodar direto num terminal SSH de verdade (ele usa a tela inteira via ncurses), não funciona bem através de pontes de automação sem TTY.

Variações úteis:

viewadsb --metric              # altitude/velocidade em métrico em vez de pés/nós
viewadsb --show-only=E491F0    # filtra só uma aeronave específica pelo ICAO hex

Glossário das colunas (pra quem não é da área)

ColunaSignificado
HexCódigo único da aeronave (ICAO), tipo uma “placa” do transponder
ModeModo do transponder (S = Mode S, o padrão moderno)
SqwkSquawk, código de 4 dígitos que o piloto configura (7700 = emergência, por ex.)
FlightNúmero do voo/callsign (ex: TAM3994)
AltAltitude em pés
SpdVelocidade no solo, em nós
HdgRumo/direção (graus, 0-360)
Lat/LongPosição (latitude/longitude)
RSSIForça do sinal recebido (mais perto de 0 = sinal mais forte)
MsgsQuantas mensagens dessa aeronave já foram recebidas
SeenSegundos desde a última mensagem recebida

Alternativa mais amigável: radar-simples.sh

Pra não depender do jeito abreviado do viewadsb, escrevi um script que lê /run/readsb/aircraft.json (via jq) e mostra uma tabela com nomes de coluna por extenso, em português, sem precisar decifrar sigla nenhuma:

~/radar-simples.sh        # atualiza a cada 2s (padrão)
~/radar-simples.sh 5      # atualiza a cada 5s

Saída (exemplo real):

=== Aviões ao vivo - 19:16:20 ===
3 aeronaves detectadas, 1 com posição conhecida

VOO    ALTITUDE(pés)  VELOCIDADE(nós)  RUMO(°)  LATITUDE    LONGITUDE   SINAL  VISTO HÁ(s)
PSEKR  3075           147              270      -23.538860  -46.553853  -17.7  0

Atualiza a cada 2s - Ctrl+C pra sair | Mapa: http://172.22.2.108/tar1090/

É ele rodando no painel do meio aqui, entre o viewadsb (topo) e o stream SBS bruto (embaixo):

Três terminais no servidor: viewadsb com a tabela técnica no topo, o radar-simples.sh com colunas em português no meio e o stream SBS bruto via nc embaixo

Script completo (~/radar-simples.sh):

#!/bin/bash
# Visão simplificada em português dos aviões recebidos pelo readsb.
# Lê /run/readsb/aircraft.json e mostra uma tabela com nomes de coluna claros.

DATA=/run/readsb/aircraft.json
INTERVAL="${1:-2}"

if ! command -v jq &>/dev/null; then
    echo "Precisa do 'jq' instalado (sudo pacman -S jq)."
    exit 1
fi

trap 'echo; echo "Saindo."; exit 0' INT

while true; do
    clear
    if [[ ! -f "$DATA" ]]; then
        echo "Não achei $DATA - o serviço readsb está rodando?"
        sleep "$INTERVAL"
        continue
    fi

    TOTAL=$(jq '.aircraft | length' "$DATA")
    COM_POSICAO=$(jq '[.aircraft[] | select(.lat and .lon)] | length' "$DATA")

    echo "=== Aviões ao vivo - $(date '+%H:%M:%S') ==="
    echo "$TOTAL aeronaves detectadas, $COM_POSICAO com posição conhecida"
    echo

    {
        echo -e "VOO\tALTITUDE(pés)\tVELOCIDADE(nós)\tRUMO(°)\tLATITUDE\tLONGITUDE\tSINAL\tVISTO HÁ(s)"
        jq -r '
            .aircraft
            | map(select(.lat and .lon))
            | sort_by(.seen)
            | .[] | [
                ((.flight // "(sem voo)") | gsub("^\\s+|\\s+$";"")),
                (if .alt_baro then (.alt_baro|tostring) else "-" end),
                (if .gs then (.gs|round|tostring) else "-" end),
                (if .track then (.track|round|tostring) else "-" end),
                (.lat|tostring),
                (.lon|tostring),
                (if .rssi then (.rssi|tostring) else "-" end),
                (if .seen then (.seen|round|tostring) else "-" end)
            ] | @tsv
        ' "$DATA"
    } | column -t -s $'\t'

    echo
    IP=$(ip route get 1.1.1.1 2>/dev/null | grep -o 'src [0-9.]*' | cut -d' ' -f2)
    echo "Atualiza a cada ${INTERVAL}s - Ctrl+C pra sair | Mapa: http://${IP}/tar1090/"
    sleep "$INTERVAL"
done

2. Stream de texto (SBS/BaseStation): bom pra logging ou grep

nc localhost 30003

Cada linha é uma mensagem decodificada em CSV (formato SBS). Foi assim que a captura foi validada lá no quarto artigo. Dá pra redirecionar pra arquivo:

nc localhost 30003 | tee -a ~/adsb-log-$(date +%F).csv

Ou filtrar por aeronave/campo com grep/awk em tempo real:

nc localhost 30003 | grep E491F0

3. Stream raw (Mode-S hex): porta 30002

nc localhost 30002

Mensagens Mode-S em hexadecimal bruto, sem decodificação de posição/velocidade. Mais cru, útil pra depurar reconstrução de mensagens, não pra leitura direta.

4. Beast binário: porta 30005

nc localhost 30005 | xxd | head

Formato binário (usado pelo viewadsb e por feeders como o do ADSBExchange/FlightAware). Não é legível diretamente: só use se for alimentar outra ferramenta que fale o protocolo Beast.

5. Arquivos JSON em /run/readsb/

ls -la /run/readsb/
cat /run/readsb/aircraft.json | jq .

O aircraft.json (estado atual) é escrito periodicamente em JSON puro, legível direto ou com jq. Nota: isso só é verdade depois da troca pro fork readsb-wiedehopf-git; o fork Mictronics usado inicialmente gravava em protobuf binário, ilegível sem decodificar (a história completa da troca está no quinto artigo). É esse arquivo que alimenta o radar-simples.sh (seção 1) e o tar1090 (seção 7).

6. Apps GUI instalados no servidor (auxiliares/alternativos)

O servidor tem uma sessão gráfica ativa (Wayland, seat0/tty1), então dá pra rodar interface gráfica se você tiver acesso à área de trabalho dessa máquina, local ou via alguma solução de acesso remoto gráfico (não incluído aqui).

SDR++ (sdrpp-git, já instalado)

sdrpp

É um receptor SDR de uso geral (waterfall, espectro, demodulação), não decodifica ADS-B. Os plugins instalados nessa build são pra source de hardware (rtl_sdr, hackrf, limesdr, etc.), demodulação de rádio (radio.so), M17, pager, ATV e meteor (satélite). Não há plugin de ADS-B nesse build específico do SDR++.

Uso como auxiliar: sintonize 1090 MHz manualmente no SDR++ pra ver visualmente a energia RF chegando (pulsos no waterfall toda vez que um avião transmite). Bom pra confirmar visualmente se a antena está captando sinal, mas não substitui o readsb pra decodificação real.

SatDump

Instalado via AUR (yay -S satdump), como documentado no quinto artigo. É focado em satélites (137 MHz, NOAA, Meteor), não em ADS-B. Buscar esses dados de satélite será um projeto futuro do homelab.

7. Mapa web ao vivo: tar1090

http://IP-DO-SERVIDOR/tar1090/

Mostra um mapa ao vivo estilo FlightAware/ADSBExchange: ícone do avião na posição real, disponível pra qualquer dispositivo na rede do servidor (ou externamente, se você quiser expor). A opção mais amigável de todas:

Mapa web do tar1090 no navegador com quatro aeronaves ao vivo sobre a região metropolitana de São Paulo, trilhas de voos anteriores e tabela com callsign, tipo, altitude e velocidade

Clica no avião e vê voo, altitude e velocidade sem decifrar sigla nenhuma. Aqui um A350 da Ethiopian Airlines cruzando a região, com matrícula, tipo e RSSI no tooltip:

Mapa do tar1090 com tooltip aberto pro voo ETH506, Airbus A350 da Ethiopian Airlines, mostrando matrícula ET-AVE, altitude de 14.400 pés e velocidade de 356 nós

Resumo rápido

Quero…Comando
Ver tabela ao vivo no terminal (técnico)viewadsb
Ver tabela ao vivo em português (amigável)~/radar-simples.sh
Ver mensagens decodificadas (texto)nc localhost 30003
Gravar log em arquivonc localhost 30003 | tee -a log.csv
Ver mensagens Mode-S cruasnc localhost 30002
Confirmar visualmente RF em 1090 MHz (GUI)sdrpp (sintonizar 1090 MHz manualmente)
Mapa web ao vivo (mais amigável de todos)http://IP-DO-SERVIDOR/tar1090/

Share this post on:

Next Post
Capturando ADS-B em 1090 MHz com a RTL-SDR v4