Dans ma quête de réalisation d’une base me permettant de connecter l’ensemble de mes futurs objets connectés, je suis parvenu à une solution flexible et très pratique. On va parler ici de deux services que je vais utiliser sur Raspberry Pi : Mosquitto et Node-RED. Ces deux applications nous permettrons de rediriger les flux de données venant de nos objets connectés afin de les archiver et/ou traiter. Voyons ça ensemble…

Devenons architecte de nos données avec Node-Red

Derrière ce très beau titre (#seLanceDesFleurs !), se cache une réelle interrogation. Comment maintenir un système permettant d’interroger n’importe quel objet connecté, peu importe son moyen de communication ? La réponse à cela se nomme Node-RED. Installé par défaut dans les dernières distributions Raspbian sur Raspberry Pi, Node-RED est un logiciel capable de réaliser des flux de données. En effet, lorsqu’une information arrive sur le Raspberry Pi, que ce soit via les ports GPIO, un programme en Python, le port série, le port USB, le Cloud, les réseaux sociaux ou un paquet transmis en Ethernet ou WiFi… Node-RED sera en mesure de capter cette information !

Le petit + sympa avec Node-RED, c’est son interface web graphique. On représente les flux de données par des nœuds et des liens. Les nœuds définissent les opérations à effectuer. En règle générale, il y a 4 type d’opérations : fonction, input, output, input/output. Les liens relient les nœuds entre eux. C’est ce qui nous permet de construire nos différents flux de données.

L'interface de Node-RED. A gauche, les noeuds disponibles. Au centre, les flux de données. A droite, menu de configuration ou debug.

L’interface de Node-RED. A gauche, les nœuds disponibles. Au centre, les flux de données. A droite, menu de configuration ou debug.

Une fois l’information acquise, on peut la décortiquer, via de nombreuses fonctions présentes dans le moteur Node-RED. Prenons l’exemple d’un capteur envoyant une requête http à notre Raspberry Pi, avec comme variables temperature, humidite et pression. Une fois la requête reçue, on aura prévu de découper cette information afin d’obtenir la valeur des 3 variables séparément. Ensuite, on peut stocker ces 3 valeurs dans 3 bases de données différentes (soyons fous ^^).

Un petit exemple simple de ce qu'on peut faire sous Node-RED.

Un petit exemple simple de ce qu’on peut faire sous Node-RED. On peut même y ajouter des commentaires 🙂

Pour les plus grands maniaques d’entre nous, on peut aller encore plus loin ! Dès que les 3 données sont archivées, chaque base de données notifie Node-RED que l’opération s’est bien passé. Si toute l’opération s’est bien déroulée, on envoie un acquittement à notre capteur et ce dernier peut se mettre en veille. En cas de non acquittement, le capteur pourrait réitérer l’opération plusieurs fois, avant de signaler à Node-RED qu’il y a un problème. Ce dernier pourra directement notifier le développeur par mail. Magique non ?

Node-RED peut devenir très vite un tas de nœuds assez complexe !

Node-RED peut devenir très vite un tas de nœuds assez complexe !

En bref, les possibilités avec Node-RED sont quasi-infinies. D’autant plus que Node-RED propose une bibliothèque de nœuds et de flux de données prêt à l’emploi à télécharger. A l’heure où j’écris ces lignes, leur bibliothèque en ligne compte 1189 nœuds à télécharger. On y retrouve de nombreux nœuds permettant une connexion aux bases de données (Graphite, InfluxDB, SQL…), faire des requêtes Web (multi-http, https…), réaliser des commandes SSH et lire des protocoles domestiques (Z-wave, MySensors, Amazon Alexa, Google Home…) ou industriels (ModBus, Siemens, Watson IOT…).

Les personnes qui ont lu cet article ont aussi lu :  Réaliser son environnement de développement C++ pour Raspberry Pi [PARTIE 3/3]

Et Mosquitto dans tout ça ?

Ah… On se croirait presque en terrasse sur les côtes Espagnol ! *rêve* Et d’un coup… Mosquito ! Mosquito ! Mosquito !

Mosquito ! Mosquito ! Mosquito !

Mosquito ! Mosquito ! Mosquito !

Malheureusement, ici je parle bien de Mosquitto avec 2 “T” comme MQTT ! Et derrière cet acronyme signifiant “MQ Telemetry Transport” se cache un protocole de messagerie basé sur le protocole TCP/IP !

Euh… Hein ? Qu’est-ce que MQTT ?

Bon, ok… Vous voyez Facebook Messenger ? Les développeurs de la très célèbre firme californienne se sont directement inspirés du protocole MQTT pour réaliser leur interface. C’est un système plutôt simple en fait. Il y a 4 mots à savoir pour comprendre MQTT :
Publisher : C’est celui qui publie un message sur un Topic.
Topic : C’est un genre de “forum” où les Publisher peuvent publier des messages. Un topic peut être crée par un Publisher ou un Subscriber.
Subscriber : C’est quelqu’un qui est abonné au Topic et qui reçoit les messages.
Broker MQTT : C’est le serveur qui centralise l’ensemble des Topics.

Il est possible d’être Publisher et Subscriber en même temps (c’est même très souvent le cas !).

L'architecture MQTT.

L’architecture MQTT.

Pour nos objets connectés, le gros avantage de MQTT par rapport à une trame HTTP, c’est que le protocole consomme moins de ressources. Il y a moins d’instructions à réaliser par notre microcontrôleur pour envoyer une trame avec MQTT au lieu de HTTP. Le message met donc moins de temps à être envoyé et consomme moins d’énergie. C’est classe donc.
En plus de cet avantage, il existe une librairie Arduino toute faite qui intègre MQTT à votre programme. C’est hyper classe donc.
Et en prime de tout ça, MQTT est intégré nativement à Node-RED.
Tu le vois le lien ? Tu ressens la puissance du truc ?

Mais… mais… on en vient quand à Mosquitto ?

Oui, oui ! Euh… Bah Mosquitto, c’est “le truc du milieu” ou “la Terre du Milieu“. Plus sérieusement, il s’agit de notre serveur MQTT (appelé Broker MQTT), qui a l’avantage d’être libre et Open-Source. Il en existe plusieurs, souvent payants. On en retrouve également directement sur le Cloud (Amazon, IBM…). Le public visé sur les solutions payantes est clairement un public professionnel pour des projets nécessitants de nombreuses requêtes par secondes à travers le monde. Ce n’est pas (encore) notre cas ! 😀

Mosquitto est le serveur qui va héberger nos Topics, inscrire nos Subscribers et être attentif à nos Publishers. 🙂

Une architecture dont le centre névralgique est Mosquitto. L'architecture peut aisément être mise en place grâce à Node-RED.

Une architecture dont le centre névralgique est Mosquitto. L’architecture peut aisément être mise en place grâce à Node-RED.

Installons tout ça sur Raspberry Pi (Stretch) !

J’ai réalisé l’installation de Mosquitto et Node-RED sur Raspberry Pi 3 avec le dernier OS Raspbian en date : Raspbian du 07/09/2017 (basé sur Debian 9 : Stretch). J’ai préalablement monté un point WiFi sur le Raspberry Pi à l’aide de RaspAP. La plupart des tutos que vous trouverez sur le net sont basés sur Rasbian Wheezy ou Jessie. Pour ma part, j’ai tout fait sur la dernière version : Stretch. Avant toute nouvelle installation, faites un sudo apt-get update et un sudo apt-get upgrade dans le Terminal de votre Raspberry Pi afin d’avoir toutes vos librairies à jour.

Merci d’avoir rejoins la newsletter ! N’hésitez pas à vérifiez votre boîte mail !

Mosquitto, celui qui a posé problème sous Stretch

J’ai eu quelques soucis à l’installation de Mosquitto sous Raspbian Stretch. J’ai cependant réussi à l’installer en réalisant quelques étapes intermédiaires : installations de certaines librairies avant les autres, compilation manuelle de Mosquitto… Suivez toutes les étapes et tout ira bien :-).

