8.4 IoT-Kommunikation mit MQTT¶
Dieses Projekt konzentriert sich auf die Nutzung von MQTT, einem beliebten Kommunikationsprotokoll im Bereich des Internets der Dinge (IoT). MQTT ermöglicht es IoT-Geräten, Daten über ein Publish/Subscribe-Modell auszutauschen, bei dem Geräte über Themen kommunizieren.
In diesem Projekt erforschen wir die Implementierung von MQTT, indem wir einen Schaltkreis aufbauen, der eine LED, einen Knopf und einen Thermistor umfasst. Der ESP32-WROOM-32E-Mikrocontroller wird verwendet, um eine Verbindung zum WLAN herzustellen und mit einem MQTT-Broker zu kommunizieren. Der Code ermöglicht es dem Mikrocontroller, sich für bestimmte Themen zu abonnieren, Nachrichten zu empfangen und die LED basierend auf den empfangenen Informationen zu steuern. Zusätzlich demonstriert das Projekt das Veröffentlichen von Temperaturdaten vom Thermistor zu einem festgelegten Thema, wenn der Knopf gedrückt wird.
Benötigte Komponenten
Für dieses Projekt benötigen wir folgende Komponenten.
Es ist definitiv praktisch, ein komplettes Set zu kaufen. Hier ist der Link:
Name |
ARTIKEL IN DIESEM KIT |
LINK |
---|---|---|
ESP32 Starter Kit |
320+ |
Sie können sie auch einzeln über die untenstehenden Links kaufen.
KOMPONENTENVORSTELLUNG |
KAUF-LINK |
---|---|
- |
|
Code hochladen
Bauen Sie den Schaltkreis.
Bemerkung
Bei der Herstellung einer Verbindung zum WLAN können nur die Pins 36, 39, 34, 35, 32, 33 für die Analogmessung verwendet werden. Bitte stellen Sie sicher, dass der Thermistor mit diesen festgelegten Pins verbunden ist.
Verbinden Sie dann ESP32-WROOM-32E mit dem Computer über das USB-Kabel.
Öffnen Sie den Code.
Öffnen Sie die Datei
iot_4_mqtt.ino
, die sich im Verzeichnisesp32-starter-kit-main\c\codes\iot_4_mqtt
befindet, oder kopieren Sie den Code in die Arduino IDE.Nachdem Sie das Board (ESP32 Dev Module) und den passenden Port ausgewählt haben, klicken Sie auf den Upload-Knopf.
Hier wird die Bibliothek
PubSubClient
verwendet, die Sie über den Library Manager installieren können.
Suchen Sie die folgenden Zeilen und ändern Sie sie mit Ihrem
<SSID>
und<PASSWORD>
.// Replace the next variables with your SSID/Password combination const char* ssid = "<SSID>"; const char* password = "<PASSWORD>";
Finden Sie die nächste Zeile und ändern Sie Ihren
unique_identifier
. Stellen Sie sicher, dass Ihrunique_identifier
wirklich einzigartig ist, da identische IDs, die versuchen, sich bei demselben MQTT-Broker anzumelden, zu einem Anmeldefehler führen können.// Add your MQTT Broker address, example: const char* mqtt_server = "broker.hivemq.com"; const char* unique_identifier = "sunfounder-client-sdgvsda";
Themenabonnement
Um Störungen durch Nachrichten anderer Teilnehmer zu vermeiden, können Sie es als obskuren oder ungewöhnlichen String setzen. Ersetzen Sie einfach das aktuelle Thema
SF/LED
mit Ihrem gewünschten Themennamen.Bemerkung
Sie haben die Freiheit, das Thema als jeden beliebigen Charakter festzulegen. Jedes MQTT-Gerät, das das gleiche Thema abonniert hat, kann dieselbe Nachricht empfangen. Sie können auch gleichzeitig mehrere Themen abonnieren.
void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(unique_identifier)) { Serial.println("connected"); // Subscribe client.subscribe("SF/LED"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } }
Ändern Sie die Funktionalität, um auf das abonnierte Thema zu reagieren. Im bereitgestellten Code wird geprüft, ob eine Nachricht zum Thema
SF/LED
empfangen wurde und ob die Nachrichton
oderoff
ist. Abhängig von der empfangenen Nachricht ändert es den Ausgabestatus, um den LED-Zustand zu steuern.Bemerkung
Sie können es für jedes Thema, das Sie abonniert haben, anpassen und Sie können mehrere if-Anweisungen schreiben, um auf mehrere Themen zu reagieren.
void callback(char* topic, byte* message, unsigned int length) { Serial.print("Message arrived on topic: "); Serial.print(topic); Serial.print(". Message: "); String messageTemp; for (int i = 0; i < length; i++) { Serial.print((char)message[i]); messageTemp += (char)message[i]; } Serial.println(); // If a message is received on the topic "SF/LED", you check if the message is either "on" or "off". // Changes the output state according to the message if (String(topic) == "SF/LED") { Serial.print("Changing state to "); if (messageTemp == "on") { Serial.println("on"); digitalWrite(ledPin, HIGH); } else if (messageTemp == "off") { Serial.println("off"); digitalWrite(ledPin, LOW); } } }
Nachdem Sie das richtige Board (ESP32 Dev Module) und den Port ausgewählt haben, klicken Sie auf den Upload-Knopf.
Öffnen Sie den seriellen Monitor und wenn die folgenden Informationen gedruckt werden, zeigt dies eine erfolgreiche Verbindung zum MQTT-Server an.
WiFi connected IP address: 192.168.18.77 Attempting MQTT connection...connected
Nachrichtenpublikation über HiveMQ
HiveMQ ist eine Messaging-Plattform, die als MQTT-Broker fungiert und schnellen, effizienten und zuverlässigen Datentransfer zu IoT-Geräten ermöglicht.
Unser Code nutzt speziell den MQTT-Broker von HiveMQ. Wir haben die Adresse des HiveMQ MQTT-Brokers im Code wie folgt aufgenommen:
// Add your MQTT Broker address, example: const char* mqtt_server = "broker.hivemq.com";
Öffnen Sie jetzt HiveMQ Web Client in Ihrem Webbrowser.
Verbinden Sie den Client mit dem Standard-öffentlichen Proxy.
Veröffentlichen Sie eine Nachricht im Thema, das Sie abonniert haben. In diesem Projekt können Sie
on
oderoff
veröffentlichen, um Ihre LED zu steuern.
Nachrichtenpublikation an MQTT
Wir können den Code auch nutzen, um Informationen an das Thema zu senden. In dieser Demonstration haben wir eine Funktion codiert, die die von dem Thermistor gemessene Temperatur an das Thema sendet, wenn Sie den Knopf drücken.
Klicken Sie auf Add New Topic Subscription.
Geben Sie die Themen ein, denen Sie folgen möchten, und klicken Sie auf Subscribe. Im Code senden wir Temperaturinformationen an das Thema
SF/TEMP
.void loop() { if (!client.connected()) { reconnect(); } client.loop(); // if the button pressed, publish the temperature to topic "SF/TEMP" if (digitalRead(buttonPin)) { long now = millis(); if (now - lastMsg > 5000) { lastMsg = now; char tempString[8]; dtostrf(thermistor(), 1, 2, tempString); client.publish("SF/TEMP", tempString); } } }
Daher können wir dieses Thema auf HiveMQ überwachen und die von Ihnen veröffentlichten Informationen einsehen.