ESP8266 - MQTT

Dans ce tutoriel, nous allons explorer comment utiliser l'ESP8266 pour envoyer et recevoir des données avec un courtier MQTT en utilisant le protocole MQTT. Plus précisément, nous aborderons les points suivants :

ESP8266 NodeMCU MQTT

Nous examinerons deux scénarios distincts :

Préparation du matériel

1×ESP8266 NodeMCU
1×Micro USB Cable
1×(Optional) ESP8266 Screw Terminal Adapter

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos de ESP8266 et MQTT

Si vous n'êtes pas encore familiarisé avec le protocole MQTT, vous pouvez trouver des informations à ce sujet en ligne. Ce tutoriel se concentre sur l'utilisation de l'ESP8266 pour l'envoi et la réception de données via MQTT.

Voici quelques façons d'utiliser ESP8266 avec MQTT :

  • Vous pouvez connecter ESP8266 à un courtier MQTT en ligne tel que Mosquitto ou AWS IoT.
  • Alternativement, vous pouvez relier ESP8266 à un courtier MQTT installé sur votre ordinateur, comme Mosquitto ou HiveMQ.
  • Si vous avez un Raspberry Pi, ESP8266 peut se connecter à un courtier MQTT qui y fonctionne, par exemple, Mosquitto.
  • De plus, ESP8266 peut être connecté à un courtier MQTT basé sur le cloud, tel que Mosquitto ou HiveMQ sur AWS EC2.

Dans ce tutoriel, nous commencerons par tester si l'ESP8266 peut se connecter à un courtier Mosquitto en ligne. Nous démontrerons la capacité de l'ESP8266 à envoyer et recevoir des données via ce courtier sur Internet.

Ensuite, nous vous guiderons dans la configuration du courtier Mosquitto sur votre ordinateur. L'ESP8266 se connectera ensuite à ce courtier local, vous permettant de continuer à envoyer et recevoir des données.

Une fois ce tutoriel terminé, vous pourrez approfondir vos connaissances en explorant ces tutoriels supplémentaires :

Ces ressources fourniront un complément d'information sur les sujets associés.

Connectez ESP8266 à un courtier MQTT en ligne

Dans cette partie, nous apprendrons comment connecter l'ESP8266 à test.mosquitto.org, un courtier MQTT en ligne créé par Mosquitto. Veuillez noter que ce courtier doit être utilisé uniquement à des fins de test.

Code ESP8266

Le code ESP8266 ci-dessous fait :

  • Se connecter au courtier MQTT
  • S'abonner à un sujet
  • Publier des messages périodiquement sur le même sujet auquel il est abonné
/* * Ce code ESP8266 NodeMCU a été développé par newbiely.fr * Ce code ESP8266 NodeMCU est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp8266/esp8266-mqtt */ #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "YOUR-NAME-esp8266-001"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP8266 should publish/subscribe const char PUBLISH_TOPIC[] = "YOUR-NAME-esp8266-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-esp8266-001/loopback"; // CHANGE IT AS YOU DESIRE const int PUBLISH_INTERVAL = 5000; // 5 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP8266 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP8266 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Étapes rapides

Pour commencer avec ESP8266 sur Arduino IDE, suivez ces étapes :

  • Consultez le tutoriel comment configurer l'environnement pour ESP8266 sur Arduino IDE si c'est la première fois que vous utilisez ESP8266.
  • Connectez la carte ESP8266 à votre ordinateur à l'aide d'un câble USB.
  • Ouvrez l'Arduino IDE sur votre ordinateur.
  • Choisissez la bonne carte ESP8266, par exemple NodeMCU 1.0 (Module ESP-12E), et son port COM respectif.
  • Ouvrez le Gestionnaire de bibliothèques en cliquant sur l'icône Gestionnaire de bibliothèques dans la barre de navigation gauche de l'Arduino IDE.
  • Tapez MQTT dans la boîte de recherche, puis cherchez la bibliothèque MQTT de Joel Gaehwiler.
  • Cliquez sur le bouton Install pour installer la bibliothèque MQTT.
