In questo articolo vedremo un semplice algoritmo che ci permette di determinare quale sia il canale WiFi 2.4 GHz migliore  da utilizzare per la nostra rete. Questo algoritmo può essere semplicemente implementato e modificato in base al linguaggio di programmazione che si vuole utilizzare.

Brevi cenni teorici

Prima di entrare nei dettagli dell’algoritmo, vediamo qualche cenno teorico.

Lo spettro dei canali Wifi da 2.4 GHz  contiene da 12 a 14 canali (a seconda della regione geografica in cui vi trovate). Ogni canale, fatta eccezione del canale 14, è spaziato dall’altro di 5 MHz  ed ha una larghezza di banda di 22 MHz. La banda di un canale può sovrapporsi con quella del canale adiacente fino a due passi superiori o inferiore. Ad esempio, una rete che utilizza il canale 6 (2437 MHz) genera interferenze con i canali 4,5 a sinistra e con i canali 7,8 a destra.


Algoritmo

L’algoritmo è suddiviso in tre fasi principali:

Fase 1: Scansione WiFi in questa fase viene eseguita la scansione WiFi per verificare se sono presenti delle reti pre-esistenti e che potrebbero andare in conflitto con la nostra.
Fase 2: Elaborazione delle Statistiche in questa fase vengono elaborate (per ogni singolo canale) le statistiche relative al peso da assegnare (definito da un’apposita funzione) e viene verificato se i canali adiacenti sono liberi o occupati.
Fase 3: Valutazione scenario  e scelta del canale migliore in questa fase abbiamo diversi scenari. In base allo scenario in cui ricadiamo viene effettuata una scelta piuttosto che un’altra.

Scansione WiFi

Per prima cosa eseguiamo la scansione WiFi con un comando a nostro piacimento (che può essere iwinfo o iwlist). Dalla scansione WiFi ricaviamo le seguenti informazioni per ogni rete presente:

SSID BSSID channel RSSI[dB]

Elaborazione delle statistiche

Una volta eseguita la scansione elaboriamo i dati ottenuti generando delle statistiche, in cui valutiamo un peso da associare al canale e se i canali adiacenti a destra ed a sinistra di ogni canale (fino a 2 canali) sono liberi o occupati.

Nota bene: Ovviamente il primo e l’ultimo canale WiFi dello spettro non avranno, rispettivamente, nessun canale vicino a sinistra ed a destra. Lo stesso vale per i canali immediatamente prima e dopo, i quali non avranno il canale adiacente di passo 2, rispettivamente a sinistra ed a destra.

Andiamo così a creare la seguente tabella di statistiche in cui, ogni riga associata ad ogni canale, dovrà contenere i seguenti parametri:

#Canale #ApAssociati RSSIdellaReteMiglioreDelCanale Peso L R L2 R2 Noise

Nota bene: Ogni canale, anche se non rilevato occupato dalla scansione WiFi, deve contenere i precedenti parametri. Ne consegue che se è un canale è libero avrà 0 ApAssociati, 100 come RSSI e 0 come peso. Inoltre è possibile che alcuni canali non dispongano di un canale adiacente. In quel caso i valori di L,R,L2 o R2 sono impostati a -1. Se un canale invece ha il canale a sinistra occupato, il valore di L sarà 1. Viceversa sarà 0.

Funzione peso

La funzione peso è il punto cruciale della valutazione del canale migliore. Sicuramente esiste un metodo più efficace, ma vediamo un metodo molto semplice: per valutare il peso di un canale si divide il valore RSSIdellaReteMiglioreDelCanale per il #ApAssociati. Se dalla scansione WiFi è possibile ricavare anche il rumore (Noise) presente su ogni canale, questa funzione si può migliorare penalizzando il valore del peso quando si supera una certa soglia di rumore.

Valutazione scenario e scelta del canale migliore

Una volta generate le statistiche, andiamo ad operare la scelta del canale in base a scenari diversi:

Scenario 1

Tutti i canali sono occupati.
Questo scenario è il caso limite, ovvero tutti i canali sono occupati. In questo caso andremo a scegliere il canale che ha peso maggiore. Se trovassimo due o più canali con lo stesso peso, sta a voi decidere quale scegliere (in base ad un gerarchia, in base all’ultimo trovato, al primo…).

Scenario 2

Uno o più canali sono liberi e non hanno canali adiacenti a destra ed a sinistra occupati (fino a 2 passi).
Questo scenario è il caso migliore. Se abbiamo solo un canale che rispetta questo requisito, la scelta è semplice. Se ne abbiamo più di uno, come prima, sta a voi decidere quale scegliere (in base ad un gerarchia, in base all’ultimo trovato, al primo…).

Scenario 3

Uno o più canali liberi con canali adiacenti liberi destra o sinistra (fino a 2 passi), ma liberi fino ad 1 passo a sinistra o destra.
Se abbiamo solo un canale che rispetta questo requisito, la scelta è semplice. Se ne abbiamo più di uno, come prima, sta a voi decidere quale scegliere (in base ad un gerarchia, in base all’ultimo trovato, al primo…).

Scenario 4

Uno o più canali liberi con canali adiacenti liberi a destra ed a sinistra (fino ad 1 passo)
Se abbiamo solo un canale che rispetta questo requisito, la scelta è semplice. Se ne abbiamo più di uno, come prima, sta a voi decidere quale scegliere (in base ad un gerarchia, in base all’ultimo trovato, al primo…).

Scenario 5

Uno o più canali liberi con canali adiacenti liberi a destra o sinistra (fino ad 1 passo), ma occupati a sinistra o destra
Se abbiamo solo un canale che rispetta questo requisito, la scelta è semplice. Se ne abbiamo più di uno, come prima, sta a voi decidere quale scegliere (in base ad un gerarchia, in base all’ultimo trovato, al primo…).

Scenario 6

Uno o più canali liberi ma con canali adiacenti occupati a destra ed a sinistra
Se abbiamo solo un canale che rispetta questo requisito, la scelta è semplice. Se ne abbiamo più di uno, come prima, sta a voi decidere quale scegliere (in base ad un gerarchia, in base all’ultimo trovato, al primo…).

Questo algoritmo funziona molto bene ed è molto semplice quando abbiamo un solo canale migliore da scegliere. Se invece ci troviamo in uno scenario in abbiamo più di un canale migliore, tutto dipende da come implementate la scelta tra quelli disponibili.