Les personnes qui ont lu cet article ont aussi lu :  AstroPrint sur Raspberry Pi avec écran tactile

On va tout d’abord récupérer Mosquitto sur le Repository des développeurs (ces opérations serviront également pour les mises à jour de Mosquitto). Pour cela on a besoin de la clé de décryptage du Repository :

wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-stretch.list
sudo apt-get update

Une fois que vous en êtes arrivés là, essayez de faire un sudo apt-get install mosquitto. Personnellement, ça n’a pas fonctionné chez moi, à causes de librairies incompatibles. Foutaises ! Je télécharge directement les sources. Va pour la compilation et l’installation à la main !

Téléchargement, compilation et installation de Mosquitto
sudo apt-get install cmake libssl1.0-dev 
sudo apt-get install libwebsockets-dev uuid-dev
cd /tmp
wget http://mosquitto.org/files/source/mosquitto-1.4.14.tar.gz
tar xavf mosquitto-1.4.14.tar.gz
cd mosquitto-1.4.14
cmake -DWITH_WEBSOCKETS=ON .
make -j4
sudo make install

Voilà ! Mosquitto est installé ! On va maintenant le configurer. Pour se faire, on va ajouter ces lignes au fichier de configuration qui se trouve ici : sudo nano /usr/local/etc/mosquitto/mosquitto.conf

pid_file /var/run/mosquitto.pid

persistence true
persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

include_dir /etc/mosquitto/conf.d

Change the “log_dest” line to:

log_dest topic

log_type error
log_type warning
log_type notice
log_type information

connection_messages true
log_timestamp true

Pour le tester, rien de plus simple, ouvrez un premier terminal et lancez le serveur Mosquitto avec la commande : mosquitto.

Ouvrez un second terminal et souscrivez à un abonnement sur le Topic : Test.

Terminal Subscriber
mosquitto_sub -d -t Test

Ensuite, ouvrez un troisième terminal et publiez un message sur le topic Test :

Terminal Publisher
mosquitto_pub -d -t Test -m "Bonjour de la part du terminal 3 !"

Revenez sur le second terminal, le message du terminal 3 (Publisher) devrait être reçu sur le terminal 2 (Subscriber) :

Résultat du test
~ $ mosquitto_sub -d -t Test
Client mosqsub/3014-bentekpi sending CONNECT
Client mosqsub/3014-bentekpi received CONNACK
Client mosqsub/3014-bentekpi sending SUBSCRIBE (Mid: 1, Topic: hello/world, QoS: 0)
Client mosqsub/3014-bentekpi received SUBACK
Subscribed (mid: 1): 0
Client mosqsub/3014-bentekpi received PUBLISH (d0, q0, r0, m0, 'Test', ... (32 bytes))
Bonjour de la part du terminal 3 !

Notre Broker MQTT fonctionne à merveille ! 🙂

Passons à Node-RED maintenant

Pour Node-RED, aucun problème sous Stretch ! Si vous avez la version Lite de Raspbian ou si vous voulez mettre à jour Node-RED, rien de plus simple que d’installer le paquet via apt-get ! Je vous recommande aussi d’installer le paquet “npm” qui vous permettra d’installer des plugins et nœuds supplémentaires pour Node-RED !

sudo apt-get install nodered
sudo apt-get install npm

Voici quelques commandes utiles pour démarrer ou stopper Node-RED :

Quelques trucs utiles avec Node-RED
# Mettez-vous dans ce répertoire pour commencer : 
cd ~/.node-red

# Pour stopper le service Node-RED :
node-red-stop

# Pour démarrer ou redémarrer le service Node-RED :
node-red-start

# Pour activer le service à chaque démarrage du Raspberry Pi :
sudo systemctl enable nodered.service

# Pour désactiver le démarrage automatique du service à chaque démarrage :
sudo systemctl disable nodered.service

Pour accéder à l’interface graphique de Node-RED, ouvrez un navigateur web (soit sur votre réseau local, ou directement sur le Raspberry Pi). Et tapez <IP de votre RPI>:1880. Vous accéderez à l’interface de Node-RED.

L’installation s’est bien terminé :-).

Faire appel à Mosquitto dans Node-RED

Pour se faire, rien de plus simple. Glissez-déposez le nœud MQTT en Inpout ou Output et renseignez le Topic auquel vous souscrivez (Input) où vous publierez (Output). Ci-dessous, je vous ai mis un exemple d’un abonnement à Temp, qui est un Topic où j’envoie des données via une sonde de température. Cette donnée est traitée avant d’être enregistrée en base de données sous la variable “temperature” attribuée à l’objet “sensor”.

Flux de donnée avec une source MQTT.

Flux de donnée avec une source MQTT. Les nœuds de debug sont en vert.

 

Noeud MQTT abonné au Topic "Temp".

Nœud MQTT abonné au Topic “Temp”.

Le code de la fonction "transform". On place la température en Float dans un objet "sensor".

Le code de la fonction “transform”. On place la température en Float dans un objet “sensor”.

Nœud d'entrée en base de données InfluxDB (à télécharger).

Nœud d’entrée en base de données InfluxDB (à télécharger).

 

Afin de tester rapidement votre flux de donnée, vous pouvez aussi utiliser le terminal pour publier des messages sur le Topic MQTT. Il y a également des nœuds “debug” dans Node-RED permettant de suivre l’information. Si vous voulez tester sur votre réseau local, de nombreux clients MQTT existent sous IOS et Android. C’est comme ça que j’ai testé mon Topic “Temp” !

Dans le prochain article, on reliera un flux de données MQTT vers une base de données InfluxDB qui nous servira à afficher les données dans Grafana. 🙂

N’hésitez pas à commenter cette article, je serai ravi de vous expliquer plus en détail chaque rouage MQTT et Node-RED :-).

Ben.

Pin It on Pinterest

Shares
Share This