Arduino - MQTT

In diesem Tutorial lernen wir, wie man Arduino verwendet, um Daten an einen MQTT-Broker zu senden und von diesem zu empfangen, wobei das MQTT-Protokoll verwendet wird. Im Detail werden wir Folgendes lernen:

Arduino MQTT

Wir werden zwei verschiedene Anwendungsfälle untersuchen:

Erforderliche Hardware

1×Arduino UNO R4 WiFi
1×Alternativ: DIYables STEM V4 IoT
1×USB-Kabel Typ-A zu Typ-C (für USB-A PC)
1×USB-Kabel Typ-C zu Typ-C (für USB-C PC)
1×(Empfohlen) Schraubklemmenblock-Shield für Arduino Uno R4
1×(Empfohlen) Breadboard-Shield für Arduino Uno R4
1×(Empfohlen) Gehäuse für Arduino Uno R4
1×(Empfohlen) Stromverteiler für Arduino Uno R4
1×(Empfohlen) Prototyping-Grundplatte & Breadboard-Kit für Arduino Uno

Oder Sie können die folgenden Kits kaufen:

1×DIYables STEM V4 IoT Starter-Kit (Arduino enthalten)
1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Über Arduino und MQTT

Angenommen, Sie sind bereits mit dem MQTT-Protokoll vertraut. Falls nicht, recherchieren Sie bitte im Internet. Dieses Tutorial konzentriert sich darauf, Arduino so zu programmieren, dass es Daten mithilfe des MQTT-Protokolls senden und empfangen kann.

Die folgenden Anwendungsfälle von Arduino mit MQTT:

  • Arduino verbindet sich mit einem Online-MQTT-Broker, z. B.: Online-Mosquitto-Broker, AWS IoT...
  • Arduino verbindet sich mit einem MQTT-Broker, der auf Ihrem PC installiert ist, z. B.: Mosquitto-Broker, HiveMQ-Broker
  • Arduino verbindet sich mit einem MQTT-Broker, der auf Ihrem Raspberry Pi installiert ist, z. B.: Mosquitto-Broker
  • Arduino verbindet sich mit einem MQTT-Broker, der in der Cloud installiert ist: z. B. Mosquitto- oder HiveMQ-Broker auf AWS EC2

In diesem Tutorial beginnen wir damit, schnell zu prüfen, ob Arduino eine Verbindung zu einem Online-Mosquitto-Broker herstellen kann. Arduino wird über das Internet Daten an diesen Broker veröffentlichen und sich dort auf Themen abonnieren.

Als Nächstes installieren wir den Mosquitto-Broker auf unserem PC. Anschließend verbinden wir Arduino mit dem MQTT-Broker, der auf unserem PC installiert ist, und setzen das Veröffentlichen und Abonnieren von Daten über diesen lokalen Broker fort.

Sobald Sie dieses Tutorial abgeschlossen haben, können Sie sich weiter umsehen, indem Sie in den folgenden Tutorials mehr über Arduino mit MQTT lernen:

Verbinde Arduino mit einem Online-MQTT-Broker

In diesem Abschnitt lernen wir, wie man Arduino mit test.mosquitto.org verbindet, einem Online-MQTT-Broker, der von Mosquitto betrieben wird. Bitte beachten Sie, dass dieser Broker nur zu Testzwecken verwendet werden sollte.

Arduino-Code

Der unten gezeigte Arduino-Code macht Folgendes:

  • Mit dem MQTT-Broker verbinden
  • Auf ein Thema abonnieren
  • Periodisch Nachrichten auf demselben Thema veröffentlichen, das es abonniert
/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino/arduino-mqtt */ #include <WiFiS3.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-arduino-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 Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "YOUR-NAME-arduino-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-arduino-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); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("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("Arduino - 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("Arduino - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino - 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("Arduino - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Schnelle Schritte

  • Falls dies das erste Mal ist, dass Sie Arduino Uno R4 verwenden, sehen Sie wie man die Umgebung für Arduino Uno R4 in der Arduino IDE einrichtet.
  • Öffnen Sie die Arduino IDE auf Ihrem PC.
  • Öffnen Sie den Bibliotheksverwalter, indem Sie auf das Bibliotheksverwalter-Symbol in der linken Navigationsleiste der Arduino IDE klicken.
  • Geben Sie MQTT in das Suchfeld ein, und suchen Sie dann nach der MQTT-Bibliothek von Joel Gaehwiler.
  • Klicken Sie auf die Install-Schaltfläche, um die MQTT-Bibliothek zu installieren.
