Dieser Leitfaden bietet ein umfassendes Tutorial zum Anschluss eines MQTT-Clients, der auf einem ESP32 Gerät zu unseremMQTT Brokeroder einen Broker Ihrer Wahl. Es umfasst wesentliche Aufgaben wie die Einrichtung Verbindungen, Anmeldung zu Themen, Abschreiben und Austausch von Nachrichten. Durch diese Schritte können Sie effektiv IntegrationMQTKommunikation in Ihre IoT-Projekte.
Bevor Sie beginnen, stellen Sie sicher, dass Sie:
Arduino IDE installieren
Downloaden und installieren Sie die Arduino IDE von der offiziellen Arduino Website.
Installieren Sie das ESP32 Board Package
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Wenn es bereits URLs in diesem Bereich gibt, können Sie haben es geschafft Mit Kommas.
Wählen Sie das ESP32 Board
Benötigte Bibliotheken installieren
ANHANG Sie einfach auf die gestellte Bibliothek und klicken Sie dann auf Installieren Knopf.
Installation überprüfen
Feste Konstanten
Ersetzen Sie Ihr_wifi_ssid, Ihr_wifi_password, mqt_server und mqt_port mit Ihrem aktuellen WiFi und MQTT Broker Details.
/ WiFi
const char *ssid = "xxxxx"; // Geben Sie Ihr WLAN-Ssid
const char *password = "xxxxx"; // Geben Sie WiFi-Passwort ein
// MQTT Broker
const char *mqt_server = "public-mqtt-broker.bevywise.com";
const int mqt_port = 1883;
const char *mqtt_username = "username"; (optional)
const char *mqt_password = "pwd"; (optional)
Dieser Abschnitt hat Code-Snippets von verschiedenen Möglichkeiten, um mit MQTT Broker zu verbinden. Stellen Sie sicher, dass der MQTT Broker unterstützt den Verbindungstyp, den Sie verwenden möchten. Auch erhalten die entsprechenden Verbindungsparameter des MQTT Broker (Adresse, Port, Benutzername/Passwort, CA Certificate)
MQT Über TCP
Verwenden Sie den folgenden Code, um den Client über TCP zu verbinden. Definieren Sie die Macro ADDRESS mit den Verbindungsparametern von MQTT Broker.
Für MQTT 3.1.1:
WiFi.begin(ssid, passwort);
während (WiFi.status() != WL_CONNECTED)
{\cHFFFF}
Verzögerung(500)
Serial.println("Connecting to WiFi..");
}
const char *client_id = “esp_client”;
client.setServer(mqt_server,mqtt_port);
Für MQTT 5:
AsyncMqtClient mqtClient;
Leere Verbindung ToWifi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, passwort);
während (WiFi.status() != WL_CONNECTED {
Verzögerung(500)
Serial.print(");
}
Serial.println("WiFi verbunden");
}
ungültig aufMqtConnect(bool sessionPresent) {
Serial.println("Connected to MQTT.");
// Sie können Themen hier abonnieren
// mqtClient.subscribe("test/topic", 1);
}
Nichtigkeitseinstellung() {\cHFFFF}
Serial.begin(115200);
ConnectToWifi();
mqtClient.onConnect(onMqtConnect);
mqttClient.setServer (mqtt_server, mqt_port);
mqtClient.setClientId(client_id);
// Legen Sie die Protokollversion auf MQTT 5.0
mqtClient.setProtocolVersion(5);
mqtClient.connect();
}
MQTT über TLS / SSL
Verwenden Sie den folgenden Code, um sicher mit MQTT Broker über TLS zu verbinden. Definieren Sie die Macro ADDRESS mit den Verbindungsparametern von MQTT Broker.
#include <WiFiClientSecure.h>
// Root CA Zertifikat für den MQTT Broker
* root_ca = \
"-----------------
"YOUR_ROOT_CA_CERTIFICATE\n" \
"------END KERTIFIKATE-----------\n";
// init wifi sicher Client
WiFiClientSecure espClient;
PubSubClient Client(espClient);
espClient.setCACert(root_ca);
espClient.setCertificate(server_cert); //für Client-Verifikation
espClient.setPrivateKey(server_key); // für Client-Verifikation
Setzen Sie TLS-Parameter vor dem Aufruf der MQTTClient_connect, um den Client zu verbinden der mQTT Broker sicher über TLS.
Wenn der MQTT Broker in einem vertrauenswürdigen Server gehostet wird und die Serververifikation nicht erforderlich, der folgende Code kann verwendet werden, um TLS-Optionen einzustellen:
// MQTT Broker Einstellungen
const char* mqt_server = "your_mqt_server";
const uint16_t mqt_port = 8883; // Typischerweise wird Port 8883 für
MQTT über TLS
const char* client_id = createClientId(kristall_, Länge);
// Initialisieren Sie WiFi und MQTT-Kunden
WiFiClientSecure espClient;
PubSubClient mqtClient(espClient);
Leere Verbindung ToWifi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, passwort);
während (WiFi.status() != WL_CONNECTED {
Verzögerung(500)
Serial.print(");
}
Serial.println("WiFi verbunden");
}
Leere VerbindungToMqt() {
// Server-Zertifizierung deaktivieren
espClient.setInsecure();
mqttClient.setServer (mqtt_server, mqt_port);
mqtClient.setCallback (mqttCallback)
während (!mqtClient.connected()) {\cHFFFF}
Serial.print("Connecting to MQTT... ");
wenn (mqtClient.connect(client_id)) {\cHFFFF}
Serial.println("verbunden");
// Abonnieren Sie Themen oder veröffentlichen Sie Nachrichten hier
// mqtClient.subscribe("your/topic");
} auch
Serial.print("veröffentlicht mit Zustand ");
Serial.print(mqtClient.state());
Verzögerung(2000)
}
}
}
Nichtigkeitseinstellung() {\cHFFFF}
Serial.begin(115200);
ConnectToWifi();
verbindenToMqt();
}
Leerschleife() {\cHFFFF}
// Stellen Sie sicher, dass der MQTT-Client angeschlossen bleibt
wenn (!mqtClient.connected()) {\cHFFFF}
verbindenToMqt();
}
mqttClient.loop();
}
Wenn das MQTT Broker Serverzertifikat von einer Trusted CA ausgestellt hat, dann der Server Zertifikat kann mit:
/ Root CA Zertifikat für den MQTT Broker
* root_ca = \
"-----------------
"YOUR_ROOT_CA_CERTIFICATE\n" \
"------END KERTIFIKATE-----------\n";
// Initialisieren Sie WiFi und MQTT-Kunden
WiFiClientSecure espClient;
PubSubClient mqtClient(espClient);
Leere Verbindung ToWifi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, passwort);
während (WiFi.status() != WL_CONNECTED {
Verzögerung(500)
Serial.print(");
}
Serial.println("WiFi verbunden");
}
Leere VerbindungToMqt() {
// Legen Sie das root CA-Zertifikat fest
espClient.setCACert(root_ca);
mqttClient.setServer (mqtt_server, mqt_port);
mqtClient.setCallback (mqttCallback)
während (!mqtClient.connected()) {\cHFFFF}
Serial.print("Connecting to MQTT... ");
wenn (mqtClient.connect(client_id)) {\cHFFFF}
Serial.println("verbunden");
// Abonnieren Sie Themen oder veröffentlichen Sie Nachrichten hier
// mqtClient.subscribe("your/topic");
} auch
Serial.print("veröffentlicht mit Zustand ");
Serial.print(mqtClient.state());
Verzögerung(2000)
}
}
}
Nichtigkeitseinstellung() {\cHFFFF}
Serial.begin(115200);
ConnectToWifi();
verbindenToMqt();
}
Leerschleife() {\cHFFFF}
// Stellen Sie sicher, dass der MQTT-Client angeschlossen bleibt
wenn (!mqtClient.connected()) {\cHFFFF}
verbindenToMqt();
}
mqttClient.loop();
}
Wenn der MQTT Broker ein selbstsigniertes Serverzertifikat besitzt dann kann das Server-Zertifikat mit dem Root-Zertifikat aus MQTT Broker:
// Selbstsignierte Root-Zertifikat für den MQTT Broker
* root_ca = \
"-----------------
"YOUR_SELF_SIGNED_ROOT_CERTIFICATE\n" \
"------END KERTIFIKATE-----------\n";
// Initialisieren Sie WiFi und MQTT-Kunden
WiFiClientSecure espClient;
PubSubClient mqtClient(espClient);
Leere Verbindung ToWifi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, passwort);
während (WiFi.status() != WL_CONNECTED {
Verzögerung(500)
Serial.print(");
}
Serial.println("WiFi verbunden");
}
Leere VerbindungToMqt() {
// Setzen Sie das selbstsignierte Wurzelzertifikat CA
espClient.setCACert(root_ca);
mqttClient.setServer (mqtt_server, mqt_port);
mqtClient.setCallback (mqttCallback)
während (!mqtClient.connected()) {\cHFFFF}
Serial.print("Connecting to MQTT... ");
wenn (mqtClient.connect(client_id)) {\cHFFFF}
Serial.println("verbunden");
// Abonnieren Sie Themen oder veröffentlichen Sie Nachrichten hier
// mqtClient.subscribe("your/topic");
} auch
Serial.print("veröffentlicht mit Zustand ");
Serial.print(mqtClient.state());
Verzögerung(2000)
}
}
}
Nichtigkeitseinstellung() {\cHFFFF}
Serial.begin(115200);
ConnectToWifi();
verbindenToMqt();
}
Leerschleife() {\cHFFFF}
// Stellen Sie sicher, dass der MQTT-Client angeschlossen bleibt
wenn (!mqtClient.connected()) {\cHFFFF}
verbindenToMqt();
}
mqttClient.loop();
}
MQTT über WebSocket
Definieren Sie die MQTT Broker Adresse wie diese, um den Client über WebSocket zu verbinden.
#include <PubSubClient.h>
#include <WebSocketsClient.h>
// MQTT Broker Einstellungen
const char* mqt_server = "public-mqtt-broker.bevywise.com";
const uint16_t mqt_port = 10443; // WebSocket ohne TLS läuft in der Regel
auf dem Hafen 80
const char* client_id = createClientId(kristall_, Länge);
// Initialisieren Sie WiFi und MQTT-Kunden
WiFiClient espClient;
PubSubClient mqtClient(espClient);
Leere Verbindung ToWifi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, passwort);
während (WiFi.status() != WL_CONNECTED {
Verzögerung(500)
Serial.print(");
}
Serial.println("WiFi verbunden");
}
Leere VerbindungToMqt() {
mqttClient.setServer (mqtt_server, mqt_port);
mqtClient.setCallback (mqttCallback)
während (!mqtClient.connected()) {\cHFFFF}
Serial.print("Connecting to MQTT over WebSocket... ");
wenn (mqtClient.connect(client_id)) {\cHFFFF}
Serial.println("verbunden");
// Abonnieren Sie Themen oder veröffentlichen Sie Nachrichten hier
// mqtClient.subscribe("your/topic");
} auch
Serial.print("veröffentlicht mit Zustand ");
Serial.print(mqtClient.state());
Verzögerung(2000)
}
}
}
mqttCallback(char*-Thema, byte* Nutzlast, unbezeichnet int Länge) {\cHFFFF}
// eingehende Nachrichten ausschalten
Serial.print("Message kam zum Thema: ");
Serial.print(topisch);
Serial.print(". Nachricht: ");
für (unsigniert int i = 0; i < Länge; i++) {\cHFFFF}
Serial.print((char)payload[i];
}
Serial.println();
}
Nichtigkeitseinstellung() {\cHFFFF}
Serial.begin(115200);
ConnectToWifi();
verbindenToMqt();
}
Leerschleife() {\cHFFFF}
// Stellen Sie sicher, dass der MQTT-Client angeschlossen bleibt
wenn (!mqtClient.connected()) {\cHFFFF}
verbindenToMqt();
}
mqttClient.loop();
}
MQTT über Secure WebSocket
Verwenden Sie den folgenden Code, um den Client über Secure WebSocket zu verbinden. Setzen Sie TLS-Optionen wie in MQTT über TLS Abschnitt angegeben. Definieren Sie die Macro ADDRESS mit den Verbindungsparametern von MQTT Broker.
// MQTT Broker Einstellungen
const char* mqt_server = "public-mqtt-broker.bevywise.com";
const uint16_t mqt_port =11443; // WebSocket mit TLS läuft normalerweise auf
Hafen 443
const char* client_id = "esp_client";
// Root CA Zertifikat für den MQTT Broker
* root_ca = \
"-----------------
"YOUR_ROOT_CA_CERTIFICATE\n" \
"------END KERTIFIKATE-----------\n";
// Initialisieren Sie WiFi und MQTT-Kunden
WiFiClientSecure espClient;
PubSubClient mqtClient(espClient);
Leere Verbindung ToWifi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, passwort);
während (WiFi.status() != WL_CONNECTED {
Verzögerung(500)
Serial.print(");
}
Serial.println("WiFi verbunden");
}
Leere VerbindungToMqt() {
// Setzen Sie das Root CA-Zertifikat für TLS
espClient.setCACert(root_ca);
mqttClient.setServer (mqtt_server, mqt_port);
mqtClient.setCallback (mqttCallback)
während (!mqtClient.connected()) {\cHFFFF}
Serial.print("Connecting to MQTT über WebSocket mit TLS... ");
wenn (mqtClient.connect(client_id)) {\cHFFFF}
Serial.println("verbunden");
// Abonnieren Sie Themen oder veröffentlichen Sie Nachrichten hier
// mqtClient.subscribe("your/topic");
} auch
Serial.print("veröffentlicht mit Zustand ");
Serial.print(mqtClient.state());
Verzögerung(2000)
}
}
}
mqttCallback(char*-Thema, byte* Nutzlast, unbezeichnet int Länge) {\cHFFFF}
// eingehende Nachrichten ausschalten
Serial.print("Message kam zum Thema: ");
Serial.print(topisch);
Serial.print(". Nachricht: ");
für (unsigniert int i = 0; i < Länge; i++) {\cHFFFF}
Serial.print((char)payload[i];
}
Serial.println();
}
Nichtigkeitseinstellung() {\cHFFFF}
Serial.begin(115200);
ConnectToWifi();
verbindenToMqt();
}
Leerschleife() {\cHFFFF}
// Stellen Sie sicher, dass der MQTT-Client angeschlossen bleibt
wenn (!mqtClient.connected()) {\cHFFFF}
verbindenToMqt();
}
mqttClient.loop();
}
MQTT konfigurieren Authentifizierung
Um mit MQTT Broker zu verbinden, die MQTT Username und MQTT Password benötigt Authentifizierung, Benutzername und Passwort zu den folgenden Verbindungsoptionen hinzufügen:
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
// MQTT Broker Einstellungen
const char* mqt_server = "public-mqtt-broker.bevywise.com";
const uint16_t mqt_port = 1883; // Port 1883 für nicht-TLS verwenden
const char* mqt_user = "your_mqtt_username";
const char* mqt_password = "your_mqtt_password";
const char* client_id_prefix = "esp_client_";
// Initialisieren Sie WiFi und MQTT-Kunden
WiFiClient espClient;
PubSubClient mqtClient(espClient);
Leere Verbindung ToWifi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, passwort);
während (WiFi.status() != WL_CONNECTED {
Verzögerung(500)
Serial.print(");
}
Serial.println("WiFi verbunden");
}
String erzeugen ClientId(String prefix, int Länge) {
Das sind die folgenden: =
„ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789“;
int charsLength = Größe(chars) - 1;
String Client Id = Präfix;
// Initialisieren Sie zufälligen Samen
randomSeed(analogRead(0));
für (in i = 0; i < Länge; i++) {\cHFFFF}
clientId += chars[random(0, charsLength)];
}
zurück zum Kunden Id.
}
Leere VerbindungToMqt() {
mqttClient.setServer (mqtt_server, mqt_port);
mqtClient.setCallback (mqttCallback)
String client_id = generierenClientId(client_id_prefix, 10);
während (!mqtClient.connected()) {\cHFFFF}
Serial.print("Connecting to MQTT... ");
wenn (mqttClient.connect(client_id.c_str(), mqtt_user, mqtt_password))
{\cHFFFF}
Serial.println("verbunden");
// Abonnieren Sie Themen oder veröffentlichen Sie Nachrichten hier
// mqtClient.subscribe("your/topic");
} auch
Serial.print("veröffentlicht mit Zustand ");
Serial.print(mqtClient.state());
Verzögerung(2000)
}
}
}
mqttCallback(char*-Thema, byte* Nutzlast, unbezeichnet int Länge)
{\cHFFFF}
// eingehende Nachrichten ausschalten
Serial.print("Message kam zum Thema: ");
Serial.print(topisch);
Serial.print(". Nachricht: ");
für (unsigniert int i = 0; i < Länge; i++) {\cHFFFF}
Serial.print((char)payload[i];
}
Serial.println();
}
Nichtigkeitseinstellung() {\cHFFFF}
Serial.begin(115200);
ConnectToWifi();
verbindenToMqt();
}
Leerschleife() {\cHFFFF}
// Stellen Sie sicher, dass der MQTT-Client angeschlossen bleibt
wenn (!mqtClient.connected()) {\cHFFFF}
verbindenToMqt();
}
mqttClient.loop();
}
Das letzte Testament einrichten
Konfigurieren derLetzter Beitrag Will und Testamenteine Nachricht anzugeben, die der Broker veröffentlichen wird, wenn der Client unerwartet trennt. Dies hilft, andere Abonnenten des abgeschalteten Clients zu informieren Status.
Verwenden Sie den folgenden Code, um Last Will in den Verbindungsoptionen festzulegen:
// LWT Einstellungen
const char* lwt_topic = "test/lwt";
const char* lwt_message = "ESP32 getrennt";
const int lwt_qos = 1;
const bool lwt_retain = true;
//Anschließen von MQTTBroker
Leere Wiederverbindung()
{\cHFFFF}
während (!mqtClient.connected())
{\cHFFFF}
Serial.print("Versuche MQTT-Verbindung...");
// Versuchen Sie, mit dem MQTT Benutzernamen, Passwort und LWT zu verbinden
wenn(mqtClient.connect("ESP32Client",mqt_user,mqtt_password,
lwt_topic,lwt_qos, lwt_retain, lwt_message)
Serial.println("verbunden"); // Ein Thema eintragen
mqtClient.subscribe("test/topic");
}
andere
{\cHFFFF}
Serial.print("failed, rc=");
Serial.print(mqtClient.state());
Serial.println(" versuchen Sie wieder in 5 Sekunden"); // 5 Sekunden vor
Wiederaufnahme
Verzögerung(5000);
Adjusting Keep Alive
MQTT unterhält Client-Broker-Verbindungen mit einem Haltemechanismus. Einstellen der halten-alive Intervall, um zu kontrollieren, wie häufig der Client PINGREQ-Nachrichten an der Broker.
Ändern Sie den untenstehenden Code entsprechend Ihren Anforderungen:
// MQTT-Halteintervall (in Sekunden)
const int mqtt_keep_alive = 60; // Nach Bedarf anpassen
Nichtigkeitseinstellung()
{\cHFFFF}
mqtClient.setKeepAlive(mqtt_keep_alive);
}
Sitzungspersistenz konfigurieren
Sitzungsdaten einerMQT !beinhalten die Abschriften des Clients und alle Daten, die der Client mit QoS>0 empfangen.
Der Client kann den MQTT Broker dazu bringen, seine Sitzungsdaten über Verbindungen zu speichern.
MQTT 3.1.1 Clients können Clean Session = 0 festlegen, um den MQTT Broker zu bitten, seine Sitzungsinformationen über Verbindungen gespeichert.
Für MQTT 3.1.1:
wenn (mqtClient.connect("ESP32ClientClean", mqtt_user, mqtt_password,
nullptr, 0, false, nullptr, true))
{\cHFFFF}
Serial.println("verbunden");
}
wenn (mqtClient.connect("ESP32ClientPersistent", mqt_user,
mqtt_password, nullptr, 0, false, nullptr, false))
{\cHFFFF}
Serial.println("verbunden");
}
MQT 5 Clients können Clean Start = 0 und Session Expiry Interval = 'N' auf Anfrage einstellen der MQTT Broker, um seine Sitzungsinformationen über Verbindungen für 'N' zu speichern Sekunden.
Für MQTT 5:
// MQTT Client Einstellungen
const char* client_id = "ESP32Client";
const bool clean_start = falsch;
const uint32_t session_expiry_interval = 3600; // Sitzungsablauf
Intervall in Sekunden
AsyncMqtClient mqtClient;
Leere Verbindung ToWifi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, passwort);
während (WiFi.status() != WL_CONNECTED {
Verzögerung(500)
Serial.print(");
}
Serial.println("WiFi verbunden");
}
ungültig aufMqtConnect(bool sessionPresent) {
Serial.println("Connected to MQTT.");
Serial.print("Session vorhanden: ");
Serial.println(sessionPresent);
// Abonnieren Sie Themen oder veröffentlichen Sie Nachrichten hier
// mqtClient.subscribe("your/topic", 0);
}
Nichtigkeitseinstellung() {\cHFFFF}
Serial.begin(115200);
ConnectToWifi();
mqtClient.onConnect(onMqtConnect);
mqtClient.onDisconnect(onMqtDisconnect);
mqttClient.setServer (mqtt_server, mqt_port);
mqttClient.setCredentials(mqtt_user, mqt_password);
// MQTT 5 Funktionen konfigurieren
mqtClient.setCleanSession(clean_start);
mqtClient.setSessionExpiry(session_expiry_interval);
mqtClient.connect(client_id);
}
Leerschleife() {\cHFFFF}
// Nichts zu tun, AsyncMqtClient behandelt alles
}
Maximal Packungsgröße
MQTT5 Client kann den MQTT Broker anfordern, nur Datenpakete weniger als ein spezifische Größe, indem Sie es so einstellen:
Für MQTT 5:
const char* data = „größte Daten zum Senden“;
const int chunkSize = 1024;
int dataLength = strlen(data);
int numChunks = (dataLength + chunkSize - 1) / chunkSize;
// Berechnen Sie die Anzahl der benötigten Stücke
für (in i = 0; i < numChunks; i++)
{\cHFFFF}
char chunk[chunkSize + 1]; // Buffer für chunk
// Kopieren von Daten in Puffer
strncpy(chunk, data + i * chunkSize, chunkSize);
chunk[chunkSize] = '\0'; // Null-terminieren Sie den String
// chunk als MQTT-Nachricht veröffentlichen
mqtClient.publish("large_data_topic", chunk, false); // falsch für QoS 0
Serial.print("Published chunk ");
}
Daten senden
Effizient Daten an mehrere Abonnenten verteilen, indem sie an benannte Abonnenten publiziert werden Themen mit dem folgenden Code-Snippet:
Für MQTT 3.1.1
mqtclient.publish("topic",message.c_str());
Für MQTT 5
// Beispielverlag
String message = "Hallo, MQTT!";
mqtClient.publish("topic", 0, false, message.c_str());
}
Festhaltene Nachrichten einstellen
Aktivieren Sie die Rückhalte-Flag bei der Veröffentlichung einer Nachricht, um sicherzustellen, dass der Broker speichert die letzte Nachricht für jedes Thema. Dies garantiert, dass neue Abonnenten am meisten erhalten neue Nachricht beim Verbinden.
Um dies zu implementieren, verwenden Sie den folgenden Code snippet:
// Beispiel: Eine gespeicherte Nachricht alle 10 Sekunden veröffentlichen
statisch unbezeichnet lange lastPublish = 0;
wenn (millis() - lastPublish > 10000)
{\cHFFFF}
lastPublish = Mills();
wenn (mqttClient.publish("topic", "Device Status = 1", true))
{\cHFFFF}
Serial.println("Erhaltene Meldung erfolgreich veröffentlicht");
}
andere
{\cHFFFF}
Serial.println("Retained message pub fail");
}
}
QoS Levels angeben
MQTT bietet drei Ebenen der Qualität des Dienstes (QoS) für Nachrichtenaussendung:
wenn (mqtClient.publish("topic", "Device status with DoS 0", false, 0))
{\cHFFFF}
Serial.println("Message mit QoS 0 erfolgreich veröffentlicht");
}
andere
{\cHFFFF}
Serial.println("Message mit QoS 0 veröffentlichen fehlgeschlagen");
}
// Eine Nachricht mit QoS 1 veröffentlichen
wenn (mqtClient.publish("topic", "Devicce status with QoS 1", false, 1))
{\cHFFFF}
Serial.println("Message mit QoS 1 erfolgreich veröffentlicht");
}
andere
{\cHFFFF}
Serial.println("Message mit QoS 1 veröffentlicht fehlgeschlagen");
}
// Eine Nachricht mit QoS 2 veröffentlichen
wenn (mqtClient.publish("topic", "Gerätestatus mit QoS 2", false, 2))
{\cHFFFF}
Serial.println("Message mit QoS 2 erfolgreich veröffentlicht");
}
andere
{\cHFFFF}
Serial.println("Message mit QoS 2 veröffentlichen fehlgeschlagen");
}
Nachricht abbrechen Intervall
Die Eigenschaft 'Message Ablaufintervall' setzt die Lebensdauer einer Nachricht in Sekunden; wenn undelivered innerhalb dieser Zeit, der Broker verworfen es. MQTT5 unterstützt diese Funktion. MQTT5 Clients können dies während der Veröffentlichung von Daten festlegen.
Für MQTT 5
int AuslaufInterval = 60;
const char* message = „device status messge“;
mqtClient.beginPublish(topic, strlen(message), falsch, AuslaufInterval
*1000); // Ablaufintervall in Millisekunden
mqtClient.print(payload);
mqtClient.endPublish();
Thema Alias
Die Eigenschaft 'Topic Alias' ermöglicht es Kunden, einen kurzen Alias anstelle eines vollen den Namen des Themas, die Größe des Nachrichtenpakets und die Verbesserung der Netzeffizienz.
Für MQTT 5
// Thema Alias Maximalwert (bereinigt basierend auf MQTT-Brokerfunktionen)
In den Warenkorb MAX_TOPIC_ALIAS = 10;
const char* message = „Gerätestatusnachricht“;
// Veröffentlichen Sie mit dem Thema Alias, wenn der Broker unterstützt wird
mqtClient.beginPublish(topic, strlen(message), false);
mqtClient.writeTopic(topic); // Vollständige Themenbezeichnung veröffentlichen
mqtClient.writeTopicAlias(1); // Thema Alias einstellen, z.B. 1
mqtClient.print(message);
mqtClient.endPublish();
Eigenschaften, die mit MQTT PUBLISH verbunden sind, verbessern das Nachrichtenhandling, Bereitstellung von Kontext oder Anweisungen für Broker und Kunden. Diese Eigenschaften, einschließlich Meldung Ablauf Intervalle und Themen-Aliase, optimieren Nachrichtenversand und Netzwerkbandbreite.
Anmeldung zum Thema Filter
Um von anderen Clients veröffentlichte Daten zu erhalten, muss dieser Client abonnieren zum Thema Filter so:
mqtClient.subscribe("cmq/topic");
Dieses Thema Filter kann mit einem genauen Thema übereinstimmen oder es kann haben Wildcards wie # und +
Daten senden
Um die für die Abonnements gesendeten Daten zu erhalten, muss eine Callback-Funktion definiert werden wie folgt:
leer aufMqtMessage(char* Thema, char* Nutzlast,
AsyncMqtClientMessageEigenschaften, size_t len, size_t index,
Größe_t insgesamt {\cHFFFF}
Serial.println("Nachricht erhalten:");
Serial.print(" Thema: ");
Serial.println(topisch);
Serial.print(" Nutzlast: ");
Serial.println(payload);
// Sie können hier mehr Verarbeitung auf Basis Ihrer Anwendungsanforderungen hinzufügen
}
Nichtigkeitseinstellung() {\cHFFFF}
Serial.begin(115200);
ConnectToWifi();
mqtClient.onConnect(onMqtConnect);
mqtClient.onDisconnect(onMqtDisconnect);
mqtClient.onMessage(onMqtMessage); // Setzen Sie die Rückruffunktion für
eingehende Nachrichten
mqttClient.setServer (mqtt_server, mqt_port);
mqttClient.setCredentials(mqtt_user, mqt_password);
mqtClient.connect(client_id);
}
Anmeldung von Themen
Um die Aktualisierungen eines Themas zu stoppen, verwenden Sie den zur Abmeldung vorgesehenen Code.
// Abonnieren des Themas
mqtClient.unsubscribe("cmq/topic");
Stellen Sie sicher, dass die Verbindung Ihres Kunden mit dem Broker ordnungsgemäß beendet wird, um Probleme zu vermeiden und Ressourcenlecks auf beiden Seiten, wodurch die Systemstabilität erhalten bleibt.
Verwenden Sie den folgenden Code, um den Client vom Broker zu trennen:
mqtClient.disconnect();
Sie haben die Möglichkeit, Ihre eigene komplizierte Geschäftslogik zu entwickeln und anzupassen in dieser Umgebung, genau auf Ihre spezifischen Bedürfnisse und Ziele zugeschnitten.
Einzigartiges Kunden-ID-Management
Jedem Gerät eine bestimmte Client-ID zur genauen Identifizierung zuweisen. Privat Einstellungen, bezeichnen einzigartige IDs für jeden Client. In geteilten Umgebungen fügen Sie jedem Client-ID einen zufälligen String an, um zu erhalten Einzigartigkeit.
Datendesign
Planen Sie Ihre Datenstruktur vorab strategisch. Ob Sie mit Klartext, JSON-formatierte Daten oder numerische Daten, stellen Sie sicher, dass das Design mit Ihrem Anwendungsbedarf und Anwendungsfall.
Robuste Fehlerbehandlung
Implementieren Sie eine starke Fehlerverwaltung mit MQTT-Verbindung Fehler, Abonnementprobleme und Nachrichtenveröffentlichungsfehler effektiv.
Sicherung von Anmeldeinformationen
Schutz sensibler Informationen wie Benutzernamen, Passwörter und Client-IDs durch nicht Sie in Ihrem Quellcode festcodieren. Verwenden Sie Umgebungsvariablen oder sicher Konfigurationsdateien statt.
Regelmäßige Prüfung und Überwachung
Kontinuierlich testen Sie MQTT-Kommunikation und überwachen Sie Client Metriken wie Verbindungsstatus, Nachrichtendurchsatz und Fehlerraten, um schnell zu identifizieren und Probleme beheben.
Optimierung des Sitzungsmanagements
Wählen Sie zwischen sauberen und persistenten Sessions (`clean: true` oder `clean: false`) basierend auf Ihrer Notwendigkeit, Abonnements und gelöschte Nachrichten über Client zu behalten Verbindungen.
Reconnect auf Disconnect
Code hinzufügen, um zu versuchen, die Verbindung zumMQTT Brokerwenn es eine unerwartete Trennung gibt. Dies wird sicherstellen, dass Ihr Kunde bleibt verbunden und verliert keine Daten.
Laden Sie den vollständigen Code für den Client herunter, der die ESP32 MQTT Client Library verwendet, um die Verbindung zu verbinden mit unsererMQTT Brokeroder einen Broker Ihrer Wahl.
Für MQTT 3.1.1
//Dieser Code liest den Verfügbarkeitsstatus und den Produktivitätsstatus der Maschine
zu mqtbroker
//notwendige Bibliotheken enthalten
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "time.h"
// WiFiUDP ntpUDP;
const char *ntpServer = "time.google.com";
WiFiClient ProxSen;
PubSubClient Client(ProxSen);
unbezeichnete lange EpocheZeit = 0;
unsigned long current Millis1 = 0;
const char* ssid = "xxxxxxxx"; // ersetzen xxx.. mit Ihrem WIFI SSID
const char* passwort = "xxxxxxxxxx"; // abheben mit WIFI Passwort
const char* mqt_server = "xxxxxxxxxxxxx"; //MQTT Servername
const char* mqt_user = "xxxxxxxxxxxxx"; //MQTT Broker Benutzername
const char* mqtt_password = "xxxxxxxxxx"; //MQTT Broker-Passwort
const int ProxSenPin = 33; // Verfügbarkeitsstatus gelesen
const int ProduktivitätPin = 26; // Leistungsstatus gelesen
unbezeichnete lange Aggregation Intervall = 60000; // 1 Minute
unsigned int availabilityValues[60]; // Verfügbarkeit und Produktivität speichern
Werte für 1 Minuten
// unsigned int changeoverWerte[300];
nicht zugewiesener IntwertIndex = 0;
int availability = 0;
Int Produktivität = 1;
Bohnen Flagge = falsch;
nicht zugewiesen lange getTime()
{\cHFFFF}
time_t jetzt;
Serial.println("inside gettime");
struct tm timeinfo;
wenn (!getLocalTime(&timeinfo))
{\cHFFFF}
Serial.println("Failed to get time");
getTime();
}
Zeit(&now);
zurück;
}
// Um die Verfügbarkeit der Maschine zu lesen
IRAM_ATTR availIsr()
{\cHFFFF}
Verfügbarkeit = digitalRead(ProxSenPin) ? 0 : 1; //Gerätearbeiten bei negataive
Logik
}
// Die Produktivität der Maschine lesen
Leere IRAM_ATTR produzierenIsr()
{\cHFFFF}
produzierenFlag = digitalRead(productivityPin) ? falsch : wahr;
}
//Verbindung mit mqtt Broker
Leere VerbindungToMqt()
{\cHFFFF}
während (!client.connected()
{\cHFFFF}
Serial.println("Connecting to MQTT...");
wenn (client.connect("ProxSen", mqtt_user, mqt_password))
{\cHFFFF}
Serial.println("Connected to MQTT");
}
andere
{\cHFFFF}
Serial.print("Failed to connect to MQTT, rc=");
Seufzer
rial.print(client.state());
Serial.println(" Wiederaufnahme in 5 Sekunden...");
Verzögerung(5000);
}
}
Nichtigkeitseinstellung()
{\cHFFFF}
Serial.begin(115200);
//Konfigurieren WIFI-Verbindung
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, passwort);
während (WiFi.status() != WL_CONNECTED)
{\cHFFFF}
Verzögerung(5000);
Serial.print(");
}
Serial.println("WiFi verbunden");
//Konfigurieren Sie MQTTBroker
client.setServer(mqt_server,1883);
configTime(0, 0, ntpServer);
epochTime = getTime();
verbindenToMqt();
pinMode(ProxSenPin, INPUT);
AttachInterrupt(digitalPinToInterrupt(ProxSenPin), availIsr, CHANGE);
pinMode (ProduktivitätPin, INPUT);
AttachInterrupt(digitalPinToInterrupt(ProduktivitätPin), productionIsr,
ÄNDERUNG;
Verfügbarkeit = digitalRead(ProxSenPin)?0:1;
Verzögerung(25)
}
Leerschleife()
{\cHFFFF}
epochTime = epochTime + 1;
availabilityValues[valueIndex] = Verfügbarkeit;
WertIndex++;
//Veröffentlichen Sie die Produktionsdaten zum Teil
wenn(produzierenFlag)
{\cHFFFF}
DynamischeJsonDocument jsonDocument1(1000)
String json Produktivität;
produzierenFlag = falsch;
jsonDocument1["production_status"] = 1;
jsonDocument1["timestamp"] = epochTime;
serializeJson(jsonDocument1,jsonProduktivität);
wenn (!client.connected())
{\cHFFFF}
verbindenToMqt();
}
client.publish("ProxSen/Produktivität",jsonProductivity.c_str());
}
// Maschinenstatus alle 5 Sekunden
wenn(millis() - currentMillis1 >= 5000)
{\cHFFFF}
aktuelleMillis1 = Mills();
DynamischeJsonDocument jsonDocument2(1000)
String json AvailStatus;
jsonDocument2["machine_status"] = Verfügbarkeit;
jsonDocument2["timestamp"] = epochTime;
serializeJson(jsonDocument2,jsonAvailStatus);
wenn (!client.connected())
{\cHFFFF}
verbindenToMqt();
}
client.publish("ProxSen/machine_status", jsonAvailStatus.c_str());
}
Verzögerung(1000)
}
Für MQTT 5
#include <Arduino.h>
#include <WiFi.h>
#include <AsyncMqtClient.h>
#include <ArduinoJson.h>
#include "time.h"
// WiFi Anmeldeinformationen
const char* ssid = "your_SSID"; // Ersetzen Sie mit Ihrem WLAN SSID
const char* Passwort = "your_PASSWORD"; // Ersetzen Sie mit Ihrem WLAN
Passwort vergessen?
// MQTT Broker Einstellungen
const char* mqt_server = "public-mqtt-broker.bevywise.com"; // MQTT Broker
Servername
const uint16_t mqt_port = 1883; // MQTT-Brokerport (verwenden 1883 für
Nicht-TLS)
const char* mqt_user = "your_mqtt_username"; // MQTT Broker Benutzername
const char* mqt_password = "your_mqtt_password"; // MQTT Broker
Passwort vergessen?
// MQTT Client Einstellungen
const char* client_id = "ESP32Client";
AsyncMqtClient mqtClient;
WiFiClient wifiClient;
unbezeichnete lange EpocheZeit = 0;
unsigned long current Millis1 = 0;
const char* ntpServer = "time.google.com"
const int ProxSenPin = 33; // Statuspin Verfügbarkeit
int Produktivität Pin = 26; // Produktivität Status Pin
unbezeichnete lange Aggregation Intervall = 60000; // 1 Minute
unsigned int availabilityValues[60]; // Verfügbarkeitswerte für 1 speichern
Minute
nicht zugewiesener IntwertIndex = 0;
int availability = 0;
Bohnen Flagge = falsch;
IRAM_ATTR availIsr() {
Verfügbarkeit = digitalRead(ProxSenPin) ? 0 : 1; // Inverse Logik (negativ)
Logik
}
Leere IRAM_ATTR produzierenIsr() {
produzierenFlag = digitalRead(productivityPin) ? falsch : wahr;
}
Leere VerbindungToMqt() {
Serial.println("Connecting to MQTT...");
mqtClient.connect();
}
unsigned long getTime() {
time_t jetzt;
struct tm timeinfo;
wenn (!getLocalTime(&timeinfo)) {\cHFFFF}
Serial.println("Failed to get time");
getTime();
}
Zeit(&now);
zurück;
}
ungültig aufMqtConnect(bool sessionPresent) {
Serial.println("Connected to MQTT.");
Serial.print("Session vorhanden: ");
Serial.println(sessionPresent);
// Abonnieren Sie notwendige Themen bei Bedarf
mqtClient.subscribe("ProxSen/#");
// Beispielveröffentlichung auf Connect (falls erforderlich)
String message = "Hallo, MQTT!";
mqtClient.publish("ProxSen/test", 0, false, message.c_str());
}
nichtig aufMqtDisconnect(AsyncMqttClientDisconnectReason Grund) {
Serial.println("Disconnected from MQTT.");
wenn (WiFi.isConnected()) {\cHFFFF}
verbindenToMqt();
}
}
Nichtigkeitseinstellung() {\cHFFFF}
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, passwort);
während (WiFi.status() != WL_CONNECTED {
Verzögerung(500)
Serial.print(");
}
Serial.println("WiFi verbunden");
mqttClient.setServer (mqtt_server, mqt_port);
mqttClient.setCredentials(mqtt_user, mqt_password);
mqtClient.setClientId(client_id);
mqtClient.onConnect(onMqtConnect);
mqtClient.onDisconnect(onMqtDisconnect);
// Konfigurieren MQTT 5 spezifische Einstellungen (optional)
mqtClient.setCleanSession(true); // Stellen Sie saubere Sitzung zu wahr oder falsch
basierend auf Ihrer Anforderung
// MQTT-Broker verbinden
verbindenToMqt();
// Setup-Interrupts für Verfügbarkeit und Produktivität
pinMode(ProxSenPin, INPUT);
AttachInterrupt(digitalPinToInterrupt(ProxSenPin), availIsr, CHANGE);
pinMode (ProduktivitätPin, INPUT);
AttachInterrupt(digitalPinToInterrupt(ProduktivitätPin), productionIsr,
ÄNDERUNG;
Verfügbarkeit = digitalRead(ProxSenPin) ? 0 : 1;
Verzögerung(25)
}
Leerschleife() {\cHFFFF}
epochTime = epochTime + 1;
availabilityValues[valueIndex] = Verfügbarkeit;
WertIndex++;
// Produktivitätsdaten veröffentlichen, wenn die ProduktionFlag eingestellt ist
wenn (produceFlag) {
DynamischeJsonDocument jsonDocument1(1000)
String json Produktivität;
produzierenFlag = falsch;
jsonDocument1["production_status"] = 1;
jsonDocument1["timestamp"] = epochTime;
serializeJson(jsonDocument1, jsonProductivity);
wenn (mqtClient.connected()) {\cHFFFF}
mqtClient.publish("ProxSen/Produktivität", 0, falsch,
jsonProductivity.c_str()
}
}
// Maschinenstatus alle 5 Sekunden veröffentlichen
wenn (millis() - currentMillis1 >= 5000) {
aktuelleMillis1 = Mills();
DynamischeJsonDocument jsonDocument2(1000)
String json AvailStatus;
jsonDocument2["machine_status"] = Verfügbarkeit;
jsonDocument2["timestamp"] = epochTime;
serializeJson(jsonDocument2, jsonAvailStatus);
wenn (mqtClient.connected()) {\cHFFFF}
mqtClient.publish("ProxSen/machine_status", 0, false,
jsonAvailStatus.c_str()
}
}
// Handle MQTT-Client-Bibliothek lebendig und Nachrichtenverarbeitung
wenn (mqtClient.connected()) {\cHFFFF}
mqttClient.loop();
} auch
verbindenToMqt();
}
Verzögerung(1000)
}
Schritte zum Flashen des Codes in ESP32
Im Folgenden sind die Schritte, um den Code in den ESP32 Prozessor hochzuladen :
Verbinden Sie Ihren Kunden mit unserem hochmodernenMQTT Brokeroder einen Broker Ihrer Wahl. Diese leistungsstarke Kombination sorgt für optimale Leistung und Zuverlässigkeit für alle Ihre Messaging-Anforderungen, den Weg für eine robuste und effiziente Systemintegration.