Bibliothèque MQTT ESP8266 NodeMCU
  • Tapez ArduinoJson dans la zone de recherche, puis recherchez la bibliothèque ArduinoJson de Benoit Blanchon.
  • Cliquez sur le bouton Install pour installer la bibliothèque ArduinoJson.
Bibliothèque Json ESP8266 NodeMCU
  • Copiez le code ci-dessus et ouvrez-le avec l'IDE Arduino
  • Remplacez les informations WiFi (SSID et mot de passe) dans le code par les vôtres.
  • Dans le code, vous verrez le mot 'VOTRE-NOM' trois fois. Remplacez ce mot par votre nom ou des caractères aléatoires (uniquement des caractères alphabétiques, sans espaces). Cela est nécessaire car si vous ne faites pas le changement, il pourrait y avoir plusieurs personnes exécutant ce code en même temps, ce qui pourrait entraîner des conflits car les identifiants et les sujets des clients MQTT sont les mêmes pour tout le monde.
  • Cliquez sur le bouton Upload dans l'IDE Arduino pour téléverser le code sur ESP8266
  • Ouvrez le moniteur série
  • Voir le résultat sur le moniteur série.
COM6
Send
ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: YOUR-NAME-esp8266-001/loopback ESP8266 - MQTT broker Connected! ESP8266 - sent to MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload:{"timestamp":11757,"data":255} ESP8266 - received from MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload: {"timestamp":11757,"data":255} ESP8266 - sent to MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload:{"timestamp":16896,"data":259} ESP8266 - received from MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Comme vous pouvez le voir, l'ESP8266 publie des messages sur le courtier MQTT, puis reçoit le même message en retour. Cela est dû au fait que le code ci-dessus s'abonne au même sujet sur lequel il publie des données. Si vous ne voulez pas que l'ESP8266 reçoive le message qu'il publie, il suffit de rendre le sujet de SOUSCRIPTION différent du sujet de PUBLICATION.

Connectez l'ESP8266 au courtier MQTT installé sur votre PC.

Installer le courtier MQTT Mosquitto

  • Téléchargez le Broker MQTT Mosquitto
  • Installez-le sur le disque D: au lieu du disque C:. Évitez d'installer le broker Mosquitto sur le disque C: pour prévenir d'éventuels problèmes.

Exécutez le courtier MQTT Mosquitto

Vérifions maintenant si le courtier MQTT fonctionne correctement en suivant ces étapes :

  • Accédez au répertoire où Mosquitto a été installé. Par exemple : D:\mqtt\mosquitto>
  • Créez un nouveau fichier nommé test.conf, copiez le contenu ci-dessous et enregistrez-le dans ce répertoire :
listener 1883 allow_anonymous true
  • Exécutez une invite de commande en tant qu'administrateur sur votre PC. Appelons-la Fenêtre Broker. Ne la fermez pas avant la fin du tutoriel.
Invite de commandes administrateur Windows
  • Exécutez les commandes ci-dessous une par une :
cd /d D:\mqtt\mosquitto mosquitto -v -c test.conf
  • Vous verrez :
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto -v -c test.conf 1710918939: mosquitto version 2.0.18 starting 1710918939: Config loaded from test.conf. 1710918939: Opening ipv6 listen socket on port 1883. 1710918939: Opening ipv4 listen socket on port 1883. 1710918939: mosquitto version 2.0.18 running
  • Ouvrez une autre invite de commande en tant qu'administrateur sur votre PC.
  • Trouvez l'adresse IP de votre PC en exécutant la commande ci-dessous :
ipconfig
Command Prompt
C:\WINDOWS\system32>ipconfig Windows IP Configuration Ethernet adapter: Subnet Mask . . . . . . . . . . . : 255.0.0.0 IPv4 Address. . . . . . . . . . . : 192.168.0.26 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . :
  • Notez l'adresse IP pour une utilisation ultérieure. Dans l'exemple ci-dessus : 192.168.0.26

