{{tag>software mosquitto mqtt broker iot}} ====== 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 [[dev:python:mqtt | 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: * /mosquitto/config * /mosquitto/data * /mosquitto/log ===== 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 ===== * http://mosquitto.org/man/mqtt-7.html * http://mosquitto.org/man/mosquitto_pub-1.html * http://mosquitto.org/man/mosquitto_sub-1.html * https://mosquitto.org/documentation/authentication-methods/ * https://hub.docker.com/_/eclipse-mosquitto