Esperimenti con la Fonera

Questo piccolo gioiellino sembra essere fatto apposta per essere usato in applicazioni di telecontrollo. L’interfaccia wi-fi, che può essere configurata sia come Access Point che come client, unita all’interfaccia ethernet, lo rendono raggiungibile praticamente da qualsiasi cosa sia collegabile a una lan con e senza fili.
Il sistema operativo utilizzato dalla fonera è Openwrt, una distribuzione Linux per dispositivi embedded, customizzato da Fon per realizzare una “Wifi Community” mondiale.
Sulla Fonera originale non è possibile accedere direttamente al sistema tramite shell, è abilitato soltanto un server http che consente l’utilizzo .. convenzionale..
Le prime versioni del firmware della fonera consentivano, con dei meccanismi di “code injection” che sfruttavano delle “vulnerabilità” sulle form html dell’interfaccia web di amministrazione, di abilitare il server ssh e quindi ottenere una shell usabile.
Le ultime versioni hanno fissato queste vulnerabilità e ciò quindi non è più possibile.
L’interfaccia web della Fonera consente l’ aggiornamento del firmware, quindi teoricamente sarebbe possibile reinstallare un firmware “vulnerabile”, e da questo ottenere la shell, tuttavia c’è un’altra soluzione per accedere all’interprete dei comandi, che consiste nel collegarsi direttamente alla console attraverso la porta seriale della MCU Atheros della Fonera.
L’accesso alla console tra l’altro rende possibile esaminare la sequenza di boot dell’aggeggio, a partire dal bootloader, fino ad arrivare al caricamento dei drivers di rete.

Per accedere alla console occorre però costruirsi un adattatore, dato che la seriale della Fonera esce con i livelli dei segnali 0-3.3 volts,mentre l’ RS232 lavora con livelli di tensione differenziali.
Io ho utilizzato il MAX-232, un convertitore di livello RS232<->TTL, e una manciata di condensatori, seguendo lo schema elettrico di utilizzo che si trova nel datasheet del componente.
adattatore seriale per la fonera particolare sul max-232
Fortunatamente sulla Fonera è saldato un connettore a pettine (strip) “maschio” con i segnali della porta seriale, quindi è possibile fare un lavoro pulito, senza saldare nulla sulla fonera, utilizzando il corrispondente connettore strip “femmina” sull’adattatore che diventa “pluggabile”.. o per meglio dire “innestabile”.
connettore a pettine della seriale adattatore seriale innestato nella fonera
Una volta collegato l’adattore alla seriale del computer, si può utilizzare un emulatore di terminale, per esempio minicom, per dialogare con la scatoletta.
I parametri di comunicazione della seriale sono 9600 baud ,no parity,8 bit,1 bit di stop.. che si può dire anche meglio “9600N81”.
Colleghiamo tutto, accendiamo: otteremo questo.
sequenza di boot fonera fonera collegata al computer tramite cavetto seriale
Ottenuto il controllo del simpatico scatolino via seriale, quello che volevo ottenere era di potervi accedere anche con la mia WI-FI casalinga.
Dato che il grazioso aggeggio è configurato per default come access point, invece a me serviva farlo funzionare da “station”, in modo da farlo connettere a un Access Point già esistente, si sono rese necessarie delle modifiche alla configurazione di default per convincerlo a comportarsi come volevo io.
Come prima cosa attiviamo il server ssh (Dropbear).

$ mv /etc/init.d/dropbear /etc/init.d/S50dropbear

Poi editiamo con vi il file /etc/firewall.user, scommentando queste linee

iptables -t nat -A prerouting_rule -i $WAN -p tcp—dport 22 -j ACCEPT
iptables -A input_rule -i $WAN -p tcp—dport 22 -j ACCEPT

A questo punto disattiviamo gli script che non ci servono

$ cd /etc/init.d
# disabilita heartbeat
$ mv N10conncheck Ex-N10conncheck
# disabilita server http
$ mv S50httpd Ex-S50httpd
# disabilita client fon
$ mv N40thinclient Ex-N40thinclient
# disabilita chillispot
$ mv N50chillispot Ex-N50chillispot
# disabilita settaggio WAN
$ vi S40networks
# commentare la riga "/sbin/ifup wan"
# commentare la riga "/sbin/ifup lan_noinet"
$ cd /etc/crontabs/
$ vi root
# commentare la prima riga (quella che fa partire thinclient) del file root con un #
$ cd /etc
$ mv firewall.fon Ex-firewall.fon

In /etc/init.d, creiamo il file S70station, che conterrà le seguenti righe per far connettere la fonera a un access point ( in questo caso open ).

#!/bin/sh
iptables -t nat -F
wlanconfig ath0 destroy
sleep 1
wlanconfig ath0 create wlandev wifi0 wlanmode sta nosbeacon
sleep 2
# ath0 will connecto to an existing ACCESS POINT
# if there are more than one AP
# try to issue this command before udhcpc
# iwconfig ath0 essid MyWiFiNetwork
#
udhcpc -i ath0

Ricordiamoci di renderlo eseguibile con il comando:

# chmod +x S70station

Restartiamo la Fonera, a questo punto dovremmo essere in grado di accedervi tramite ssh attraverso il nostro Router, come se fosse .. e lo è .. una qualsiasi “Linux Box”.
… E se ci fossimo sbagliati e non funzionasse più niente ? ….. ci sono delle cose che si possono fare per provare a riportare la fonera alla configurazione iniziale.
Leggetevi questo post, dove dice “Unbricking la fonera”.

