Mosquitto est un broker MQTT. Il réceptionne et redistribue les messages via le protocole MQTT.
Une solution simple pour tester le service est d'utiliser Docker:
docker image pull eclipse-mosquitto:2.0.14 docker container run --detach --rm --name test_mosquitto --publish 127.0.0.1:1883:1883 eclipse-mosquitto:2.0.14
L'image Docker contient également des commandes permettant d'envoyer ou de recevoir facilement des messages depuis la ligne de commandes:
Créer un processus souscripteur qui recevra les messages
# ouvrir un shell interactif dans le conteneur docker container exec -it test_mosquitto /bin/sh # Pour recevoir les messages on s'inscrit auprès du serveur (souscription aux topics). # Ici on souhaite recevoir tous les topics. Les messages seront affichés sur la console: mosquitto_sub --id receiver_test --topic '#' --verbose
Pour envoyer un message, on procède de façon similaire:
# Ouvrir un autre shell interactif dans le conteneur docker container exec -it test_mosquitto /bin/sh # Pour envoyer un message au Broker on utilise la commande **mosquitto_pub** (publish) mosquitto_pub --id message_emitter -h localhost -r -t "test/light/salon" -m '{ "status": "on"}'
Si on affiche la console du processus souscripteur, on voit alors apparaître le message:
test/light/salon { "status": "on"}
Pour envoyer des messages MQTT via une application Python, voir note Publier des messages MQTT en Python.
3 répertoire sont dédiés dans l'image pour la configuration le stockage persistant et les logs:
Par défaut les logs sont générés sur la sortie erreur standard et le timestamp n'est pas mis en forme.
Lorsqu'on affiche les logs via docker logs ou docker-compose logs on obtient une sortie de la forme:
mosquitto_1 | chown: /mosquitto/config/mosquitto.conf: Read-only file system mosquitto_1 | chown: /mosquitto/config/password_file: Read-only file system mosquitto_1 | 1649928188: mosquitto version 2.0.14 starting mosquitto_1 | 1649928188: Config loaded from /mosquitto/config/mosquitto.conf. mosquitto_1 | 1649928188: Opening ipv4 listen socket on port 1883. mosquitto_1 | 1649928188: Opening ipv6 listen socket on port 1883. mosquitto_1 | 1649928188: mosquitto version 2.0.14 running . . .
Pour faciliter la relecture des logs, on peut modifier cette sortie par défaut et définir une mise en forme pour le timestamp dans le fichier de configuration de Mosquitto:
Set the format of the log timestamp. If left unset, this is the number of # seconds since the Unix epoch. # This is a free text string which will be passed to the strftime function. To # get an ISO 8601 datetime, for example: #log_timestamp_format log_timestamp_format %Y-%m-%dT%H:%M:%S
Après redémarrage du service, les dates sont affichées correctement:
mosquitto_1 | 2022-04-14T09:33:08: mosquitto version 2.0.14 starting mosquitto_1 | 2022-04-14T09:33:08: Config loaded from /mosquitto/config/mosquitto.conf. mosquitto_1 | 2022-04-14T09:33:08: Opening ipv4 listen socket on port 1883. mosquitto_1 | 2022-04-14T09:33:08: Opening ipv6 listen socket on port 1883. mosquitto_1 | 2022-04-14T09:33:08: mosquitto version 2.0.14 running
Lors du développement, on peut vouloir autoriser les connexions clientes sans authentification:
# Mosquitto écoute sur le port 1883 listener 1883 # Accepte les connexions clientes sans authentification allow_anonymous true
Il est important de restreindre l'accès au Broker pour que seuls les clients autorisés puissent se connecter. Plusieurs méthodes d'authentification existent, au minima on pourra utiliser
Modifier le fichier de configuration pour utiliser une authentification par mot de passe:
password_file /etc/mosquitto/password_file
L'utilitaire mosquitto_passwd permet d'enregistrer des couples user/password dans un fichier:
# créer un nouveau fichier mosquitto_passwd -c password_file username # Pour altérer un fichier existant, ne pas utiliser l'option -c # créer ou modifier l'utilisateur username mosquitto_passwd password_file username # supprimer l'utilisateur username mosquitto_passwd password_file -D username
Dans l'exemple ci-dessous on crée un fichier vide et on utilise un conteneur Docker pour peupler le fichier:
touch password_file # Création d'un conteneur éphémère pour exécuter la commande mosquitto_pwd et peupler le fichier monté # en écriture dans le conteneur docker container run -it --rm --name 'create_conf' -v ${PWD}/password_file:/password_file:rw eclipse-mosquitto:2.0.14 mosquitto_passwd /password_file user-test
Envoyer un signal SIGHUP à Mosquitto pour que les modifications apportées au fichier de configuration soient prises en compte ou redémarrer le service:
docker container kill --signal SIGHUP mqtt_mosquitto