Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révisionLes deux révisions suivantes |
raspberrypi:linux:mqtt_mosquitto [2022/08/01 17:34] – [3.1.1 Installation] phil | raspberrypi:linux:mqtt_mosquitto [2024/05/21 19:27] – [Raspberry Pi - Installer un broker (serveur) MQTT Mosquitto] phil |
---|
===== Raspberry Pi - Installer un broker (serveur) MQTT Mosquitto ===== | ===== Raspberry Pi - Installer un broker (serveur) MQTT Mosquitto ===== |
| |
[Mise à jour le 1/8/2022] <html><span style="color:red">En cours de rédaction</span></html> | [Mise à jour le 21/5/2024] <html><span style="color:red">En cours de rédaction</span></html> |
| |
{{ :raspberrypi:linux:mosquittoraspi.jpg?nolink&250|}} | {{ :raspberrypi:linux:mosquittoraspi.jpg?nolink&250|}} |
| |
* **Lectures connexes** | * **Lectures connexes** |
* [[arduino:clientmqttesp8266|Wiki Arduino - Mettre en œuvre un client MQTT sur un EP8266 (ESP32) Feather Huzzah, MKR1010 ou Arduino Uno Wifi 2]] | * [[microc:iot:clientmqttesp8266|Wiki Arduino - Mettre en œuvre un client MQTT sur un EP8266 (ESP32) Feather Huzzah, MKR1010 ou Arduino Uno Wifi 2]] |
* [[reseaux:outils:mqttlens|Wiki Réseau - Tester un broker Mosquitto avec MQTTlens]] | * [[reseaux:outils:mqttlens|Wiki Réseau - Tester un broker Mosquitto avec MQTTlens]] |
* [[raspberrypi:linux:nodered|Wiki Raspberry Pi sous Linux - Créer un flux de données et une interface utilisateur avec Node-RED]] | * [[raspberrypi:linux:nodered|Wiki Raspberry Pi sous Linux - Créer un flux de données et une interface utilisateur avec Node-RED]] |
* [[web:eclipsepaho|Wiki Web - Créer un client MQTT (Websockets) avec Eclipse Paho]] | * [[web:eclipsepaho|Wiki Web - Créer un client MQTT (Websockets) avec Eclipse Paho]] |
* [[raspberrypi:linux:influxdb_NR|Wiki Raspberry Pi sous Linux - Sauvegarder ses données dans une base TSDB (InfluxdB)]] | * [[raspberrypi:linux:influxdb_NR|Wiki Raspberry Pi sous Linux - Sauvegarder ses données dans une base TSDB (InfluxdB) A venir]] |
| |
* **Mots-clés** | * **Mots-clés** |
**client**((Dans un réseau informatique, un client est le **logiciel** qui envoie des demandes à un serveur.)), **serveur** ((Un serveur informatique est un dispositif informatique (matériel ou logiciel) qui **offre des services**, à un ou plusieurs clients.)), **broker MQTT**((Serveur ou **courtier** des messages. Il se charge de les aiguiller vers les différents clients qui se sont abonnés.)), **subscriber**((**Abonné** à un ou plusieurs topics.)), **publisher**((**Editeur** de messages.)), **topic MQTT**((**Sujet ou canal d'information**. Dans MQTT, le mot topic fait référence à une chaîne UTF-8 que le courtier utilise pour filtrer les messages des clients.)), **payload**((Les messages possèdent un payload, c'est à dire, une propriété contenant les informations les plus utiles.))(charge utile), **joker**((**Caractère générique** utilisé dans le mécanisme de filtrage des messages.)), sécurité, **QoS**((La qualité de service (QDS) ou **quality of service** (QoS) est la capacité à véhiculer dans de bonnes conditions un type de trafic donné.)). | **client**((Dans un réseau informatique, un client est le **logiciel** qui envoie des demandes à un serveur.)), **serveur** ((Un serveur informatique est un dispositif informatique (matériel ou logiciel) qui **offre des services**, à un ou plusieurs clients.)), **broker MQTT**((Serveur ou **courtier** des messages. Il se charge de les aiguiller vers les différents clients qui se sont abonnés.)), **subscriber**((**Abonné** à un ou plusieurs topics.)), **publisher**((**Editeur** de messages.)), **topic MQTT**((**Sujet ou canal d'information**. Dans MQTT, le mot topic fait référence à une chaîne UTF-8 que le courtier utilise pour filtrer les messages des clients.)), **payload**((Les messages possèdent un payload, c'est à dire, une propriété contenant les informations les plus utiles.))(charge utile), **joker**((**Caractère générique** utilisé dans le mécanisme de filtrage des messages.)), sécurité, **QoS**((La qualité de service (QDS) ou **quality of service** (QoS) est la capacité à véhiculer dans de bonnes conditions un type de trafic donné.)). |
| |
| \\ |
| |
| |
===== 1. MQTT (généralités) ===== | ===== 1. MQTT (généralités) ===== |
Le principe d’échange est très proche de celui de Twitter. Les messages sont envoyés par les éditeurs sur un **canal d'information** appelé **topic**. Ces messages peuvent être lus par les abonnés. Les topics peuvent avoir une hiérarchie qui permet de sélectionner finement les informations que l’on désire. | Le principe d’échange est très proche de celui de Twitter. Les messages sont envoyés par les éditeurs sur un **canal d'information** appelé **topic**. Ces messages peuvent être lus par les abonnés. Les topics peuvent avoir une hiérarchie qui permet de sélectionner finement les informations que l’on désire. |
| |
<callout type="primary" icon="true">Les **messages** envoyés par les éditeurs peuvent être de toute sorte, mais ne peuvent excéder une taille de **256 Mo**.</callout> | <callout type="primary" icon="true">Les **messages** envoyés par les éditeurs peuvent être de toute sorte, mais ne peuvent excéder une taille de **256 Mo** bien que dans les **mises en œuvre réelles**, le maximum soit de **2 à 4 Ko**.</callout> |
| |
{{ :raspberrypi:linux:broker-based-mqtt-protocol.jpg?nolink |}} | {{ :raspberrypi:linux:broker-based-mqtt-protocol.jpg?nolink |}} |
| |
**Le caractère joker +** \\ | **Le caractère joker +** \\ |
**+** est le joker pour un **unique niveau hiérarchique**. Un client souscrivant à "maison/+/temp" recevra les messages adressés par d'autres clients aux topics : | **+** est le joker pour un **unique niveau hiérarchique**. Un client souscrivant à "**maison/+/temp**" recevra les messages adressés par d'autres clients aux topics : |
| |
* "maison/salon/temp" | * "maison/salon/temp" |
| |
**Le caractère joker #** \\ | **Le caractère joker #** \\ |
Le **#** est un joker **multiniveau** s'utilisant toujours après un / et en dernier caractère. Il est destiné à remplacer n'importe quel niveau supérieur dans le topic. "maison/#" correspondra aux topics : | Le **#** est un joker **multiniveau** s'utilisant toujours après un / et en dernier caractère. Il est destiné à remplacer n'importe quel niveau supérieur dans le topic. \\ "**maison/#**" correspondra aux topics : |
| |
* "maison/salon/temp" | * "maison/salon/temp" |
Mosquitto fait partie de la <html><a href="https://www.eclipse.org/" target="_blank">Fondation Eclipse</a></html> et est un projet de <html><a href="https://iot.eclipse.org/" target="_blank">iot.eclipse.org</a></html>. | Mosquitto fait partie de la <html><a href="https://www.eclipse.org/" target="_blank">Fondation Eclipse</a></html> et est un projet de <html><a href="https://iot.eclipse.org/" target="_blank">iot.eclipse.org</a></html>. |
| |
===== 3. Installation et mise en oeuvre ===== | ===== 3. Installation et mise en oeuvre basique ===== |
| |
==== 3.1 Sur un Raspberry Pi ==== | ==== 3.1 Sur un Raspberry Pi ==== |
| |
=== 3.1.2 Arrêt, redémarrage === | === 3.1.2 Arrêt, redémarrage === |
Le broker est installé en tant que service. Pour l'arrêter ou le redémarrer, utiliser les commandes suivantes : | <callout type="tip" icon="true">Le broker est installé en tant que **service**. Pour l'arrêter ou le redémarrer, utiliser les commandes suivantes :</callout> |
| |
<code bash *.bash> | <code bash *.bash> |
<callout type="info" icon="true">Le paquet **mosquitto-clients** fournit deux commandes, <html><a href="https://mosquitto.org/man/mosquitto_sub-1.html" target="_blank">mosquitto_sub</a></html> pour une souscription et <html><a href="https://mosquitto.org/man/mosquitto_pub-1.html" target="_blank">mosquitto_pub</a></html> pour une publication.</callout> | <callout type="info" icon="true">Le paquet **mosquitto-clients** fournit deux commandes, <html><a href="https://mosquitto.org/man/mosquitto_sub-1.html" target="_blank">mosquitto_sub</a></html> pour une souscription et <html><a href="https://mosquitto.org/man/mosquitto_pub-1.html" target="_blank">mosquitto_pub</a></html> pour une publication.</callout> |
| |
- Test sur le RaspBerry Pi (localhost) | == 3.1.3.1 Test sur le RaspBerry Pi (localhost) == |
Pour tester le bon fonctionnement du broker, nous allons publier le message (payload) "//Bonjour//" sur le canal d'information (topic) //test/val// à l'aide d'un client **mosquitto_pub**. Ce message sera reçu par un client **mosquitto_sub** abonné à //test/val//. | Pour tester le bon fonctionnement du broker, nous allons publier le message (payload) "//Bonjour//" sur le canal d'information (topic) //test/val// à l'aide d'un client **mosquitto_pub**. Ce message sera reçu par un client **mosquitto_sub** abonné à //test/val//. |
| |
{{ :raspberrypi:linux:testpubsublocalhost.png?nolink |}} | {{ :raspberrypi:linux:testpubsublocalhost.png?nolink |}} |
| |
- Test sur le réseau local | == 3.1.3.2 Test sur le réseau local == |
<callout type="warning" icon="true"></callout> | * **Ressource** : <html><a href="https://mosquitto.org/man/mosquitto-conf-5.html" target="_blank">Page de manuel de moustique.conf</a</html> |
| |
| <callout icon="fa fa-hand-stop-o" color="red" title="STOP">A partir de la **version 2 de Mosquitto** seule la **connexion sur le réseau local** est acceptée par le broker. \\ Pour effectuer le test précédent entre un courtier situé sur une machine (PC, Raspberry Pi,etc.) et un éditeur/abonné situé sur une autre machine (PC, smartphone, etc.) via un réseau local, il est nécessaire de modifier le fichier de configuration **mosquitto.conf** situé dans **/etc/mosquitto/**. \\ Pour cela : \\ |
| - Ouvrir le fichier mosquitto.conf \\ |
| - Ajouter les interfaces à l'aide de l'option **listener** |
| </callout> |
| |
| <code bash *.bash> |
| # Ouvrir le fichier mosquitto.conf |
| sudo nano /etc/mosquitto/mosquitto.conf |
| </code> |
| |
| //Exemple// : connexion au broker situé sur un Raspberry Pi, sur l'hôte local et sur le réseau local via les interfaces Ethernet et wifi. |
| {{ :raspberrypi:linux:mosquittoconf.png?nolink |}} |
| |
| // Tests // réalisés entre un RaspBerry pi et un smartphone |
| {{ :raspberrypi:linux:mosquittolan.png?nolink&400 |}} |
| Consulter la page [[reseaux:outils:mymqtt|Wiki Réseau - Test d'un broker Mosquitto avec MyMQTT (Android App)]] pour la mise en oeuvre du test. |
==== 3.2. Sous Windows ==== | ==== 3.2. Sous Windows ==== |
Voir ce <html><a href="http://www.steves-internet-guide.com/install-mosquitto-broker/" target="_blank">lien</a></html> pour installer le broker Mosquitto sous Windows, | Voir ce <html><a href="http://www.steves-internet-guide.com/install-mosquitto-broker/" target="_blank">lien</a></html> pour installer le broker Mosquitto sous Windows, |
==== 3.3 Sur un NAS Synology ==== | ==== 3.3 Sur un NAS Synology ==== |
{{ :raspberrypi:linux:synologyico.jpg?nolink&80|}} | {{ :raspberrypi:linux:synologyico.jpg?nolink&80|}} |
* **Source** : <html><a href="https://projetsdiy.fr/installer-mosquitto-nas-synology-fonctionnant-dsm-6-2-docker/" target="_blank">Installer le broker MQTT Mosquitto sur NAS Synology (DSM 6.2+) avec Docker</a></html> | * **Source** : <html><a href="https://www.lesalexiens.fr/actualites/tutoriel-installer-mosquitto-mqtt-sur-nas-synology/" target="_blank">Installer le broker MQTT Mosquitto sur NAS Synology (DSM 6.2+) avec Docker</a></html> |
| |
Le fichier mosquitto.conf se situe dans le dossier **/usr/local/mosquitto/var**. Se connecter en **ssh**. Ouvrir **mosquitto.conf** avec nano et le compléter comme ci-dessous : | Le fichier mosquitto.conf se situe dans le dossier **/usr/local/mosquitto/var**. Se connecter en **ssh**. Ouvrir **mosquitto.conf** avec nano et le compléter comme ci-dessous : |
| |
===== 4 Sécurité ===== | ===== 4 Sécurité ===== |
Cette partie ne sera pas exploitée lors du développement sur un réseau local dans la salle de classe. | <callout type="info" icon="true">Cette partie ne sera pas exploitée lors du développement sur un réseau local dans la salle de classe. A prendre en compte si l'accès au broker se fait via Internet.</callout> |
| |
==== 4.1 Authentification ==== | ==== 4.1 Authentification ==== |
| |
**Fichier de configuration de Mosquitto** \\ | **Fichier de configuration de Mosquitto** \\ |
<callout type="warning" icon="true">Par défaut, le fichier de configuration **mosquitto.conf** situé dans **/etc/mosquitto/** contient :</callout> | <callout type="warning" icon="true">Par défaut, le fichier de configuration **mosquitto.conf** d'un Raspberry Pi, situé dans **/etc/mosquitto/**, contient :</callout> |
| |
<code bash mosquitto.conf> | <code bash mosquitto.conf> |
log_dest file /var/log/mosquitto/mosquitto.log | log_dest file /var/log/mosquitto/mosquitto.log |
include_dir /etc/mosquitto/conf.d | include_dir /etc/mosquitto/conf.d |
| # ------------------------------------------- |
| # A ajouter à partir de la version 2 |
| # ------------------------------------------- |
| listener localhost # actif par défaut mais à ajouter |
| listener @IP1 # si ajout d'@IP(s) |
| listener @IP2 |
| # etc. |
</code> | </code> |
| |
* //**mosquitto.pid**// : le fichier contenant le numéro de processus du démon Mosquitto permettant la gestion du fonctionnement en arrière-plan (mode serveur) | * //**mosquitto.pid**// : le fichier contenant le numéro de processus du démon Mosquitto permettant la gestion du fonctionnement en arrière-plan (mode serveur) |
* //**persistence**// : la directive permettant au serveur de conserver l'état des connexions, des abonnements et des messages dans un fichier enregistré sur le disque. Ceci permet au serveur de recharger ces informations en cas de redémarrage. | * //**persistence**// : la directive permettant au serveur de conserver l'état des connexions, des abonnements et des messages dans un fichier enregistré sur le disque. Ceci permet au serveur de recharger ces informations en cas de redémarrage. |
Le Raspberry pi demande un mot de passe. Entrer //**mot2passe**//. \\ | Le Raspberry pi demande un mot de passe. Entrer //**mot2passe**//. \\ |
| |
**-c** crée le fichier \\ | * **-c** crée le fichier \\ |
**sondes** est l'identifiant | * **sondes** est l'identifiant |
| |
En supprimant -c de la commande ci-dessus, il est possible : | En supprimant -c de la commande ci-dessus, il est possible : |
password_file /etc/mosquitto/passwd | password_file /etc/mosquitto/passwd |
allow_anonymous false # Connexions sans mot de passe non autorisées | allow_anonymous false # Connexions sans mot de passe non autorisées |
</code> | |
| |
> //**password_file**// permet de spécifier le fichier de mots de passe à utiliser | # password_file permet de spécifier le fichier de mots de passe à utiliser |
> //**allow-anonymous**// autorise (**true**) ou non (**false**) les connexions anonymes (sans mot de passe) | # allow-anonymous autorise (**true**) ou non (**false**) les connexions anonymes (sans mot de passe) |
| </code> |
| |
* Redémarrer le serveur | * Redémarrer le serveur |
| |
* //Exemple de résultat// | * //Exemple de résultat// |
{{ :raspberrypi:linux:mosquittosecur.png?nolink&600 |}} | {{ :raspberrypi:linux:mosquittosecur.png?nolink&500 |}} |
| |
| |
* Enregistrement des messages | * Enregistrement des messages |
| |
==== 7.2 MQTTlens ==== | Consulter la page [[reseaux:outils:mymqtt|Wiki Réseau - Test d'un broker Mosquitto avec MyMQTT (Android App)]] pour sa mise en oeuvre. |
| |
| ==== 7.2 MQTTlens : un client pour navigateur ==== |
{{ :raspberrypi:linux:mqttlensico.png?nolink|}} | {{ :raspberrypi:linux:mqttlensico.png?nolink|}} |
MQTTlens est une application Google Chrome, qui se connecte à un courtier MQTT et peut s'abonner et publier sur des sujets MQTT. | MQTTlens est une application Google Chrome, qui se connecte à un courtier MQTT et peut s'abonner et publier sur des sujets MQTT. |