Fonera with OpenWrt – Python & Gpio powered.

27Lug07

Oggi, durante la mia vacanza da Dak ho deciso, nonostante le prove già fatte senza successo, di far funzionare Python sulla mia Fonera riscutendo grande successo, ed ho quindi deciso di riassumervi tutti i passi che mi hanno portato da qualche mese fa fino ad oggi a completare questa procedura.

La Fonera è un piccolo router che possiede wireless integrato, connettore ethernet e porte di espansione chiamate GPIO. In realtà bisognerebbe chiamarlo Atheros, dato che quello è il nome della marca che lo produce, ma viene chiamato così poichè viene commercializzato in una versione di una società “Fon”. In poche parole questa società “Fon” vuole rendere internet libero e displnibile ovunque, e ha quindi diffuso degli access point chiamati “Fonera” che collegati alla rete di casa permettono di condividerla via wireless a chi è iscritto a Fon. Una specie di club di condivisione internet mondiale, infatti è possibile vedere su una mappa dedicata la posizione dell’ access point Fonera disponibile per la connessione più vicino a casa.

Questi access point in realtà nascondono una grande potenzialità: sono piccoli,veloci, espanbili, potenti sul wireless e molto economici. Si, infatti un fonera può costare solo 20€/$ compresa spedizione con appositi buoni che vengono dati per la prima registrazione, altrimenti costerebbe 35€ spedizione esclusa; prezzo comunque molto basso per un access point. Inoltre questi access point hanno una scheda madre embedded con un processore da 300mhtz , 16 mb di ram(espandibile con un hack) e 8 mb di memoria flash integrata.

Ovviamente siamo hackers e di certo se troviamo una meraviglia tecnologica così economica ci affrettiamo a comprarla, così io e dak la abbiamo comprata, in tempi e modi separati ma alla fine la abbiamo tutti e due. Il passo successivo è stato prendere il controllo a basso livello del router e successivamente l’installazione di OpenWrt Kamikaze 7.06 per Atheros tramite questa guida .

Una volta con linux che gira e può essere controllato sul nostro fonera possiamo lavorare un po’.
Come secondo passo abbiamo potenziato il wireless aggiungendo queste righe in /etc/sysctl.conf

dev.wifi0.diversity=0

dev.wifi0.rxantenna=1

dev.wifi0.txantenna=1



dev.wifi0.ctstimeout = 25



dev.wifi0.acktimeout = 25



dev.wifi0.slottime = 11

In questo modo si aumenta abbastanza la portata del segnale.
Successivamente abbiamo pensato di portare il wireless in modalità client al posto di utilizzarlo in modalità access point, in modo da poter usare la fonera per scannare e collegarci a reti wireless, per farlo abbiamo modificato in /etc/config/wireless

option mode     ap

in

option mode     sta

Ora però ci sentivamo senza la possibilità di agire su questo graal tecnologico, quindi avevamo inizialmente pensato e provato che non era possibile mettere python sulla fonera senza una memoria esterna. Siamo giunti a ciò poichè la memoria da 8 mb della fonera resta libera di 5 mb dopo l’installazione di linux e ci troviamo quindi con 5 mb su cui dover mettere python, allora avevamo pensato inizialmente che fosse impossibile dato che la versione completa di python 2.3 occupa circa 35 mb, senza contare che andrebbe estratta. Successivamente abbiamo rivalutato la cosa vedendo che esisteva una versione da circa 4 mb, che forse poteva starci, però non avremmo avuto lo spazio per estrarre l’archivio, allora abbiamo visto che forse era possibile spostare l’archivio nella ram ed estrarlo, e solo successivamente mettere i file binari sul fonera. Nonostante questa intuizione sono state tante le prove ma nessuno il risultato, alla fine abbiamo pensato di collegarci un con filesystem ssh a un pc con decisamente molto spazio e provare a installare l’archivio da lì, però questa possibilità non ha funzionato. A questo punto io avevo deciso di abbandonare tutti questi hack mettendo una memoria esterna MMC da 256 mb e collegandola ai pin di espansione appositi sulla scheda, ma dopo varie prove e varie schede ho visto che senza avere una scheda sicuramente funzionante e un driver già testato e fili perfettamente saldati è un po’ difficile far funzionare la memoria. Quando ormai avevo abbandonato le speranze Dak ha riprovato a mettere l’archivio nella ram senza successo e ha avuto l’intuizione di provare a estrarre il file binario dell’ interprete python dall’ archivio e a metterlo nella cartella /usr/bin/. Per farlo però non potevamo utilizzare nessun programma di estrazione su linux, quindi abbiamo prima di tutto trasferito l’ archivio dal pc nella cartella tmp del fonera(che in realtà risiede nella ram) con scp e poi abbiamo impostato ipkg, installatore di archivi di quel tipo, in modo che mettesse i file temporanei nella cartella principale  “/” con la opzione -t . Dopo qualche minuto abbiamo bloccato il processo e siamo andati nella cartella principale, dove si era formata una cartella ipkg-numerorandom che al suo interno conteneva  il file binario dell’ interprete di python. Lo abbiamo trasferto quindi in /usr/bin/ e abbiamo provato ad avviarlo ma abbiamo avuto qualche problema di librerie mancanti, nonostante non ne avessimo importate, abbiamo dunque creato una cartella /usr/lib/python2.5 (da chiamare in questo modo anche se si mette il binario di python 2.3 o 2.4) e abbiamo inserito i file mancanti. Finalmente abbiamo avuto il nostro interprete funzionante con tutti i comandi di base(split print open ecc). Successivamente, visto il grande successo, abbiamo pensato di mettere qualche libreria (solo lo stretto necessario per non occupare spazio). Alcune librerie possono essere installare semplicemente copiandone la cartella o il file relativo dalla relativa cartella nell’ archivio , altre necessitano anche di file compilati , ad esempio per abilitare la libreria socket è necessario copiare il file socket.py nella directory principale delle librerie , ma anche _socket.so dalla cartella dei file compliati chiamata lib-dynload nella gemella sul fonera. Noi abbiamo copiato i file dalla cartella di python del nostro computer.
Una volta installate e provate alcune librerie principali(sys,os, socket, thread) abbiamo provato a fare un rudimentale programma di scanning delle reti wireless servendoci di iwlist tramite la libreria os. Questo programma memorizzava semplicemente in un file di log i nomi delle reti.
Successivamente abbiamo pensato che oltre alla possibilità di usare il nostro fonera “dall’ interno” dobbiamo anche avere qualche segnale del suo funzionamento o una sua interazione con l’esterno, e ci è sembrato quindi necessario abilitare le porte GPIO. Le porte Gpio non sono altro che dei punti riempiti di stagno sulla scheda messi in vari punti, ai quali è possibile collegare qualche periferica in input o output, solitamente in analogico(per il seriale si usa logicamente la porta seriale che c’è, anche se non in forma classica, ed è separata dalle porte gpio). Abbiamo quindi cercato invano di installare un programma, che avremmo poi controllato tramite os da python per controllare le porte gpio. Infatti abbiamo scoperto che il programma che cercavamo non funzionava con la fonera, quindi dopo un pomeriggio passato a chiedere e cercare abbiamo trovato questo modulo che una volta dato in pasto a insmod crea in /proc/ una cartella “gpio” al cui interno crea 3 file per ogni porta gpio, uno di input, uno di output e uno chiamato “dir” di cui ignoro lo scopo.
Però siamo venuti a conoscenza di una sconcertante verità: una volta riavviato tutto la cartella scompare e il modulo non è + caricato, questa doveva essere una cosa ovvia per qualcuno un minimo esperto di linux. Infatti era necessario copiare il modulo in /lib/modules/%versione del kernel%/ e successivamente aggiungerre in /etc/modules.d/ un file del tipo Numero-nome contentente solo il nome del modulo, senza estensione, in questo modo si avrà il modulo caricato all’ avvio.
Come colpo finale abbiamo scoperto questa mappa di dove si trovano tutti i pin gpio, e abbiamo letto che un pin gpio è un led del fonera, il che significa che attivando quel pin si accende la luce del led.
Abbiamo dunque deciso di sfruttare questa possibilità per segnale la scoperta di una rete wireless, facendo accendere per un secondo la luce tramite il comando

echo 1 > /proc/gpio/2_dir; echo 1 > /proc/gpio/2_out

e per sepgnerlo

echo 0 > /proc/gpio/2_dir; echo 0 > /proc/gpio/2_out

Ovviamente poi scritto in python con un delay.

Possiamo quindi ritenerci ufficialmente soddisfatti e sognare futuri sviluppi robotici e/o sistemistici, domotici.

Ci tenevo a fare questo post, soprattuto dopo che:
-Mi hanno detto che non era possibile mettere senza mmc card python sul fonera e che era anche inutile
-Mi hanno detto che non esisteva driver per le porte gpio sul fonera controllate da shell

E quindi, ricordando che sto sempre lavorando alla stesura di un libro di etica hacker, è stato un hack poichè ho affrontato uan sfida intellettuale proposta da me stesso e incitata da altre persone, conclusa con successo. 😀

Annunci


4 Responses to “Fonera with OpenWrt – Python & Gpio powered.”

  1. 1 tyrion

    Ottimo lavoro!

  2. 2 k8

    bravi

  3. Per approfondire su gpio e fonera leggetevi anche questi miei post.
    http://daubau.it/log/su/fonera
    Ciao,
    Fabrizio


  1. 1 $anchor$basketball Betting,final Four,final Four Betting,final Four Gambling,final Four Sports Book,final Four Sportsbook,march Madness,march Madness Betting,march Madness Gambling,march Madness Sports Book,march Madness Sportsbook,ncaa,ncaa Betting,ncaa

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...


%d blogger hanno fatto clic su Mi Piace per questo: