Débuter avec le Broker MQTT Mosquitto (Raspberry Pi, Windows, macOS, Linux) • Domotique et objets connectés à faire soi-même

Mosquitto est un serveur MQTT Open Source (Broker) que l’on peut installer sur un Raspberry Pi mais aussi sur presque tous les systèmes d’exploitation (macOS, Windows, Linux…). MQTT est un protocole de communication très rapide et léger particulièrement bien adapté à la domotique et aux objets connectés. Il facilite la communication entre objets connectés (M2M) tout en économisant la batterie.

Dernière mise à jour : 24 avril 2020

Parmi tous les brokers MQTT existants, Mosquitto développé par la fondation Eclipse est le plus utilisé. Il existe un connecteur sur la plupart des serveurs domotiques (JeedomopenHABDomoticzHome Assistant) rendant très facile l’intégration de projets DIY. Dans ce tutoriel, nous allons installer Mosquitto sur Raspberry Pi et découvrir comment l’utiliser directement depuis le Terminal, Node-RED et MQTT.fx (un utilitaire pour Windows).

C’est quoi un broker MQTT ?

MQTT (Message Queuing Telemetry Transport) est un protocole de messagerie qui fonctionne sur le principe de souscription / publication qui a été développé à la base pour simplifier la communication entre les machines. Pour fonctionner il faut installer un serveur, qui est désigné par Broker. Vous pouvez installer votre propre Broker, ce que nous allons faire dans cet article. Vous pouvez l’installer sur quasiment toutes les plateformes dont les plus communes (Windows, Linux, Mac OS X….) mais aussi sur un Raspberry Pi (qui fonctionne sous Linux après tout).

Depuis novembre 2014, la version 3.1.1 de MQTT est devenue un standard international pour la communication entre machines (M2M) et les objets (IoT). Il est soutenu par la fondation OASIS qui regroupent de grands entreprises de l’industrie informatique et télécom (BlackBerry, Cisco, IBM, Kaazing, LogMeIn, M2Mi, MachineShop, PTC, Red Hat, Software AG, TIBCO…).

En plus de simplifier la communication, MQTT a été conçu pour économiser au maximum la batterie des appareils mobiles. MQTT consomme 11 fois moins d’énergie pour envoyer des messages et 170 fois moins pour en recevoir que le protocole HTTP. MQTT est également 93 fois plus rapide que le protocole HTTP.

Avec MQTT, vous avez la possibilité de régler le QoS (Quality Of Service – Qualité de Service), c’est à dire que pour chaque message envoyé vous pouvez choisir comment le broker doit le gérer.

La notion de QoS dans les messages qui transitent via MQTT.

  • QoS0.  Le message envoyé n’est pas stocké par le Broker. Il n’y a pas d’accusé de réception. Le message sera perdu en cas d’arrêt du serveur ou du client. C’est le mode par défaut
  • QoS1. Le message sera livré au moins une fois. Le client renvoie le message jusqu’à ce que le broker envoi en retour un accusé de réception.
  • QoS2. Le broker sauvegarde le message et le transmettra jusqu’à ce qu’il soit reçu par tous les souscripteurs connectés.

D’autres fonctions utiles

  • Persistance des messages sur un Topic. Les messages sont conservés sur le Broker.
  • Il est possible de gérer les droits de souscription/publication pour chaque Topic.
  • Il est possible de sécuriser le transport des messages en SSL/TLS ainsi que par identification de l’utilisateur (identifiant et mot de passe)
  • Les topics et l’arborescence sont créés à la volée. Il n’y a rien à configurer sur le Broker. C’est le “publieur” qui créé l’arborescence des Topics (au moment de la publication).

Quel Broker MQTT open-source choisir ?