Tester si le Broker Mosquitto fonctionne

  • Ouvrez une autre invite de commande en tant qu'administrateur sur votre PC. Appelons-la Fenêtre d'abonné
  • Abonnez-vous à un sujet en exécutant les commandes ci-dessous une par une (remplacez par votre adresse IP) :
cd /d D:\mqtt\mosquitto mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send
  • Ouvrez une autre invite de commande en tant qu'administrateur sur votre PC. Appelons-la Fenêtre de l'éditeur
  • Publiez un message sur le même sujet en exécutant les commandes ci-dessous une par une (remplacez par votre adresse IP):
cd /d D:\mqtt\mosquitto mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/send -m "Hello, MQTT!"
  • Vous verrez :
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/send -m "Hello, MQTT!" D:\mqtt\mosquitto>

Vous verrez que le message est transmis à la Fenêtre de l'Abonné comme suit :

Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send Hello, MQTT!

Maintenant, vous avez réussi à installer le courtier MQTT Mosquitto sur votre PC. Veuillez NE PAS fermer trois fenêtres : Fenêtre du Courtier, Fenêtre de l'Abonné et Fenêtre de l'Éditeur. Nous les utiliserons ensuite.

Code ESP8266

Le code ESP8266 ci-dessous fait :

  • Se connecter au courtier MQTT
  • S'abonner à un sujet
  • Publier périodiquement des messages à un autre sujet
/* * Ce code ESP8266 NodeMCU a été développé par newbiely.fr * Ce code ESP8266 NodeMCU est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp8266/esp8266-mqtt */ #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> #define CLIENT_ID "ESP8266-001" // CHANGE IT AS YOU DESIRE const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED // The MQTT topics that this device should publish/subscribe #define PUBLISH_TOPIC "esp8266-001/send" #define SUBSCRIBE_TOPIC "esp8266-001/receive" #define PUBLISH_INTERVAL 5000 // 4 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP8266 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP8266 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); // You can process the incoming data as json object, then control something /* StaticJsonDocument<200> doc; deserializeJson(doc, payload); const char* message = doc["message"]; */ }

Étapes rapides

  • Copiez le code ci-dessus et ouvrez-le avec l'IDE Arduino.
  • Remplacez les informations WiFi (SSID et mot de passe) dans le code par les vôtres.
  • Remplacez l'adresse du courtier MQTT dans le code (nom de domaine ou adresse IP).
  • Cliquez sur le bouton Upload sur l'IDE Arduino pour charger le code sur ESP8266.

Envoyer un message de l'ESP8266 au PC via MQTT

Les codes ESP8266 publient des données sur le sujet MQTT esp8266-001/send, la Fenêtre d'Abonné sur PC s'abonne à ce sujet pour recevoir les données.

  • Ouvrez le moniteur série, vous verrez l'ESP8266 publier périodiquement un message sur un sujet.
COM6
Send
ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: esp8266-001/receive ESP8266 - MQTT broker Connected! ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":10708,"data":311} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":15837,"data":298} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":20965,"data":291} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Vérifiez la fenêtre d'abonné, vous verrez qu'elle reçoit le message publié par l'ESP8266 comme ci-dessous :
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send Hello, MQTT! {"timestamp":10708,"data":311} {"timestamp":15837,"data":298} {"timestamp":20965,"data":291} {"timestamp":26094,"data":286}

Envoyer un message du PC à l'ESP8266 via MQTT

ESP8266 s'abonne au sujet esp8266-001/receive, Fenêtre d'Éditeur sur PC publie un message à ce sujet pour l'envoyer à l'ESP8266.

  • Publiez un message sur le sujet auquel l'ESP8266 est abonné en exécutant la commande suivante dans la fenêtre de publication :
mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/receive -m "Hello, ESP8266!"
  • Vous verrez que ce message est reçu par ESP8266 sur le moniteur série comme ci-dessous :
COM6
Send
ESP8266 - received from MQTT: - topic: esp8266-001/receive - payload: Hello, ESP8266!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Vidéo

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!