Test de OpenWrt avec des modules USB Yoctopuce

Test de OpenWrt avec des modules USB Yoctopuce

Savez-vous quelle est la machine la plus petite et la moins chère qui dispose de réseau Ethernet et de réseau WiFi, et sur laquelle on peut brancher des capteurs et des actuateurs Yoctopuce ? Ce n'est ni le Raspberry Pi, ni le BeagleBone. C'est une machine encore plus petite, vendue avec un boîtier et une alimentation, disponible en grande surface dès $35: Le TP-Link MR3020. Quand on le sort du carton, ce n'est qu'un simple Access Point de voyage. Mais en quelques clicks, vous pouvez installer OpenWrt et de nouvelles possibilités s'ouvrent...


Le petit routeur Ethernet-Wifi TP-Link MR3020 peut héberger des modules Yoctopuce grâce à OpenWrt
Le petit routeur Ethernet-Wifi TP-Link MR3020 peut héberger des modules Yoctopuce grâce à OpenWrt



L'installation de OpenWrt sur le MR3020 est à la portée de tous: la page de documentation est de OpenWrt est très détaillée. Rien à recompiler, vous chargez simplement le firmware OpenWrt pour le MR3020, et vous faites une "mise à jour" de firmware avec l'interface standard du MR3020. Après redémarrage, le MR3020 prend une adresse IP par DHCP, et vous pouvez le configurer par l'interface Web de OpenWrt (puis vous connecter dessus par SSH).

Installation des outils Yoctopuce

Dorénavant, les outils Yoctopuce sont disponibles pour la plate-forme MIPS utilisée par le MR3020. Les commandes suivantes (lancées sur n'importe quelle machine UNIX) vous permettront de copier le VirtualHub et le script de démarrage automatique sur votre MR3020 (utilisez la bonne adresse IP pour votre MR3020 of course !):

$ wget http://www.yoctopuce.com/FR/downloads/VirtualHub.linux.16041.zip
$ unzip VirtualHub.linux.16041.zip
$ scp mips/VirtualHub root@192.168.0.254:/usr/sbin/VirtualHub
$ scp startup_script/yvirtualhub.openwrt root@192.168.0.254:/etc/init.d/yvirtualhub


Ensuite, connectez-vous par SSH sur votre MR3020 et lancez les commandes suivantes:

# opkg update
# opkg install libusb-1.0
# /etc/init.d/yvirtualhub enable
# /etc/init.d/yvirtualhub start


C'est tout. Vous pouvez maintenant brancher des modules Yoctopuce, et vous connecter à distance sur le port 4444 du MR3020 pour lire la valeur de capteurs ou piloter des relais. Le service VirtualHub de Yoctopuce démarrera automatiquement si vous relancez la machine. Contrairement d'autres machines bon marché, le MR3020 est capable d'alimenter correctement plusieurs modules Yoctopuce à travers un hub USB. Evitez par contre les câbles USB trop longs.

Le MR3020 alimente correctement plusieurs modules Yoctopuce à travers un hub USB
Le MR3020 alimente correctement plusieurs modules Yoctopuce à travers un hub USB



Applications

L'installation d'un simple VirtualHub peut suffire pour les applications qui utilisent les capteurs à distance, par exemple depuis une app Android ou par callback HTTP vers un service de Cloud. On peut imaginer par exemple utiliser cette machine comme point d'accès WiFi, capable en plus

  • de commuter l'alimentation d'un autre appareil dans la pièce
  • de surveiller la température et l'humidité
  • de surveiller la qualité de l'air
  • etc.

Mais on peut aussi profiter d'avoir une machine capable d'exécuter un programme personnalisé pour y installer un peu de logique. A titre d'exemple, nous vous proposons de d'ajouter au MR3020 la possibilité de travailler comme point d'accès "à la demande", pour fournir un code d'accès temporaire pour visiteurs dans une salle de conférence. Le point d'accès WiFi est désactivé en temps normal (pour des raisons de sécurité), mais à la pression d'un bouton, il est mis en service pour une heure avec un nouveau mot de passe WPA2 choisi aléatoirement et affiché sur un petit écran ad-hoc.

Un point d'accès WiFi qui se reconfigure à la demande
Un point d'accès WiFi qui se reconfigure à la demande



Pour cette application, il n'y a besoin que d'un MR3020 et d'un Yocto-MaxiDisplay (ou Yocto-Display). Le bouton est câblé sur l'une des entrées analogiques du display, et le display est branché par USB sur le MR3020.

Le schema de notre hotspot WiFi à la demande
Le schema de notre hotspot WiFi à la demande



Le programme est écrit en C++, car Python n'est pas disponible directement sur le MR3020. La logique est simple: on configure la libraire Yoctopuce pour utiliser les modules par USB, et appeler un callback lorsque le bouton est pressé. Dans le callback, on récrit le fichier de configuration du point d'accès WiFi et on l'active. Le point d'accès est ensuite automatiquement désactivé après 1h. Voici un extrait du code:

int main(int argc, const char * argv[])
{
    string      errmsg;
    if(YAPI::RegisterHub("usb", errmsg) != YAPI_SUCCESS) {
        cerr << "RegisterHub error: " << errmsg << endl;
        return 1;
    }
    YAPI::RegisterDeviceArrivalCallback(deviceArrival);
    YAPI::RegisterDeviceRemovalCallback(deviceRemoval);

    while (true) {
        YAPI::UpdateDeviceList(errmsg);
        YAPI::Sleep(1000, errmsg);
        if (IsWifiUp) {
            if (time(NULL) > PasswordExpiration ) {
                system("wifi down");
                IsWifiUp=0;
                showMessage(WELCOME_MSG);
            }
        }
    }
}

static void anButtonValueChangeCallBack(YAnButton *bt, const string& value)
{
    if (!bt->get_isPressed()) return;
    if (!IsWifiUp) {
        showMessage(STARTING_MSG);
        generatePasswd(SecretKey);
        if (startWifi(SecretKey) < 0) {
            showMessage("unable to start WiFi");
            return;
        }
        showMessage(HOTSPOT_MSG);
        IsWifiUp = 1;
    }
    PasswordExpiration = time(NULL) + PASSWORD_EXPIRATION;
}



Contrairement à un Raspberry Pi ou un BeagleBone, le MR3020 ne dispose pas d'assez d'espace disque pour lancer directement un compilateur. Vous devez donc installer l'environnement de cross-compilation OpenWrt sur une machine Unix, comme décrit ici, et compiler le programme sur cette machine Unix, avant de le copier par scp vers le MR3020.

Dernière étape: avant de lancer un programme C++, il faut installer la librairie C++ sur le MR3020. Comme il y a très peu d'espace libre sur la flash du MR3020, vous devrez effacer le VirtualHub pour y installer la librairie C++ à la place:

# rm /usr/sbin/VirtualHub
# opkg install libstdcpp



Vous trouverez le code complet de cette application sur GitHub. Et voilà le résultat:

  



Ces premiers tests de OpenWrt sur le MR3020 sont très concluants, et contrairement à beaucoup d'autres machines bon marché, celle-là semble tenir ses promesses. On regrettera juste le peu d'espace flash disponible, qui oblige à faire des choix.

Commenter 8 commentaires Retour au blog



1 - ituilerie Vendredi 09 mai 2014 9H31

Super Tuto, que j'essaye de mettre en pratique
La mise a jour c'est bien passé, super facile aucun souci
par contre au moment de decompresser l'archive avec la commande
unzip VirtualHub.linux.16040.zip
j'obtient le message
-ash: unzip: not found

Avez vous une idée pour resoudre le probleme
Merci

2 - ituilerie Vendredi 09 mai 2014 13H55

JE revient sur mon probleme, il semble que le package ne soit pas installé a l'origine

J'ai proceder a une nouvelle installation de OpenWrt pour voir ce que sa donne
Lorsque l'install est faite il ne reste que 876 Ko de dispo

Le package de virtual hub faisant 1.4 mo il est pas possible de l'installer ainsi, je pense qu'il y a des trucs a supprimer a l'interieur du zip (on a besoin que de la version mips ? et les readme ne sont pas forcement utile ?)

3 - mvuilleu (Yocto-Team)Vendredi 09 mai 2014 13H58

@ituilerie: Ah, je comprends maintenant votre problème: vous lancez la commande de download et d'unzip directement sur le MR3020. En fait il faut les lancer sur n'importe quelle autre machine UNIX ayant un peu de place sur le disque. C'est pour cela que la dernière commande est le 'scp' qui copie juste le binaire du VirtualHub sur le MR3020.

4 - ituilerie Vendredi 09 mai 2014 14H37

Le support de YoctoPuce ma rapidement aider a résoudre le problème
Le premier bloc de commande est a executer en local, ne pas ce connecter en SSH au MR3020 pour l'executer

5 - ituilerie Samedi 07 juin 2014 23H21

Quelqu'un a t'il réussit a l'utiliser avec la liaison wifi ?

Il fonctionne tres bien connecté en filaire a mon réseau, mais je n'arrive pas a le connecter en wifi

6 - ituilerie Dimanche 06 mai 2018 22H40

Bonjour
Je suis en train de remettre en route un nouveau MR3020, mais il semble que la version de OpenWRT qui soit disponible aujourd'hui prenne plus de taille, c'est ce que j'en deduit en relisant les commentaire (la version de 2014 laissait plus de 800Ko de libre, aujourd'hui, il y en a a peine 300, peut ton supprimer des choses dans Open WRT ou quelqu'un a t'il une vieille version
Merci

7 - ituilerie Dimanche 06 mai 2018 23H19

En fait si l'on remonte avec les URLs, on retrouve toute les version de OpenWRT pour le MR3020
donc vous pouvez recupérer la version qui va bien a cette adresse
https://archive.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/openwrt-ar71xx-generic-tl-mr3020-v1-squashfs-factory.bin

Il y en a peut etre d'autres qui fonctionnent elle aussi

8 - ituilerie Lundi 07 mai 2018 14H53

Quelqu'un a tenter avec un TL-WR810N il semble compatible OPENWRT mais surtout l'alim est intégré et il est du format a mettre directement sur la prise électrique
J'ai bien envie d'essayer pour mes prochains modules Yoctopuce

Yoctopuce, get your stuff connected.