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
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 !):
$ 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 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
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
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 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:
{
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:
# 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.