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 (Jeedom, openHAB, Domoticz, Home 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
- Pour Windows Vista et supérieur : mosquitto-1.4.8-install-win32.exe (~200 kB) (développé avec Visual Studio Community 2013)
- Pour Windows XP : mosquitto-1.4.8-install-cygwin.exe (~200 kB)
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"
Vous disposer maintenant d’un système serveur d’échange de messages domotiques très performant et facile à utiliser.
Comment publier et recevoir des messages MQTT avec Node-RED
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.
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 ?
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
mosquitto_pub -t <topic> -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
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
- Jeedom. Publier en MQTT des commandes virtuelles vers ESP8266 ou ESP32 (interrupteur, poussoir, dimmer)
- Brokers MQTT en ligne avec une offre gratuite pour tester et connecter vos objets à internet
- Installer le broker MQTT Mosquitto sur NAS Synology (DSM 6.2+) avec Docker
- Routeur MQTT Node-RED vers cloudMQTT, accéder à vos modules Sonoff Tasmota
- Hack de la prise connectée Sonoff S26, installation du firmware Tasmota
- Test de cloudMQTT, broker MQTT en ligne gratuit. Piloter Domoticz avec l’API JSON
- Inclure les accessoires domotiques Xiaomi Aqara ou Mijia à Jeedom avec les plugins Virtuel et MQTT
- Test du détecteur de fumée Xiaomi Mijia Honeywell avec Domoticz, notification d’urgence avec PushOver
- Zigbee2MQTT. Inclure des accessoires Xiaomi Aqara à Domoticz via plugin ou Node-RED
- Assembler le pont Zigbee2MQTT, boitier, démo Node-RED. Hack ponts zigbee Hue et Xiaomi Aqara
Mises à jour
24/03/2020 correction du lien vers MQTT.fx, sécuriser l’accès à Mosquitto par un mot de passe
Bonjour,
J’ai un petit soucis. J’ai mis sur un Sonoff T0 2 interrupteur, ESPEasy. J’ai reussi a tous programmer avec MQTT et Domoticz. J’utilise un bouton pour monter mon volet et le deuxieme pour le descendre. Quand je fais la commande en passant de domoticz vers MQTT cela ne marche pas. Il reste bloqué et ne fais que monter et descendre.
Pouvez-vous m’aider ?
Merci a vous
Bonjour Fabien. Vous avez bien “branché” vos commandes sur domoticz/in et domoticz/out (les commandes sortantes de domoticz que vous devez récupérer sur l’ESP) ?
Bonjour, J’ai bien mis ces commandes pour publish et subscribe. Apres dans Domoticz j’ai choisi un type switch classique…
Oui cela semble correct. Vous avez essayé en inversant les commandes ? Pouvez vous aussi regarder dans le journal de Domoticz s’il n’y a pas une erreur, c’est super bien détaillé et dès qu’il y a un problème (formatage de la commande MQTT), on a immédiatement l’origine du problème
Bonjour et merci beaucoup pour vos explications.
Malheureusement après installation de mosquitto et mosquitto clients sur mon raspberrry pi 3B+:
– je teste avec “systemctl statut mosquitto” mais j’ai un “failed” avec process 3798;
– je teste avec “sudo service mosquitto start” et là j’ai un failed: “job for mosquitto.service failed because the control process exited with error node. See systemctl status mosquitto.service and journalctl – xe for details”
ci dessous les détails des messages:
pi@raspberrypi:~ $ systemctl status mosquitto
● mosquitto.service – Mosquitto MQTT v3.1/v3.1.1 Broker
Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enable
Active: failed (Result: exit-code) since Wed 2020-08-26 22:27:45 CEST; 9h ago
Docs: man:mosquitto.conf(5)
man:mosquitto(8)
Process: 3798 ExecStart=/usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf (code=exi
Main PID: 3798 (code=exited, status=3)
août 26 22:27:45 raspberrypi systemd[1]: Failed to start Mosquitto MQTT v3.1/v3.1.1 Brok
août 26 22:27:45 raspberrypi systemd[1]: mosquitto.service: Service RestartSec=100ms exp
août 26 22:27:45 raspberrypi systemd[1]: mosquitto.service: Scheduled restart job, resta
août 26 22:27:45 raspberrypi systemd[1]: Stopped Mosquitto MQTT v3.1/v3.1.1 Broker.
août 26 22:27:45 raspberrypi systemd[1]: mosquitto.service: Start request repeated too q
août 26 22:27:45 raspberrypi systemd[1]: mosquitto.service: Failed with result ‘exit-cod
août 26 22:27:45 raspberrypi systemd[1]: Failed to start Mosquitto MQTT v3.1/v3.1.1 Brok
lines 1-15/15 (END)
auriez vous svp des astuces pour résoudre ce problème svp?
merci beaucoup,
David
Bonjour, question idiote..vous avez essayé de rebooter après l’erreur ?
Bonjour. Merci pour votre article.
Je suis resté coincé à la phase de sécurisation. Je vois bien où indique le nom d’utilisateur, mais pas le password….
Merci de votre aide
Bonjour Patrick. J’ai apporté une petite précision dans le texte. En fait la commande mosquitto_passwd génère l’empreinte du mot de passe et l’enregistre dans le fichier passwd qui se trouve dans le répertoire /etc/mosquitto. La commande va vous demander votre mot de passe de session linux (à cause de la commande sudo). Ensuite, il faut saisir une première fois le mot de passe souhaité pour sécuriser node-red (enter) puis une seconde fois pour le confirmer (re-enter). Pour voir l’empreinte du mot de passe, faites nano /etc/mosquitto/passwd. Rien de plus à faire. Prenez soin de vous.
Sur cet ancien article, un besoin rejoint les nouveaux articles.
1) RPi sur lequel fonctionne l’assistant vocal Jarvis () nécessite un MQTT Broker (tel Mosquitto) léger
2) je viens de découvrir ce Gateway qui pourrait être le pont entre les senseurs (tels Wemos D1 avec DHT22 et autre utilisant MQTT client) : https://github.com/1technophile/OpenMQTTGateway/wiki
3) il faut juste trouver un Dashboard qui permet alors de ne pas alourdir le RPi (puisque Jarvis tourne dessus) et juste disposer des données reçues des senseurs dans du JSON :
http://crouton.mybluemix.net/crouton/gettingStarted
https://github.com/edfungus/Crouton
4) permettant alors de suivre la situation du jardin avec du 433 mHz ou du WiFi (via MQTT) suivant que l’un ou l’autre consommerait moins (voir article du “deep sleep” de ce jour 😉 ) :https://1technophile.blogspot.be/2016/08/low-cost-low-power-6ua-garden-433mhz.html
A plus pour un nouvel article montrant alors ledit RPi broker avec son Dashboard Crouton (utilisant les données JSON reçues via MQTT des clients Wemos D1 DHT22 😉 et lui renvoyant une commande d’activation d’un relais (arrosage, ventiler la pièce trop humide, …)
A+
je n’ai pas très bien compris comment on peut utiliser MQTT avec home assistant, je l’ai pourtant installer mais voilà ce qu’il m’indique
https://uploads.disquscdn.com/images/bfb26cc625f4e9c1bd258fa6904b7c35603a3f26405201fa9bffa80a2712a458.png
Bonjour Ferhat. Suivez cet article http://www.diyprojects.io/mqtt-mosquitto-communicating-connected-objects-iot pour vérifier que le broker Mosquitto (vous pouvez utiliser n’importe quel autre) est bien installé. Pour configurer Home Assistant, regardez cet article en anglais https://home-assistant.io/components/mqtt/
2 petites remarques :
– Tout d’abord je ne comprend pas l’attribut “spécifique” dont sont affublés JoramMQ et ActiveMQ. JoramMQ est un broker multi-protocole qui a l’avantage d’être écrit en Java et donc de s’installer aisément sur tout type de plateforme.
– Ensuite en complément de MQTT.FX je citerais MQTT SPY qui semble maintenant faire partie des outils Eclipse autour de MQTT.
Bonjour Freyssinet. Merci pour vos remarques. J’essai de rendre le plus accessible possible toutes les technos rencontrés pour développer des objets connectés à tout le monde. Java (et Eclipse) me semble plus difficile d’accès lorsqu’on débute. Si vous voulez partager votre expérience sur ces 2 brockers, vous êtes le bienvenue. A très bientôt.