Voici les principaux projets de brokers Open Source

  • ActiveMQ qui permet d’ajouter MQTT à un serveur Web Apache (Développé par la fondation Apache)
  • JoramMQ pour l’intégration de MQTT en Java
  • Mosquitto, le broker open-source le plus utilisé dans les projets DIY soutenu par la fondation eclipse.org
  • RabbitMQ, un projet open source disponible également avec un support commercial
  • EMQTT, un projet développé en Erlang/OTP disponible pour Windows, Mac Os X et Linux conçu pour recevoir de très nombreuses connexions (jusqu’à 1 million par serveur). Il est possible de créer un cluster (réseau de serveur) pour accroitre le nombres de connexions simultanées.

ActiveMQ et JoramMQ sont des brokers assez spécifiques. RabbitMQ est plus orienté entreprise avec son offre commerciale.

Mosquitto est un très bon choix. Il est disponible sur toutes les plateformes et s’installe en quelques minutes. Comme MQTT est un standard, quelque soit votre choix, vous pourrez communiquer avec vos objets connectés de la même façon.

Installer Mosquitto sur Raspberry Pi ou Linux

Avant d’installer Mosquitto, il est toujours bon de mettre à jour le système

sudo apt-get update

L’installation du Broker Mosquitto est très simple.

sudo apt-get install mosquitto

Si vous voulez faire des tests sur votre Raspberry, vous pouvez installer les clients mosquitto_sub  (pour souscrire), mosquitto_pub  (pour publier des messages) et mosquitto_passw (pour configurer des utilisateurs et les mots de passe).

sudo apt-get install mosquitto-clients

Si vous voulez faire des développements en python, installez python-mosquitto. Vous pouvez aussi tout installer en une seule commande

sudo apt-get install mosquitto mosquitto-clients python-mosquitto

Pour faire vos premiers essais, vous pouvez utiliser le serveur d’essai http://test.mosquitto.org/.

Installer Mosquitto sur Windows ou macOS

Vous ne possédez pas encore de Raspberry Pi, aucun problème, vous pouvez installer le Broker Mosquitto sur presque toutes les plateformes (lien vers la page de téléchargement).

Il y a deux versions disponibles en fonction de la version de votre Windows

Sur macOS, vous devrez déjà installer  http://brew.sh/ puis executer la commande suivante depuis le Terminal

brew install mosquitto

Vérifier l’installation

Mosquitto fonctionne comme un service, exécutez la commande suivante pour vérifier que l’installation s’est déroulée correctement

systemctl status mosquitto

Vous devez obtenir cette réponse

 mosquitto.service - LSB: mosquitto MQTT v3.1 message broker
   Loaded: loaded (/etc/init.d/mosquitto; generated; vendor preset: enabled)
   Active: active (running) since Mon 2020-03-23 18:39:14 CET; 15h ago
     Docs: man:systemd-sysv-generator(8)
  Process: 369 ExecStart=/etc/init.d/mosquitto start (code=exited, status=0/SUCCESS)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/mosquitto.service
           └─400 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Dans le cas où cela ne fonctionne pas (même après un reboot) exécuter cette commande pour démarrer le service

sudo systemctl enable mosquitto.service

Sécuriser l’accès à Mosquitto par un mot de passe (optionnel)

Par défaut, il est possible de souscrire (recevoir des messages) sans avoir besoin d’aucune identification. Très pratique pour la mise au point, cela peut vite poser une faille de sécurité si pilotez vos appareils (chauffage, climatisation, motorisation de volets roulants…) à l’aide d’un système domotique DIY. Dans ce cas, voici comment protéger à minima votre installation et activant l’authentification par un mot de passe.

Créer un mot de passe et remplaçant NOM_UTILISATEUR

sudo mosquitto_passwd -c /etc/mosquitto/passwd NOM_UTILISATEUR

La commande mosquitto_passwd génère l’empreinte du mot de passe et l’enregistre dans le fichier passwd dans le répertoire /etc/mosquitto. 

Ouvrez le fichier de configuration avec sudo nano /etc/mosquitto/mosquitto.conf, puis ajouter les lignes

>allow_anonymous false
password_file /etc/mosquitto/passwd

Crtl + X puis O (ou N) pour enregistrer

Enfin redémarrer le service en faisant

systemctl restart mosquitto

Publier (envoyer) un message MQTT depuis le terminal

La commande mosquitto_pub permet de publier simplement un message MQTT.

Exécuter mosquitto_pub –help pour obtenir la liste de toutes les options disponibles. Voici quelques options utiles à connaître :

  • h nom du broker (ou IP) sur lequel lequel se connecter
  • p port, par défaut 1883
  • u nom d’utilisateur (optionnel)
  • P mot de passe (optionnel)
  • t topic sur lequel publié le message
  • m message (payload) à envoyer. Le payload peut être une valeur ou un JSON.
  • r indique au broker de retenir (ou pas) le message

Par exemple, on se connecte au serveur -h localhost sur le Topic -t sensor/temperature et on publie le message -m 22.5

mosquitto_pub -h localhost -t sensor/temperature -m 22.5

Recevoir (souscrire) des messages

La commande mosquitto_sub permet de souscrire, c’est à dire de recevoir des messages publiés sur un broker MQTT. Les options sont presque identiques à mosquitto_pub. Ouvrez un  second Terminal et exécutez la commande suivant.

mosquitto_sub -h localhost -t "sensor/temperature"

ucmzgtrcyvvhqokyce6j-9132691

Vous disposer maintenant d’un système serveur d’échange de messages domotiques très performant et facile à utiliser.

Si vous ne connaissez pas encore Node-RED, je vous conseille de prendre le temps de lire ce tutoriel. Nous allons voir comment il est super simple de communiquer avec MQTT en utilisant Node-RED.

Aucun plugin supplémentaire n’est nécessaire, Node-RED gère par défaut MQTT. Ajoutez un node mqtt (celui-ci se trouve dans la section input). Double cliquez sur le node pour ouvrir la boîte de configuration. et appuyez sur le crayon pour ajouter une nouvelle connexion. Si Node-RED fonctionne sur la même machine que le broker Mosquitto, saisissez localhost dans le champ serveur et 1883 dans le port. Validez.

dauu7hdiwngiipnudmhf-7093336

Dans le champ Topic saisissez le topic auquel vous voulez souscrire. Dans notre exemple sensor/temperature. Ajoutez un node debug et déployez. Retournez dans le Terminal et publiez une nouvelle valeur sur le topic. Un nouveau message vient de s’ajouter dans la fenêtre debug. Communiquer avec vos objets connectés devient un vrai jeu d’enfant non ?

mzgmnfqmwe6odhpcaadh-7671563

Quelques commandes utiles

Symbole #. Il permet de souscrire à tous les niveaux se trouvant en dessous du wildcard. Par exemple avec la commande suivante vous allez souscrire à tous les Topics (-t) sur serveur (-h) localhost. Tous les topics (“#”). Le Topic sera affiché avant sa valeur (-v).

mosquitto_sub -h localhost -t "#" -v

Effacer un topic et son contenu

Attention, il est impossible de revenir en arrière

mosquitto_pub -t  -r -n

MQTT.FX : publier/souscrire facilement des messages

A la place de Node-RED, vous pouvez également utiliser MQTT.fx, un logiciel open source multiplateforme qui vous pouvez télécharger ici. MQTT.fx est un outil assez complet qui va vous permettre :

  • De souscrire ou de publier des messages en ajustant le QoS
  • De connaître le statut de votre Broker (nombre de clients connectés, messages reçus, envoyés, stockés, trafic réseau…)
  • D’avoir accès au log du Broker
  • De créer des scripts en Javascript

rse3myetq7gqmtx5ve7q-1082793

Et maintenant, quoi faire avec MQTT ?

Le protocole MQTT est particulièrement bien adapté au développement d’objets connectés. Ultra rapide et léger, c’est un standard très utilisé en domotique.

Voici une sélection d’autres articles qui pourraient vous donner des idées

Retrouvez tous les projets et tutoriels dans la catégorie Objets Connectés

Mises à jour

24/03/2020 correction du lien vers MQTT.fx, sécuriser l’accès à Mosquitto par un mot de passe

Avez-vous aimé cet article ?