Connecter un senseur Yoctopuce à un broker MQTT

Connecter un senseur Yoctopuce à un broker MQTT

Pour intégrer un senseur Yoctopuce à une application, on peut utiliser nos librairies et communiquer directement avec le module Yoctopuce. C'est la méthode la plus efficace et qui offre le plus de possibilités, mais pour cela il faut avoir un minimum de connaissances en programmation. L'autre solution est d'utiliser un protocole standard et des applications qui supportent ce protocole. MQTT est l'un de ces protocol dont nous venons d'ajouter le support MQTT dans le VirtualHub et dans les YoctoHubs.



MQTT est un vieux protocole qui a été développé par IBM qui est ensuite passé en Open source. Ce protocole a été très peu utilisé, seuls quelques produits IBM et ZigBee l'on utilisé, mais depuis quelques années il revient sur le devant de la scène.


Selon Google Trends, MQTT est resté en sommeil pendant plus de 10 ans.
Selon Google Trends, MQTT est resté en sommeil pendant plus de 10 ans.




Pourquoi donc s'intéresser à ce protocole maintenant ? Tout simplement car ce protocole a été pensé dès le départ pour être utilisé sur des machines avec des ressources limitées. Contrairement aux protocoles HTML, XML, qui sont très verbeux et compliqués à parser, MQTT est un protocole binaire très simple à formater et parser. Avec l'arrivée en masse de l'internet des objets de plus en plus d'application se sont mises à utiliser MQTT.

MQTT est un protocole de publication de message et de souscription de message. Les clients ne communiquent pas directement entre eux, ils publient des messages sur un serveur (broker), les messages sont composés d'un contenu et d'un sujet (topic). Le serveur garde en mémoire le dernier message pour chaque sujet. Les clients qui sont intéressés par les messages d'un sujet peuvent les récupérer en se connectant au serveur. L'avantage de cette solution est qu'elle permet à plusieurs clients de communiquer même s'ils ne sont jamais connectés en même temps au serveur.

Petit exemple


Pour illustrer l'utilisation de ce protocole, nous avons réalisé une petite installation qui permet d'afficher la température d'un Yocto-Meteo sur un téléphone Android. Le Yocto-Meteo est branché sur un YoctoHub-Wireless-g qui est alimenté par une batterie. Pour ne pas vider la batterie en une journée, le YoctoHub-Wireless-g se réveille 4 fois par jour le temps de faire une mesure, la poster sur le broker MQTT et de se rendormir.

La première étape est de trouver un broker MQTT. On peut soit utiliser un service payant sur internet ou simplement installer un broker MQTT sur une machine. Nous avons utilisé mosquitto, un broker open source qui fonctionne sur tous les OS. Installer mosquitto sur un Raspberry Pi est très simple, il suffit d’exécuter la commande suivante:

$ sudo apt-get install mosquitto



Par défaut, le serveur est lancé automatiquement lors du démarage de l'OS, il n'y a donc rien d'autre à faire sur le Raspberry Pi.

Il faut ensuite configurer le YoctoHub-Wireless-g pour qu'il se connecte sur le broker. La page de configuration du callback MQTT se trouve dans la page de configuration du YoctoHub-Wireless-g. On remplit l'IP du serveur, le port , les éventuelles informations d’authentifications, et le tour est joué.

La page de configuration du callback MQTT.
La page de configuration du callback MQTT.



Une fois la configuration sauvée, le YoctoHub se connecte au broker MQTT et poste un message pour chaque fonction des modules Yoctopuce connectés. Le sujet du message MQTT est le hardwareId de la fonction ou son friendlyName si un nom logique a été défini. Le contenu du message est la représentation texte de la valeur courante.

Notre Yocto-Meteo avec le numéro de série METEOMK1-2DED6 a trois fonctions: temperature, humidity et pressure. Normalement le YoctoHub publie trois messages. Le sujet de ces messages est respectivement METEOMK1-2DED6/temperature, METEOMK1-2DED6/humidity et METEOMK1-2DED6/pressure. Mais, dans notre cas, nous avons attribué un nom logique "jardin" au Yocto-Meteo, le sujet des message est donc jardin/temperature, jardin/humidity et jardin/pressure.