Arduino-MQTT-Bibliothek
  • Geben Sie ArduinoJson in das Suchfeld ein, und suchen Sie dann nach der ArduinoJson-Bibliothek von Benoit Blanchon.
  • Klicken Sie auf die Installieren-Schaltfläche, um die ArduinoJson-Bibliothek zu installieren.
ArduinoJson-Bibliothek
  • Kopieren Sie den obigen Code und öffnen Sie ihn mit der Arduino IDE.
  • Ersetzen Sie die WiFi-Informationen (SSID und Passwort) im Code durch Ihre eigenen.
  • Im Code sehen Sie dreimal das Wort 'YOUR-NAME'. Ersetzen Sie dieses Wort durch Ihren Namen oder zufällige Zeichen (nur Buchstaben des Alphabets, keine Leerzeichen). Dies ist notwendig, weil sonst mehrere Personen denselben Code gleichzeitig ausführen könnten, was zu Konflikten führen könnte, da die MQTT-Client-IDs und Topics für alle gleich sind.
  • Klicken Sie auf die Hochladen-Schaltfläche in der Arduino IDE, um den Code auf den Arduino hochzuladen.
  • Öffnen Sie den seriellen Monitor.
  • Sehen Sie das Ergebnis im seriellen Monitor.
COM6
Send
IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: YOUR-NAME-arduino-001/loopback Arduino - MQTT broker Connected! Arduino - sent to MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload:{"timestamp":11757,"data":255} Arduino - received from MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload: {"timestamp":11757,"data":255} Arduino - sent to MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload:{"timestamp":16896,"data":259} Arduino - received from MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Wie Sie sehen können, veröffentlicht Arduino Nachrichten an den MQTT-Broker und erhält dann dieselbe Nachricht zurück. Das liegt daran, dass der obige Code dasselbe Thema abonniert, über das er Daten veröffentlicht. Wenn Sie nicht möchten, dass Arduino die Nachricht empfängt, die es veröffentlicht, machen Sie einfach das SUBSCRIBE-Thema unterschiedlich vom PUBLISH-Thema.

Verbinden Sie Arduino mit dem MQTT-Broker, der auf Ihrem PC installiert ist

Mosquitto MQTT-Broker installieren

  • Lade den Mosquitto MQTT Broker herunter
  • Installiere es auf dem Laufwerk D: statt auf dem Laufwerk C:. Vermeide es, den Mosquitto MQTT Broker auf dem Laufwerk C: zu installieren, um potenzielle Probleme zu vermeiden.

Mosquitto MQTT-Broker starten

Nun prüfen wir, ob der MQTT-Broker ordnungsgemäß funktioniert, indem wir diese Schritte befolgen:

  • Gehen Sie in das Verzeichnis, in dem Mosquitto installiert wurde. Zum Beispiel: D:\Draft\mosquitto>
  • Erstellen Sie eine neue Datei mit dem Namen test.conf, kopieren Sie den folgenden Inhalt und speichern Sie ihn in diesem Verzeichnis:
listener 1883 allow_anonymous true
  • Führen Sie eine Eingabeaufforderung als Administrator auf Ihrem PC aus. Nennen wir es Broker Window. Schließen Sie es nicht bis zum Ende der Anleitung.
Windows-Eingabeaufforderung Administrator
  • Führe die untenstehenden Befehle nacheinander aus:
cd /d D:\Draft\mosquitto mosquitto -v -c test.conf
  • Sie werden sehen:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\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
  • Öffnen Sie eine weitere Eingabeaufforderung als Administrator auf Ihrem PC.
  • Finden Sie die IP-Adresse Ihres PCs, indem Sie den untenstehenden Befehl ausführen:
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 . . . . . . . . . :
  • Notieren Sie die IP-Adresse für eine spätere Verwendung. Im obigen Beispiel: 192.168.0.26

