Table des matières

, , , ,

Mosquitto

Mosquitto est un broker MQTT. Il réceptionne et redistribue les messages via le protocole MQTT.

Test avec Docker

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:

Horodatage des logs Docker

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

Gestion de l'authentification

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

Références