Il ne nous reste plus qu'à installer un client MQTT pour Android. Il en existe plusieurs et certains sont même en Open Source. Pour cet exemple nous avons utilisé MQTT Dashboard, qui est gratuit, fonctionne bien et n'est pas rempli de banners de pub. Là aussi, il faut entrer les informations de connexion au broker. Il faut ensuite souscrire aux messages qui nous intéressent. Pour cet exemple, nous nous sommes intéressés uniquement à la température. Il suffit donc de souscrire aux messages sur le sujet jardin/temperature

Et voilà la température directement sur notre téléphone...
Et voilà la température directement sur notre téléphone...



Oui mais...


Il y a cependant un problème avec MQTT: la sécurité. Le protocole permet bien d’authentifier un client à l'aide un login et d'un mot de passe, mais ces informations sont transmises en clair lors de la connexion. Ce qui rend ce protocole très vulnérable aux attaques "man-in-the-middle". Si vous utilisez votre installation sur votre réseau local sécurisé, ce n'est pas un problème mais si vous utilisez votre broker sur un réseau publique il est très facile de se faire passer pour un client existant.

Conclusion


MQTT est probablement arrivé bien trop tôt: en 1999 son intérêt était presque nul. Mais en 2016, avec de plus en plus d'objets connectés, ce protocole prend tout son sens, car il fonctionne très bien même avec une connectivité limitée et des ressources limitées. De plus, il existe de nombreux utilitaires qui sont compatibles avec ce protocole. C'est une solution très pratique pour autant que votre réseau soit sécurisé...

Commenter 7 commentaires Retour au blog



1 - bluewhisper Vendredi 22 avril 2016 18H23

ça ne marche pas chez moi... il met toujours, lors du test:

ERROR: closed by server

[Connection closed]

Il n'essaie même pas de s'y connecter, d'après wireshark... une idée?

Merci!

2 - mvuilleu (Yocto-Team)Vendredi 22 avril 2016 18H25

@bluewhisper: Utilisez-vous le VirtualHub our un YoctoHub ?
Qu'avez-vous mis comme adresse exactement dans le callback ?
Envoyez-nous un screenshot de votre page de configuration à support@yoctopuce.com, et nous vous aiderons.

3 - showroom654 Lundi 09 mai 2016 11H43

Bonjour,
J'essaie de suivre votre tuto. En faisant le test callback, j'ai cette erreur:
ERROR: closed by server
[Connection closed]

J'utilise le Virtualhub version:24406
J'ai installé le serveur mosquitto sur un Raspberry Pi.
Merci pour votre aide

4 - seb (Yocto-Team)Lundi 09 mai 2016 14H14

@showroom654: C'est probablement que mosquitto bloque la connexion entrante. Pouvez vous lancer mosquitto en ligne de commande avec l'option -v et tester à nouveau le callback?
Mosquitto devrait afficher la raison pour la quel il rejette là connexion sur la sortie standard.

Vous pouvez contacter support@yoctopuce.com si vous n'arrivez pas à faire fonctionner le callback MQTT.

5 - beber007 Mardi 18 octobre 2016 11H49

Bonjour,

Est-il possible de piloter un actuateur(relay) via MQTT ?

Ou est-il seulement possible de recevoir des notifications provenant de capteur.

Merci d'avance

Bertrand

6 - seb (Yocto-Team)Mardi 18 octobre 2016 14H15

@beber007: Ce n'est pas possible de le faire directement depuis les YoctoHub, mais en utilisant La librairie Java ou EcmaScript il est possible de réaliser une passerelle entre les YoctoHub et un broker MQTT. Nous avons le projet d'écrire un article sur ce sujet dans les mois qui viennent.

7 - seb (Yocto-Team)Lundi 07 novembre 2016 9H23

@beber007: Nous avons publié un article qui explique comment réaliser une passerelle entre MQTT et les YoctoHubs:
https://www.yoctopuce.com/FR/article/controler-les-modules-yoctopuce-depuis-mqtt

Yoctopuce, get your stuff connected.