Prüfen, ob der Mosquitto-Broker funktioniert

  • Öffne eine weitere Eingabeaufforderung als Administrator auf deinem PC. Wir nennen es Abonnentenfenster.
  • Abonniere ein Thema, indem du die untenstehenden Befehle nacheinander ausführst (ersetze durch deine IP-Adresse):
cd /d D:\Draft\mosquitto mosquitto_sub -h 192.168.0.26 -p 1883 -t arduino-001/send
  • Öffnen Sie eine weitere Eingabeaufforderung mit Administratorrechten auf Ihrem PC. Wir nennen sie Publisher-Fenster.
  • Veröffentlichen Sie eine Nachricht im selben Thema, indem Sie die untenstehenden Befehle nacheinander ausführen (ersetzen Sie sie durch Ihre IP-Adresse):
cd /d D:\Draft\mosquitto mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/send -m "Hello, MQTT!"
  • Du wirst sehen:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/send -m "Hello, MQTT!" D:\Draft\mosquitto>

Sie werden sehen, dass diese Nachricht an das Abonnentenfenster wie folgt weitergeleitet wird:

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

Jetzt haben Sie den Mosquitto-MQTT-Broker auf Ihrem PC erfolgreich installiert. Bitte schließen Sie NICHT drei Fenster: Broker-Fenster, Abonnentenfenster und Verlegerfenster. Wir werden sie als Nächstes verwenden.

Arduino-Code

Der unten stehende Arduino-Code bewirkt Folgendes:

  • Mit dem MQTT-Broker verbinden
  • Zu einem Topic abonnieren
  • Periodisch Nachrichten an ein anderes Topic veröffentlichen
/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino/arduino-mqtt */ #include <WiFiS3.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 char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "arduino-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 Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "arduino-001/send"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "arduino-001/receive"; // 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); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("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("Arduino - 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("Arduino - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino - 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("Arduino - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino - 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"]; */ }

Schnelle Schritte

  • Kopieren Sie den obigen Code und öffnen Sie ihn mit der Arduino-IDE
  • Ersetzen Sie die WiFi-Informationen (SSID und Passwort) im Code durch Ihre eigenen.
  • Ersetzen Sie die MQTT-Brokeradresse im Code (Domänenname oder IP-Adresse).
  • Klicken Sie in der Arduino-IDE auf die Schaltfläche Hochladen, um den Code auf den Arduino hochzuladen

Nachricht von Arduino an den PC über MQTT senden

Arduino-Codes veröffentlichen Daten zum MQTT-Thema arduino-001/send, Abonnentenfenster auf dem PC, abonnieren Sie dieses Thema, um die Daten zu empfangen.

  • Öffne den seriellen Monitor, du wirst sehen, dass Arduino periodisch eine Nachricht auf einem Topic veröffentlicht.
COM6
Send
IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: arduino-001/receive Arduino - MQTT broker Connected! Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":10708,"data":311} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":15837,"data":298} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":20965,"data":291} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Überprüfen Sie das Abonnentenfenster. Sie werden sehen, dass es die von Arduino veröffentlichte Nachricht, wie unten gezeigt, empfängt:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t arduino-001/send Hello, MQTT! {"timestamp":10708,"data":311} {"timestamp":15837,"data":298} {"timestamp":20965,"data":291} {"timestamp":26094,"data":286}

Nachricht vom PC an Arduino über MQTT senden

Arduino abonniert das Thema arduino-001/receive; Publisher Window auf dem PC veröffentlicht eine Nachricht an dieses Thema, um sie an den Arduino zu senden.

  • Veröffentliche eine Nachricht an das Thema, das Arduino abonniert hat, indem du den folgenden Befehl im Publisher Window ausführst:
mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/receive -m "Hello, Arduino!"
  • Sie werden sehen, dass diese Nachricht im Serial Monitor vom Arduino empfangen wird, wie unten zu sehen ist:
COM6
Send
Arduino - received from MQTT: - topic: arduino-001/receive - payload: Hello, Arduino!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!