Site Survey de Wi-Fi: mapeie sinal e interferência no Linux
|

Site Survey de Wi-Fi: mapeie sinal e interferência no Linux

Reclamação de “Wi-Fi lento” quase sempre tem duas causas raiz: canal sobrecarregado por outras redes ao redor, ou ponto de acesso mal posicionado criando zonas mortas. As duas se diagnosticam com um site survey — e não é preciso licença de Ekahau ou NetSpot para isso: iw, wavemon e um script Python com menos de 30 linhas já mostram onde o sinal cai e qual canal está livre.

Por que o canal errado pesa mais que a potência do AP

No 2,4 GHz, a banda ISM brasileira só tem três canais que não se sobrepõem: 1, 6 e 11. Qualquer outro canal (2, 3, 4, 7…) invade a faixa do vizinho e os dois lados passam a disputar o mesmo espectro, aumentando colisão e retransmissão — o sintoma que o usuário sente como “lentidão” é, na prática, retry de quadro.

No 5 GHz o cenário é melhor (canais de 20 MHz não se sobrepõem a cada passo de 4), mas boa parte da faixa alta é DFS: compartilhada com radares meteorológicos e militares. Quando o rádio detecta um pulso de radar, ele muda de canal e corta a conexão por alguns segundos — o motivo mais comum de “quedas aleatórias” em ambientes perto de aeroporto. Isso já foi tratado em detalhe no guia de canais DFS; aqui o objetivo é medir antes de decidir.

Site survey é exatamente isso: caminhar pelo ambiente registrando canal ocupado e força de sinal ponto a ponto, para decidir canal e posição do AP com dado, não com achismo.

Ferramentas necessárias

Tudo abaixo é gratuito e já roda em qualquer notebook com Linux (ou numa VM/live USB, se o parque for Windows):

  • iw — consulta o adaptador Wi-Fi e lista redes vizinhas com canal e sinal.
  • wavemon — painel em modo texto com RSSI, ruído e histórico em tempo real, útil para parar num ponto e observar a estabilidade do sinal, não só o valor instantâneo.
  • Python 3 com numpy, scipy e matplotlib — para interpolar os pontos medidos e desenhar o mapa de calor.

Não é preciso modo monitor nem adaptador especial: os três comandos usados aqui funcionam em modo managed, com qualquer chip Wi-Fi comum.

Passo a passo

1. Instale as ferramentas

sudo apt update
sudo apt install -y wavemon iw
pip install numpy scipy matplotlib --break-system-packages

2. Mapeie as redes vizinhas e os canais ocupados

iw dev
sudo iw dev wlan0 scan | grep -E "SSID|freq|signal"

Troque wlan0 pelo nome da sua interface, listado pelo primeiro comando. A saída traz um bloco por rede encontrada: freq informa a frequência em MHz (2412 MHz = canal 1, 2437 MHz = canal 6, 2462 MHz = canal 11; no 5 GHz o canal é (freq − 5000) / 5) e signal traz o RSSI em dBm de cada vizinho. Anote quantas redes caem em cada canal — é o primeiro indício de qual canal evitar.

3. Acompanhe RSSI e ruído em tempo real com wavemon

sudo wavemon

Com o notebook conectado à rede que está sendo testada, a tela inicial já mostra o nível de sinal (level) e o ruído de fundo (noise) atualizados a cada segundo. F2 abre o histograma de nível — parado num ponto por 15–20 segundos, ele revela se o sinal ali é estável ou se varia muito (indício de interferência intermitente, como forno micro-ondas ou Bluetooth no 2,4 GHz). F3 lista as redes ao redor, útil para confirmar o canal escolhido no passo 2. q sai do programa.

4. Faça o walk test e registre os pontos

Defina uma grade sobre a planta do ambiente (por exemplo, a cada 3–5 metros) e, em cada ponto, rode o script abaixo passando as coordenadas X e Y da grade:

cat > survey.sh << 'SCRIPT'
#!/bin/bash
# Uso: ./survey.sh  
RSSI=$(sudo iw dev wlan0 station dump 2>/dev/null \
  | grep -oP 'signal:\s*-?\d+' | grep -oP -- '-?\d+' | head -1)
echo "$1,$2,$RSSI" >> survey.csv
echo "Ponto ($1,$2): ${RSSI:-sem leitura} dBm"
SCRIPT
chmod +x survey.sh

./survey.sh 0 0
./survey.sh 5 0
./survey.sh 10 0

