Introduzione
Nel nostro percorso di sviluppo di dispositivi IoT Linux, la gestione delle connessioni WiFi si è rivelata tanto cruciale quanto quella delle connessioni 4G (trattate nel nostro precedente articolo).
Dalla configurazione di semplici client che si connettono a reti esistenti, fino alla creazione di access point per reti mesh o configurazioni iniziali, abbiamo esplorato diverse soluzioni tecniche.
Questo articolo racconta la nostra esperienza pratica con gli strumenti di configurazione WiFi più diffusi: partendo dall’approccio tradizionale con hostapd e dnsmasq per la gestione manuale, fino ad arrivare a NetworkManager per scenari più complessi.
Condivideremo i problemi che abbiamo incontrato, le soluzioni che abbiamo sviluppato e i criteri che utilizziamo oggi per scegliere l’approccio più appropriato per ogni progetto.
Configurazione WiFi Client
L’approccio tradizionale: wpa_supplicant e dhcpcd
Nei nostri primi progetti, la configurazione di un client WiFi sembrava un compito relativamente semplice: modificare alcuni file di configurazione e avviare i servizi necessari.
L’approccio classico utilizzava wpa_supplicant
per la gestione dell’autenticazione e dhcpcd
per l’assegnazione dell’IP.
I vantaggi che abbiamo apprezzato
Controllo granulare: La configurazione diretta attraverso /etc/wpa_supplicant/wpa_supplicant.conf
ci dava pieno controllo su ogni aspetto della connessione:
# /etc/wpa_supplicant/wpa_supplicant.conf ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=IT network={ ssid="MyNetwork" psk="MyPassword" key_mgmt=WPA-PSK priority=1 } network={ ssid="BackupNetwork" psk="BackupPassword" key_mgmt=WPA-PSK priority=2 }
Leggerezza estrema: Su dispositivi con risorse limitate (64-128MB RAM), questo approccio consumava pochissime risorse, lasciando spazio per l’applicazione principale.
Trasparenza completa: Ogni parametro era esplicito e modificabile. Potevamo facilmente personalizzare timeout, algoritmi di cifratura, e comportamenti specifici per ogni rete.
I problemi che ci hanno fatto riflettere
Gestione delle disconnessioni: Come per wvdial con il 4G, la gestione automatica delle riconnessioni era problematica. Quando la connessione si interrompeva, dovevamo implementare script esterni per rilevare la situazione e riconnettersi.
Configurazione statica: Ogni cambio di rete richiedeva modifiche manuali ai file di configurazione. Non c’era un modo semplice per gestire dinamicamente nuove reti o cambiamenti di password.
Debugging complesso: Quando qualcosa non funzionava, dovevamo analizzare manualmente i log di wpa_supplicant
e dhcpcd
, spesso senza informazioni chiare sul problema.
Quando scegliere l’approccio tradizionale
Nonostante i limiti, l’approccio con wpa_supplicant
rimane la nostra scelta per:
- Dispositivi con meno di 256MB di RAM
- Progetti con configurazioni WiFi statiche e prevedibili
- Situazioni dove abbiamo pieno controllo dell’ambiente
- Installazioni dove possiamo tollerare brevi interruzioni di connessione
Configurazione di Access Point
La necessità di creare hotspot WiFi
In molti progetti IoT, i dispositivi devono fungere da access point per permettere la configurazione iniziale tramite smartphone o tablet, o per creare reti mesh locali. La combinazione di hostapd per la gestione dell’access point e dnsmasq per DHCP e DNS si è rivelata la soluzione più affidabile.
Configurazione di hostapd
La configurazione di hostapd
richiede precisione, soprattutto per quanto riguarda la compatibilità hardware:
# /etc/hostapd/hostapd.conf interface=wlan0 driver=nl80211 ssid=IoTDevice-Setup hw_mode=g channel=7 wmm_enabled=0 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=SetupPassword123 wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP
Configurazione di dnsmasq
Dnsmasq
gestisce sia DHCP che DNS per i client connessi:
# /etc/dnsmasq.conf interface=wlan0 dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h domain=local address=/setup.local/192.168.4.1
Routing del traffico da altra interfaccia
Per semplificare l’attivazione dell’access point, la configurazione di base di hostapd
e dnsmasq
è sufficiente per creare una rete WiFi funzionante.
Tuttavia, due considerazioni importanti riguardano la gestione del traffico di rete quando il dispositivo deve fungere da gateway per fornire connettività Internet ai client connessi.
Routing del traffico verso interfacce cablate (eth0)
Quando il dispositivo IoT è connesso via Ethernet e deve condividere questa connessione con i client WiFi, è necessario configurare il NAT attraverso iptables
.
Questo scenario è comune nei gateway industriali dove la connessione primaria avviene via cavo e il WiFi serve per dispositivi mobili o configurazione:
# Abilitazione forwarding IP
echo 1 > /proc/sys/net/ipv4/ip_forward
# Configurazione NAT per traffico da WiFi verso Ethernet
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
Routing del traffico verso interfacce cellulari (wwan0)
Nei deployment dove il dispositivo utilizza una connessione 4G come uplink principale, la configurazione delle iptables
deve tenere conto delle interfacce wwan
tipiche dei modem cellulari.
Questo scenario richiede particolare attenzione alla gestione delle MTU e dei timeout, dato che le connessioni cellulari possono avere latenze variabili:
# NAT verso interfaccia cellulare
iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE
iptables -A FORWARD -i wwan0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan0 -o wwan0 -j ACCEPT
# Ottimizzazione MTU per connessioni cellulari
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Queste configurazioni di routing sono fondamentali per trasformare il dispositivo IoT in un vero gateway di rete, permettendo ai client WiFi di accedere a Internet attraverso la connessione primaria del dispositivo.
I vantaggi di hostapd + dnsmasq
- Controllo completo: Possiamo configurare ogni aspetto dell’access point, dalla crittografia ai canali utilizzati.
- Affidabilità: Una volta configurati correttamente, questi strumenti sono estremamente stabili.
- Leggerezza: Il consumo di risorse è minimo, ideale per dispositivi embedded.
- Flessibilità: Possiamo facilmente integrare funzionalità personalizzate come portali captive o configurazioni dinamiche.
Le sfide incontrate
- Configurazione hardware-specifica: Ogni adattatore WiFi ha le sue peculiarità. Alcuni supportano solo determinati canali, altri hanno limitazioni sui driver.
- Gestione del dual-mode: Far funzionare lo stesso adattatore WiFi sia come client che come access point richiede script complessi per il cambio di modalità.
- Debugging complesso: Quando l’AP non funziona, le cause possono essere molteplici: driver, firmware, configurazione canali, interferenze.
L’evoluzione verso NetworkManager
Un fattore determinante nella nostra scelta è stato la possibilità di utilizzare lo stesso strumento già selezionato per le connessioni 4G.
Come descritto nel nostro articolo precedente sulla gestione delle connessioni cellulari, NetworkManager si era già dimostrato la soluzione più robusta per la gestione dei modem 4G in ambienti di produzione.
Utilizzare lo stesso framework per entrambe le tecnologie di connettività ci ha permesso di standardizzare gli strumenti di gestione, semplificare la manutenzione e ridurre la complessità operativa dei nostri dispositivi IoT.
NetworkManager prometteva quindi di unificare la gestione di tutte le connessioni di rete – WiFi, Ethernet e cellulari – attraverso un’interfaccia coerente e strumenti di debugging comuni, eliminando la necessità di mantenere competenze e procedure separate per tecnologie diverse.
I vantaggi immediati di NetworkManager
Gestione unificata di client e access point
Con NetworkManager, possiamo gestire sia connessioni client che access point attraverso la stessa interfaccia:
# Connessione come client
nmcli device wifi connect "NetworkName" password "NetworkPassword"
# Creazione di un hotspot
nmcli device wifi hotspot con-name "MyHotspot" ssid "IoTDevice" password "SetupPass123"
# Switch tra modalità
nmcli connection up "NetworkName" # Modalità client
nmcli connection up "MyHotspot" # Modalità AP
Configurazioni persistenti e profili
NetworkManager mantiene profili persistenti che semplificano la gestione:
# Creazione di un profilo WiFi con configurazioni avanzate
nmcli connection add type wifi \
con-name "ProductionNetwork" \
ssid "ProdNet" \
wifi-sec.key-mgmt wpa-psk \
wifi-sec.psk "SecurePassword" \
connection.autoconnect yes \
connection.autoconnect-priority 10
# Configurazione IP statico
nmcli connection modify "ProductionNetwork" \
ipv4.method manual \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns 8.8.8.8,8.8.4.4
Gestione automatica delle riconnessioni
NetworkManager gestisce automaticamente:
- Riconnessioni dopo interruzioni temporanee
- Roaming tra access point della stessa rete
- Failover tra reti con priorità diverse
- Riconnessione automatica all’avvio
Le sfide con NetworkManager
- Maggiore consumo di risorse: NetworkManager richiede più RAM e CPU rispetto all’approccio tradizionale. Su dispositivi con 256MB di RAM, abbiamo notato un impatto significativo, soprattutto durante le scansioni WiFi e le riconnessioni.
- Complessità di debugging: quando qualcosa non funziona con NetworkManager, il debugging coinvolge più livelli.
- Configurazioni avanzate più complesse: per scenari molto specifici, NetworkManager può risultare più complesso da configurare rispetto agli strumenti tradizionali. Ad esempio, configurazioni di bridging avanzate o integrazione con VPN richiedono una comprensione approfondita dell’architettura di NetworkManager.
Strumenti di diagnostica e monitoring
Il nostro toolkit per il debugging WiFi
Indipendentemente dallo strumento scelto, abbiamo sviluppato procedure standardizzate per diagnosticare problemi WiFi:
Verifica dello stato delle interfacce
# Stato generale delle interfacce
ip addr show
iwconfig
iw dev
# Informazioni specifiche WiFi
iw wlan0 info
iw wlan0 link
iw wlan0 scan | grep -E "(BSS|SSID|signal)"
Test di connettività
# Test di base
ping -c 3 8.8.8.8
ping -c 3 google.com
# Test di performance
iperf3 -c speedtest.net -t 30
# Analisi della qualità del segnale
watch -n 1 'iw wlan0 link'
Monitoring del traffico
# Statistiche interfaccia
cat /proc/net/dev | grep wlan0
ifconfig wlan0
# Monitoring in tempo reale
iftop -i wlan0
nethogs wlan0
Debugging avanzato
# Log dettagliati wpa_supplicant
wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -d
# Monitoring NetworkManager
journalctl -u NetworkManager -f
# Scansione dettagliata reti
iw wlan0 scan dump
Criteri di scelta basati sulla nostra esperienza
Matrice decisionale
Dopo anni di progetti, abbiamo definito criteri chiari per scegliere l’approccio migliore:
Scegliere wpa_supplicant + dhcpcd quando:
- RAM disponibile < 256MB
- Configurazioni WiFi statiche e prevedibili
- Controllo granulare necessario su parametri specifici
- Team con competenze sistemistiche avanzate
- Tolleranza per interruzioni brevi del servizio
- Budget hardware molto limitato
Scegliere hostapd + dnsmasq quando:
- Necessità di creare access point dedicati
- Configurazioni AP statiche e specializzate
- Integrazione con portali captive personalizzati
- Controllo completo sui parametri dell’access point
- Dispositivi che fungono principalmente da AP
Scegliere NetworkManager quando:
- RAM disponibile > 512MB
- Necessità di switch dinamico client/AP
- Gestione di multiple reti WiFi
- Requisiti di roaming automatico
- Configurazioni complesse (VPN, bridging, failover)
- Team con competenze di system administration standard
- Progetti che richiedono manutenzione semplificata
Conclusioni e raccomandazioni
La nostra esperienza nella gestione WiFi per dispositivi IoT Linux ci ha insegnato che non esiste una soluzione universale. La scelta deve sempre essere guidata dai requisiti specifici del progetto.
Le lezioni apprese
- Semplicità vs Funzionalità: L’approccio tradizionale con
wpa_supplicant
ehostapd
offre il massimo controllo e la minima overhead, ma richiede più lavoro di implementazione per scenari complessi. - NetworkManager come acceleratore: Per progetti che richiedono funzionalità avanzate, NetworkManager accelera significativamente lo sviluppo, ma con un costo in termini di risorse.
- L’importanza della diagnostica: Indipendentemente dall’approccio scelto, avere strumenti di diagnostica standardizzati è fondamentale per la manutenzione e il debugging.
- Configurazioni ibride: In alcuni casi, la combinazione di approcci diversi per scenari diversi risulta la soluzione più efficace.
Strumenti emergenti
Stiamo monitorando l’evoluzione di iwd
(Intel’s iNet Wireless Daemon) come alternativa moderna a wpa_supplicant
, che promette migliori performance e un’architettura più pulita, soprattutto per dispositivi moderni.
Il futuro della connettività WiFi IoT
Con l’evoluzione verso WiFi 6/6E e la crescente adozione di mesh networks, prevediamo che strumenti come NetworkManager diventeranno sempre più centrali nella gestione della connettività IoT, mentre l’approccio tradizionale rimarrà rilevante per dispositivi con vincoli estremi di risorse.
La gestione della connettività WiFi continua ad essere un aspetto critico dei progetti IoT, e la scelta degli strumenti giusti può fare la differenza tra un deployment di successo e problemi operativi continui.
Hai avuto esperienze simili nella gestione di connessioni WiFi su dispositivi IoT, oppure ti serve supporto per configurare la connettività del tuo progetto? Contattaci per condividere la tua esperienza o per ricevere assistenza tecnica specializzata!