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)
| Coluna | Significado |
|---|---|
Hex | Código único da aeronave (ICAO), tipo uma “placa” do transponder |
Mode | Modo do transponder (S = Mode S, o padrão moderno) |
Sqwk | Squawk, código de 4 dígitos que o piloto configura (7700 = emergência, por ex.) |
Flight | Número do voo/callsign (ex: TAM3994) |
Alt | Altitude em pés |
Spd | Velocidade no solo, em nós |
Hdg | Rumo/direção (graus, 0-360) |
Lat/Long | Posição (latitude/longitude) |
RSSI | Força do sinal recebido (mais perto de 0 = sinal mais forte) |
Msgs | Quantas mensagens dessa aeronave já foram recebidas |
Seen | Segundos 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):

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:

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:

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 arquivo | nc localhost 30003 | tee -a log.csv |
| Ver mensagens Mode-S cruas | nc 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/ |