Repita em cada ponto da grade, conectado o tempo todo à rede que está sendo avaliada. Cada execução acrescenta uma linha a survey.csv no formato x,y,rssi. Quanto mais pontos, mais fiel o mapa — para uma sala de 100 m², 15 a 20 pontos já dão um resultado utilizável.

5. Gere o mapa de calor

cat > heatmap.py << 'PYEOF'
import csv
import numpy as np
from scipy.interpolate import griddata
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

pontos = []
with open("survey.csv") as f:
    for linha in csv.reader(f):
        x, y, rssi = linha
        pontos.append((float(x), float(y), float(rssi)))

xs = np.array([p[0] for p in pontos])
ys = np.array([p[1] for p in pontos])
rssi = np.array([p[2] for p in pontos])

grid_x, grid_y = np.mgrid[xs.min():xs.max():200j, ys.min():ys.max():200j]
grid_z = griddata((xs, ys), rssi, (grid_x, grid_y), method="cubic")

plt.figure(figsize=(8, 6))
plt.imshow(grid_z.T, extent=(xs.min(), xs.max(), ys.min(), ys.max()),
           origin="lower", cmap="RdYlGn", vmin=-85, vmax=-30)
plt.colorbar(label="RSSI (dBm)")
plt.scatter(xs, ys, c="black", s=15, label="pontos medidos")
plt.legend()
plt.title("Mapa de calor do Wi-Fi")
plt.savefig("heatmap.png", dpi=150, bbox_inches="tight")
print("heatmap.png gerado")
PYEOF
python3 heatmap.py

O script interpola os pontos medidos (griddata, método cúbico) e pinta a planta em um gradiente de vermelho (sinal fraco) a verde (sinal forte). Para sobrepor o resultado a uma planta real, abra heatmap.png num editor de imagem com opacidade reduzida por cima da planta baixa, usando a mesma escala de metros dos eixos X e Y.

Interpretando o resultado e corrigindo

Como regra prática: abaixo de −70 dBm o Wi-Fi ainda conecta, mas a taxa de transmissão despenca e aplicações sensíveis a latência (chamadas de voz e vídeo) sofrem; abaixo de −80 dBm a conexão fica instável e sujeita a quedas. As áreas que o heatmap mostrar nessa faixa são candidatas a receber um AP adicional ou a mudança de posição do existente — geralmente mais eficaz que simplesmente aumentar a potência de transmissão, que também aumenta a interferência co-canal com os APs vizinhos.

Se o passo 2 mostrou três ou mais redes vizinhas fortes no mesmo canal de 2,4 GHz, troque para 1, 6 ou 11 — o que estiver menos ocupado — antes de qualquer outra mudança física. Em ambientes com muita densidade de AP, considere migrar o tráfego sensível para 5 GHz, que tem mais canais disponíveis e, por ser menos usado por eletrônicos domésticos, sofre menos interferência de fontes externas ao Wi-Fi.

Perguntas frequentes

Preciso de modo monitor para fazer o site survey?
Não para os passos deste guia. Modo monitor é necessário para capturar quadros 802.11 brutos (como faria o Kismet), mas iw e wavemon leem o nível de sinal direto do driver em modo managed, que é o modo padrão de qualquer adaptador Wi-Fi.

O walk test funciona em notebook com Windows?
Os comandos aqui são específicos de Linux. Em Windows, o equivalente é o PowerShell com netsh wlan show interfaces para o RSSI do ponto atual, mas sem um wavemon nativo; uma alternativa prática é rodar este guia a partir de um live USB Linux no mesmo notebook.

Quantos pontos de medição são suficientes?
Para ambientes pequenos (até 150 m²), uma grade de 3 a 5 metros entre pontos já captura as variações relevantes. Em corredores longos ou plantas irregulares, adicione pontos extras nos cantos e perto de paredes estruturais, que atenuam mais o sinal.

O heatmap substitui um survey profissional com Ekahau?
Para diagnosticar problema pontual e decidir canal ou posição de AP, sim. Ferramentas profissionais agregam modelagem de propagação por material de parede e simulação antes da instalação física, o que vale o investimento em projetos grandes, mas é dispensável para validar um ambiente já cabeado.

Conclusão

Com iw, wavemon e um script de interpolação, o diagnóstico que normalmente pede ferramenta paga sai de graça e em poucas horas de medição. O próximo passo natural é repetir o survey depois de qualquer mudança de canal ou posição de AP, para confirmar que a correção realmente resolveu a zona fraca — e não apenas moveu o problema para outro canto do ambiente.

Gostou? Compartilhe.

Posts Similares

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *