meta data for this page
  •  
Übersetzungen dieser Seite:
  • de-informal

MQTT-Kommunikation mit PubSubClient

zurück zur Übersicht

GitHub-Seite der PubSubClient-Library: https://github.com/knolleary/pubsubclient/blob/master/examples/mqtt_esp8266/mqtt_esp8266.ino

PubSubClient_mit_Passwort.ino
/*
 * Dieses Beispiel implementiert einen MQTT-Client mit Hilfe der PubSubClient-Library. Ergänzend zu den online verfügbaren Beispielen
 * werden hier Zugangsdaten für den MQTT-Broker verwendet. Die Beispieldaten müssen durch die tatsächlichen Zugangsdaten ersetzt werden.
 *
 * Das Beispiel beinhaltet sowohl MQTT-Subscribe als auch MQTT-Publish.
 */
 
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <WiFiClientSecure.h>
 
// forward declarations
void setup_wifi();
void callback(String topic, byte* message, unsigned int length);
void reconnect();
 
// WiFi-Zugangsdaten
const char* ssid = "SSID";
const char* passphrase = "Passphrase";
 
// MQTT-Serverdaten
const char* mqtt_server = "mqtt.server.url";
const int mqtt_port = 8883; // für eine TLS-verschlüsselte Kommunikation
const char* mqtt_user = "mqtt-username";
const char* mqtt_password = "mqtt-password";
const char* mqtt_client_name = "ESP8266-Client";  // beliebig wählbar, muss aber pro Client einmalig sein (wegen Mosquitto); bitte ändern
 
// Topics für Subscription und eigenes Publishing
const char* topic_sub = "some-topic/esp_sub";
const char* topic_pub = "some-topic/esp_pub";
 
// Konstanten
const int pub_interval = 10000;  // Intervall für eigene pub-Nachrichten (in ms)
 
 
WiFiClientSecure wifi;
PubSubClient client(wifi);
 
long now;  // aktuelle Laufzeit
long last = 0;  // Zeitpunkt des letzten MQTT-Publish
 
int pub_counter = 0;  // Zählwert als Inhalt für eigene Publish-Nachrichten
 
 
/* ---------- Hauptfunktionen ---------- */
 
/**
 * setup
 */
void setup() {
  // Serial
  Serial.begin(9600);
  Serial.println();
  delay(100);
  Serial.println("Setup...");
 
  // WiFi
  setup_wifi();
 
  // MQTT
  wifi.setInsecure(); // MQTT-Kommunikation ohne TLS-Zertifikatsvalidierung ermöglichen
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
 
  Serial.println("Setup abgeschlossen");
}
 
 
/**
 * loop
 */
void loop() {
  if (!client.connected())
  {
    // MQTT-Verbindung wieder herstellen
    reconnect();
  }
 
  // regelmäßigen Nachrichtenempfang gewährleisten, false bei Verbindungsabbruch
  if (!client.loop())
  {
    client.connect(mqtt_client_name, mqtt_user, mqtt_password);
  }
 
  // non-blocking Timer für eigene Publish-Nachrichten;
  now = millis();
  if (millis() - last > pub_interval)
  {
    last = now;
    pub_counter++;
    client.publish(topic_pub, String(pub_counter).c_str());
    Serial.print("Publish: ");
    Serial.print(topic_pub);
    Serial.print(": ");
    Serial.println(pub_counter);
  }
}
 
 
/* ---------- andere Funktionen ---------- */
 
/**
 * setup_wifi
 */
void setup_wifi()
{
  delay(10);
  Serial.print("WiFi");
  WiFi.begin(ssid, passphrase);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println(" connected");
}
 
 
/**
 * callback
 */
void callback(String topic, byte* message, unsigned int length)
{
  // Callback-Funktion für MQTT-Subscriptions
  String messageTemp;
 
  Serial.print("Message arrived on topic: ");
  Serial.println(topic);
 
  // Message byteweise verarbeiten und auf Konsole ausgeben
  for (int i = 0; i < length; i++)
  {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();
 
  // Behandlung bestimmter Topics
  if (topic == topic_sub)
  {
    if (messageTemp == "on")
    {
      Serial.print(topic_sub);
      Serial.println(" steht auf EIN");
    }
    else if (messageTemp == "off")
    {
      Serial.print(topic_sub);
      Serial.println(" steht auf AUS");
    }
  }
  /* else if (topic == anderes_topic) { ... } */
}
 
 
/**
 * reconnect
 */
void reconnect()
{
  // Wiederverbinden mit dem MQTT-Broker
  while (!client.connected())
  {
    Serial.println("MQTT reconnect");
    if (client.connect(mqtt_client_name, mqtt_user, mqtt_password))
    {
      Serial.println("connected");
      client.subscribe(topic_sub);
    }
    else
    {
      Serial.print("failed: ");
      Serial.println(client.state());
      delay(5000);
    }
  }
}

zurück zur Übersicht