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.
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”.
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.
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.
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:
Stai leggendo “ Esperimenti con la Fonera ”, un post di Fabrizio Zellini
- Pubblicato il
- 23 Aprile 2007 //php the_time('G:i') ?>
- Categorie:
- fonera
20 Commenti
commenta | feed commenti [?] | trackback uri [?]