PubSubClient für MQTT mit Benutzername, Passwort und Port

In diesem Artikel zeige ich Dir, wie Du beim Zugriff auf einen MQTT-Server den Port sowie die Anmeldung über Benutzername und Passwort steuern kannst.

Ich wurde in letzter Zeit öfters gefragt, wie man einen Arduino-Sketch anpassen muss, bei dem der MQTT-Broker eine Authentifizierung per Benutzername und Passwort verlangt. Im folgenden Beispiel zeige ich Dir einen kleinen Sketch, bei dem sich der MQTT-Client an einen Server per Benutzername und Passwort authentifiziert. Ich habe für das leichtere Verständnis die wirklich relevanten Stellen farblich markiert.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <time.h>
WiFiClient espClient; 
PubSubClient client(espClient); 

char* clientId = "clientABC";

const char* wifi_ssid = "<WIFI-SSID>";
const char* wifi_password = "<WIFI-PWD>";

const char* mqtt_server = "192.168.2.90";
const int mqtt_port = 1883;
const char* mqtt_user = "user";
const char* mqtt_password = "pwd";

char tmp[50];
char time_value[20];

unsigned long int currentMillis = millis();
const unsigned long period = 10000;  // führe nach x nochmals ein Event aus 

void connectToMQTT() {
 client.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port
 
  if (client.connect(clientId , mqtt_user, mqtt_password)) {
    Serial.println("connected");
  }
}

void setup() {
  // WIFI-Verbindung aufbauen
  WiFi.begin(wifi_ssid, wifi_password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  // Aktuelle Uhrzeit über den Zeitserver ermitteln
  configTime(2 * 3600, 0, "0.de.pool.ntp.org", "ptbtime1.ptb.de");  

  delay(1000);

  time_t now = time(nullptr);
  String time = String(ctime(&amp;now));
  time.trim();
  time.substring(0,19).toCharArray(time_value, 20); 

  connectToMQTT();

    long rssi = WiFi.RSSI();
    itoa(rssi,tmp,10);
    client.publish("Klingelsensor/rssi", tmp);
    client.publish("Klingelsensor/pressed", "on");
    client.publish("Klingelsensor/time", time_value);
  
  delay(3000);
  ESP.deepSleep(0);
}

void loop() { }

Im Beispiel nutze ich folgende MQTT relevante Bibliotheken:

PubSubClient by Nicj O´Leary Version 2.0.7

Weitere Informationen und Hinweise zur Nutzung von PubSubClient:

  • Eindeutige ClientID
    Bitte achtet unbedingt darauf, dass jeder Client eine eindeutige ClientID im Quelltext besitzt. Doppelte ClientIDs sorgen für Probleme beim Publish.

Ich hoffe Dir gefällt der Artikel. Über Kommentare, Anregungen oder Ideen freue ich mich wie immer 🙂

Matthias Korte

Hauptberuflich Software-Entwickler und seit einigen Jahren Smart-Home Fan. Angefangen hat alles mit einem RaspberryMatic und einer schaltbaren Steckdose. Mittlerweile habe ich einige Steckdosen, Sensoren, und Thermostate sowie ioBroker zur Visualisierung im Einsatz.

3 Gedanken zu „PubSubClient für MQTT mit Benutzername, Passwort und Port

  • 2. Januar 2021 um 20:10
    Permalink

    Hallo Matthias,
    alles hoch interessante Themen.
    Danke fürs Teilen.
    Bei der NTP-Zeit interessiert mich besonders die DST Problematik.
    Wir müssen uns damit wohl Noch eine Weile befassen.
    Hast du dafür eine Lösung?

    Andreas

    Antwort
  • 11. Januar 2021 um 19:22
    Permalink

    Wo ich in eine gemeien Falle gelaufen bin:
    Wenn 2 Clients die gleiche ClientID haben, connected der Broker zwar beide Devices, lässt aber kein „publish“ zu …
    Vielleicht kannst du das anmerken ..

    Antwort
    • 11. Januar 2021 um 19:50
      Permalink

      Moin Erik,

      guter Hinweis, das werde ich gerne noch ergänzen. Danke dafür!

      LG Matthias

      Antwort

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.