Ora che la Fonera è finalmente sotto il nostro controllo, cosa ci facciamo ?
Io ho provato ad utilizzare le porte di IO per controllare lo scaldabagno 🙂 … andiamo avanti.

Ricapitolando, la Fonera parla con l’esterno tramite una interfaccia ethernet, una wi-fi, e una seriale.
Il Chipset usato dalla Fonera è l’ Atheros 2315, non sono riuscito a trovare il data sheet completo, comunque da questo “product bullettin” si capisce che il chipset ha integrate delle porte di IO general purpose, chiamate GPIO.
Facendo una ricerca su Internet ho trovato il pin-out delle porte sulla scheda della fonera…una è collegata a un led, le altre sono libere, quindi usabili per qualsiasi scopo.
Come pilotarle ?
Con il driver gpio

$ wget "http://fghhgh.150m.com/kmod-gpio_2.4.33.4-ar531x-1_mips.ipk"
$ ipkg install kmod-gpio_2.4.33.4-ar531x-1_mips.ipk
$ insmod proc_gpio

Attenzione perchè in questo pacchetto il file “/etc/modules.d/80-gpio” contiene il nome del modulo da caricare allo startup errato: questo file dovrebbe contenere solo una linea con dentro “proc_gpio” e non “proc-gpio”.
Per cui dovete modificare questo file se volete che il modulo venga ricaricato all’accensione.

Con il driver gpio, è possibile configurare ogni pin di IO come ingresso o uscita, semplicemente scrivendo rispettivamente 0 oppure 1 nel “proc filesystem” /proc/gpio/<pin>_dir .
Per leggere lo stato del pin <pin> basta leggere /proc/gpio<pin>_in, per scrivere occorre scrivere in /proc/gpio<pin>_out.
Ma cosa significa leggere o scrivere il pin di IO?
Molti lo sapranno di certo, comunque per chi non lo sa, in parole povere:
un piedino di IO è un filo, si, un filo che “esce” da un Circuito Integrato, “leggere” il piedino equivale a leggere la tensione presente sul filo stesso, che, per fare un esempio, può essere applicata collegando il filo al positivo di alimentazione del circuito, oppure a massa.
Il valore che leggiamo non è tuttavia “continuo”, ovvero può essere solo 0 oppure 1, di solito 0 identificava un valore prossimo a 0 volt, 1 un valore maggiore di una certa soglia.
Per cui se colleghiamo il filo a “massa”, leggiamo 0, se lo colleghiamo al positivo (che nella fonera equivale a 3.3 volt), leggiamo 1.
Per “leggere”, il piedino deve essere configurato come “ingresso”, scrivendo 0 in /proc/gpio<pin>_dir.
Scrivere un piedino significa invece l’esatto contrario, “scrivendo” 1, la tensione sul filo sarà prossima a quella di alimentazione, scrivendo 0 prossima a 0 volt.
Ovviamente il piedino deve essere configurato come uscita.
Come prova concettuale, ho collegato un diodo led al piedino 1 del connettore SW1, che corrisponde al pin di I/O #3.
SW1, pin 1 collegato al catodo del diodo led diodo led, anodo collegato al positivo, tramite una resistenza da 560 ohm vista del diodo led montato
Ho collegato il catodo al piedino di I/O e l’anodo al positivo, tramite una resistenza da 560 ohm, per limitare la corrente che deve erogare la porta per accendere il led.
Comunque,

$ echo 1 > /proc/gpio/3_dir
## qui spengo il led
$ echo 1 > /proc/gpio/3_out
## qui accendo il led
$ echo 0 > /proc/gpio/3_out
## qui lo rispengo
$ echo 1 > /proc/gpio/3_out

OK per il led, ma se volessimo accendere veramente lo scaldabagno ?
Oppure, come ho fatto io, pilotare le elettrovalvole dell’impianto di irrigazione ?
C’è da dire che le porte di I/O che escono dai chip erogano pochissima corrente, per cui non ci si possono collegare carichi elevati, la massima corrente erogabile è di solito appena sufficiente per accendere un piccolo diodo led, ed è comunque riportata nel datasheet che nel nostro caso non abbiamo…. quindi meglio essere cauti e chiedere pochissima corrente alla nostra scatolina… si dovesse rompere!
Per pilotare carichi che siano qualcosa di più di un piccolo led, la porta di I/O va disaccoppiata e amplificata.
Disaccoppiamento significa isolare fisicamente la porta dal carico che va a pilotare, amplificazione significa aumento di potenza.
Il disaccoppiamento della porta si realizza con optoisolatori, l’amplificazione con dei circuiti integrati chiamati “buffer”, oppure con dei semplici transistor.
.. Fine della prima puntata…
STAY TUNED, ovvero state sintonizzati, sottoscrivendo magari il feed RSS, nella prossima puntata si parlerà di una piccola scheda di interfaccia con due ingressi e due uscite..

Dimenticavo il disclaimer, nessuno vi obbliga a fare quello che c’è scritto in questo post, se lo fate ve ne assumete la responsabilità, in altre parole….. se vi si scassa la Fonera sono affari solo vostri. 🙂

Riferimenti: