Archives du blog

Passer un Arduino en wifi avec un WR703N

Le problème dans un appartement c’est bien souvent de faire passer des câbles et je trouve les shields réseau pour Arduino horriblement couteux. Rien que le shield ethernet coute une trentaine d’euro, et le wifi, si mes souvenirs sont bons est au moins une cinquantaine.

Possédant un WR703N qui allie le wifi et l’ethernet pour un prixé dérisoire, j’avais déjà pris le pari dans les articles précédents de lire les données de l’arduino depuis celui-ci. La connexion était en filaire, j’ai un peu cherché dans différents tutoriels pour activer le  mode client en WPA sur openwrt.

J’ai failli m’arreter sur celui-ci , utilisant wpa_supplicant, mais il n’est pas intégré aux outils de configuration d’OpenWRT ce que je trouvais dommage.

Apres quelques tâtonnements j’ai trouvé la configuration suivante :

  • /etc/config/network
config interface 'wan'
 option ifname 'wlan0'
 option 'proto' 'static'
 option 'ipaddr' '192.168.2.99'
 option 'netmask' '255.255.255.0'
  • /etc/config/wireless
config wifi-iface
 option device 'radio0'
 option mode 'sta'
 option ssid 'ssid de votre réseau Wifi'
 option encryption 'psk'
 option key 'mot de passe du wifi'

Il suffit alors de rebooter ou tout simplement de lancer la commande

wifi up

Reste à le passer en mode dhcp pour coller à la topologie du réseau de la maison, mais l’essentiel est fait.

Actuellement je mesure 0.5W en consommation pour l’Arduino (avec le programmes d’acquisition des températures et de la luminosité) et le WR70N avec Wifi et LAN activé. Je serais curieux de comparer avec un shield wifi, si quelqu’un à l’info …

D’ailleurs je cherche un câble USB « court » A mâle vers B mâle pour alimenter l’arduino depuis le WR703N, le plus court que j’ai fait son mètre et c’est un peu ridicule pour relier deux petites machines qui sont cote a cote. Alors si quelqu’un sait ou s’en procurer des pas cher (ou des connecteurs USB pas cher pour faire un câblage maison …)

EDIT : A lire la procédure de Andy Brown qui part dans le même sens que moi, mais à une autre approche que moi pour la lecture des données venant de l’arduino (je l’avais détaillée ). Comme on dit en perl : tmtowtdi.

1 seul SSID sur un Access Point ? C’est dépassé ! Scotty, energize

Je suis tombé sur ce tutoriel qui semble créer un second point d’accès sur une même carte wifi , WTF ?!?! Je croyais que ce genre de choses risquais de distendre la nature même du continuum espace temps. Ok j’ai abusé de Doctor Who ça doit être pour ça.

Bon on tente alors ?

Le but est d’avoir sur une même machine

  • un réseau sécurisé qui donne accès à internet via la passerelle et au réseau local
  • ET un réseau pas sûr du tout, ouvert même, qui donne accès a un site web local, genre piratebox, accès http pour arduino, …

Donc voici le contenu de nos désormais célèbres fichiers de config

  • /etc/config/network
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'

config interface 'lan'
option ifname 'eth0'
option type 'bridge'
option proto 'static'
option ipaddr '192.168.2.1'
option netmask '255.255.255.0'
option gateway '192.168.2.3'
list dns '192.168.2.1'
list dns '8.8.8.8'
list dns '8.8.4.4'

config interface 'wan'
option ifname 'wlan0'
option 'proto' 'static'
option 'ipaddr' '192.168.3.1'
option 'netmask' '255.255.255.0'

config interface 'guest'
option 'proto' 'static'
option 'ipaddr' '10.0.0.1'
option 'netmask' '255.255.255.0'

Je ne comprends pas l’absence de ligne interface mais ça marche sans, il me créé un wlan0-1 (et pourquoi pas un eth0-1 ou un lo-1 ???)

  • /etc/network/wireless
config wifi-device 'radio0'
option type 'mac80211'
option channel 11
option macaddr '14:e6:e4:a7:09:d2'
option hwmode '11ng'
option htmode 'HT20'
list ht_capab 'SHORT-GI-20'
list ht_capab 'SHORT-GI-40'
list ht_capab 'RX-STBC1'
list ht_capab 'DSSS_CCK-40'
option disabled '0'

config wifi-iface
option device 'radio0'
option network 'wan'
option mode 'ap'
option 'ssid' 'Hot Sec'
option encryption 'psk2'
option key 'JeSuisUnMotDePasseWPA2'

config wifi-iface
option device 'radio0'
option network 'guest'
option mode 'ap'
option 'ssid' 'Public Box'
option encryption 'none'

à noter que ce genre de config ne semble pas aimer le WEP, quand j’ai essayé de mettre WEP comme mode d’encryption il m’a jeté, donc on abaisse les boucliers et ça roule.

  • /etc/config/dhcp
config dnsmasq
option domainneeded '1'
option boguspriv '1'
option filterwin2k '0'
option localise_queries '1'
option rebind_protection '1'
option rebind_localhost '1'
option local '/lan/'
option domain 'lan'
option expandhosts '1'
option nonegcache '0'
# option authoritative '1'
option readethers '1'
option leasefile '/tmp/dhcp.leases'
option resolvfile '/tmp/resolv.conf.auto'

config dhcp 'wan'
option interface 'wan'
option start '200'
option limit '225'
option leasetime '12h'

config dhcp 'guest'
option interface 'guest'
option start '200'
option limit '225'
option leasetime '12h'
  • /etc/config/firewall

Juste une petite zone de plus

config zone
option name guest
option network 'guest'
option input REJECT
option output ACCEPT
option forward REJECT

config rule

option name Allow-DHCP
option src guest
option proto udp
option dest_port 67-68
option src_port 67-68
option target ACCEPT

C’est encore un work in progress, pour le moment pas encore de serveur Web, donc rien de fonctionnel. Donc pour le moment les clients se connectent, reçoivent une ip via DHCP et … c’est tout.

Un petit coup d’opkg install uhttp et un mini index.html dans /www devraient faire l’affaire pour un service web minimal.

Il me reste a faire une redirection automatique de tout requête HTTP/HTTPS vers le serveur web qui sera hébergé.

dans le fichier firewall,

config redirect                       
        option 'proto' 'tcp'          
        option '_name' 'Website'      
        option 'src' 'guest'               
        option 'src_dport' '80'  
        option 'dest_ip' '10.0.0.1'
        option 'dest_port' '80'

config rule                                                 
        option proto tcp                   
        option dest_port 80                     
        option src      guest                   
        option target ACCEPT

Le problème est que notre petit serveur web génère des messages « File Not Found » que j’ai mis du temps à comprendre. En fait cela marchait en tapant http://www.google.fr depuis mon client mais pas en faisant un http://www.google.fr/search…
Alors une idée ?
C’est tout simple mon serveur web cherchait une page /search et comme c’est un uhttpd assez basique il ne renvoi pas de page 404 « lisible ».
Donc solution : générer une page pour le cas 404 Not Found qui fasse un redirect vers la base du site, un truc qui encapsule ce genre de tag en somme :

meta http-equiv="refresh" content="0; url=http://10.0.0.1/"

Il faut donc aussi modifier le fichier de config de uhttpd pour prendre en compte cette page 404 :

option error_page       /404.html

OpenWrt comme AP Wifi en WPA

Je ne sais pas si je l’ai déjà dis, mais j’adore openwrt 😉

J’ai un réseau en 192.168.2.X et par un malencontreux coup du sort je suis contraint d’utiliser une carte wifi du serveur pour accéder au Grand Ternet. Je n’ai plus de wifi résidentiel donc la tablette fait la grise mine (plus d’accès au NAS 😦 )

Bref, ce soir j’ai parametré openwrt en AP WPA en suivant cette procédure, claire, concise, efficace …

  • /etc/config/network
config interface 'lan'
option ifname 'eth0'
option type 'bridge'
option proto 'static'
option ipaddr '192.168.2.1'
option netmask '255.255.255.0'
option gateway '192.168.2.3'
list dns '192.168.2.1'
list dns '8.8.8.8'
list dns '8.8.4.4'

config interface 'wan'
option ifname 'wlan0'
option 'proto' 'static'
option 'ipaddr' '192.168.3.1'
option 'netmask' '255.255.255.0'
  • /etc/config/wireless
config wifi-device 'radio0'
option type 'mac80211'
option channel 11
option macaddr '14:e6:e4:a7:09:d2'
option hwmode '11ng'
option htmode 'HT20'
list ht_capab 'SHORT-GI-20'
list ht_capab 'SHORT-GI-40'
list ht_capab 'RX-STBC1'
list ht_capab 'DSSS_CCK-40'
option disabled '0'

config wifi-iface
option device 'radio0'
option network 'wan'
option mode 'ap'
option 'ssid' 'nom du reseau'
option encryption 'psk2'
option key 'CestlaclefWPAsupersecrete'
  • /etc/config/firewall

config zone
option name lan
option network ‘lan’
option input ACCEPT
option output ACCEPT
option forward REJECT
option masq 1

config zone
option name wan
option network ‘wan’
option input ACCEPT
option output ACCEPT
option forward REJECT
option masq 1
option mtu_fix 1

config forwarding
option src wan
option dest lan

config forwarding
option src lan
option dest wan

  • /etc/config/dhcp
config dhcp 'wan'
option interface 'wan'
option start '200'
option limit '225'
option leasetime '12h'

Coté serveur linux j’ai eu la commande suivante à passer pour accéder aux machines de l’autre subnet

route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.2.1 eth2

et le ping passe dans les deux sens, c’est déjà pas mal.

Reste à trouver comment faire fonctionner le discover DNLA depuis le subnet en 192.168.3.xx

TODO : j’ai entendu parler d’un igmpproxy qui semblerait correspondre … a faire

Cross compilation pour openwrt

Bon, j’ai un petit programme C qui lit depuis l’USB des données que crache l’arduino et j’aimerais bien le mettre sur mon wr703n.

Pour ça un peu de cross compilation me parait souhaitable, je n’imagine pas coller gcc sur une machine avec 1,5 Mo de Filesytem ^^.

Je retourne dans mon environnement de développement (j’en avais parlé  ) et … bon, ok quelles options faut-il passer à gcc ?

Heureusement que google est mon ami (pour le moment du moins) des gens bien écrivent des howto pour compiler des programmes sur OpenWRT.

Donc après la création de l’arborescence dans package et l’ajout de mon programme dans les packages du .config (en tout et pour tout rajouter un CONFIG_PACKAGE_log-avr=m dans le .config), il est le temps de faire un make.

Le temps de prendre sa douche et voilà, un log-avr tout chaud !
staging_dir/target-mips_r2_uClibc-0.9.33/root-ar71xx/bin/log-avr fait 6857 octets (à comparer avec les 17331 octets sur ma machine linux, faudra que je reprennes des options d’optimisation ^^).

On le copie sur le wr703 … on le lance  et …


1025,613,** capteur 1-wire present avec code adresse 64 bits : **
1025,618,** 28 80 F9 A7 03 00 00 6A Capteur temperature DS18B20.CRC OK **
1025,622,** 28 68 22 A8 03 00 00 56 Capteur temperature DS18B20.CRC OK **
1025,630,** 28 26 EF BB 03 00 00 4E Capteur temperature DS18B20.CRC OK **
1025,634,** 28 BD C6 BB 03 00 00 0C Capteur temperature DS18B20.CRC OK **
1025,642,** 28 93 FA A7 03 00 00 26 Capteur temperature DS18B20.CRC OK **
1025,646,***** fin de la recherche des capteurs *****
1060,599,D30001,485,204,24.19,24.50,24.25,21.44,23.87
1090,572,D60001,485,205,24.25,24.56,24.31,21.44,23.87
1120,549,D90001,484,203,24.31,24.56,24.37,21.44,23.87

ben ça marche … étonnant non ?

PS : Pour les curieux il s’agit des résultats de mesures de 2 photorésistances et de 5 capteurs de températures répartis dans le bureau.

Un arduino en mode "Shelob"

Comment transformer un arduino en araignée pleine de pattes.
Bon ... cinq capteurs de températures et deux de lumières ça fait des fils quand même ^^

WR703N et Arduino

Une de mes marottes de ces derniers mois a été de jouer avec un arduino Uno, tient essayons de les faire causer ensemble …

Premier branchement du câble USB, pas de /dev/ttyACM0 en vue, ça part mal !

Après moult tests j’ai enfin réussi, il manquait « juste » le module noyau cdc-acm.

Ça parait simple comme ça mais j’ai du recompiler openwrt pour l’avoir ce module. Et vu la procédure d’installation de la piratebox que j’ai suivi je joue avec une version « bleeding-Edge » de  la bestiole.

Vu que c’est encore frais dans ma tête voila les étapes que j’ai suivi :

Installation d’une version de dev d’openwrt, j’ai juste du utiliser une version antérieure pour correspondre à ce que j’avais installé (r31214 pour les curieux).

Dans le make menuconfig j’ai coché les options suivantes :

  • Target System (Atheros AR7xxx/AR9xxx)
  • Target Profile (TP-LINK TL-WR703N)
  • Kernel modules > USB Support >  kmod-usb-acm (en module)

On sort et on enregistre tout ça, et piouf, il est l’heure de faire un make (ça faisait des années que je n’avais pas recompilé un kernel linux ça me rajeuni).

Suffit juste le ./staging_dir/target-mips_r2_uClibc-0.9.33/root-ar71xx/lib/modules/3.2.13/cdc-acm.ko généré et de le mettre dans /overlay/lib/modules/3.2.13 sur la piratebox.

Bon ça marche pas encore j’ai dû aussi rajouter un fichier dans /overlay/etc/modules.d contenant « cdc-acm » et un lien vers celui-ci depuis /overlay/etc/modules-boot.d/.

Et là après un petit boot … /dev/ttyACM0 est là, youhou !!

Une autre solution semblait de reprendre le boulot que d’autres ont fait mais cela me forçait à reflasher le WR703 et à perdre ce que j’ai pu faire dessus. Mais ce serait surement une solution plus élégante que d’avoir tout dans une seule et même image sans devoir rajouter des morceaux. Bon on verra plus tard ( j’ai commandé une seconde piratebox alors on verra pour lui réserver cette solution)