Für die letzten Tage in diesem Advent werden Sie nun ein Thema kennenlernen, welches eine große Rolle im Bereich IoT spielt. Es geht um das Nachrichten-Protokoll MQTT (Message Queue Telemetry Transport) welches speziell für die Kommunikation von Machschienen zu Maschinen (M2M) entwickelt wurde. Der Grund warum dieses Protokoll so genial ist, liegt in der Kompaktheit und Einfachheit, mit der Daten wie Steuerdaten, Messdaten oder Texte, ausgetauscht werden können. Im Vergleich zum HTTP ist der Overhead (Daten die neben den eigentlichen Nutzdaten übermittelt werden) sehr kurz und können gerade von Embeded Devices, also Mikrocontrollern wie unserem NanoESP, gut verarbeitet werden. Gleichzeitig muss der Controller nicht selbst immer wieder eine Verbindung aufbauen und erfragen, ob es eine Veränderung gab, sondern die Verbindung wird dauerhaft gehalten und der Client automatisch über Veränderungen Informiert.

Grundlange für die Kommunikation bildet ein sogenannter Broker. Ein Broker ist eine Server-Anwendung, die alle Daten verarbeitet. Ein Gerät kann sich nun mit dem Broker verbinden und Nachrichten „publischen“ (veröffentlichen), also an den Broker senden. Ein anderes Gerät kann dann bestimmte Themen (Topics genannt) „subscriben“ (abonnieren) und bekommt dann sofort eine neu zu diesem Thema veröffentlichte Nachricht von Broker zugestellt. Damit Sie nicht selbst einen Broker einrichten müssen, wurde ein öffentlicher Broker unter der Adresse broker.fkainka.de für Sie eingerichtet.

Der MQTT Broker stellt die Nachrichten zu
Der MQTT Broker stellt die Nachrichten zu

Die Topics sind hierarchisch strukturiert, wobei Unterthemen jeweils durch ein / getrennt sind. Zusätzlich gibt es sogenannte Wildcards. Durch ein + oder # können gleich mehrere Themen gleichzeitig abonniert werden. Die Topics

MyHome/Kitchen/Temperature

MyHome/Bathroom/Temperature

können so z.B. durch das Subscriben des Themas

MyHome/+/Temperature

gleichzeitig empfangen werden. Das Plus ersetzt dabei immer nur eine Topic Ebene. Das # ersetzt gleich alle. Mit dem Topic

MyHome/#

empfangen Sie also alle Nachrichten, die in allen Untertopics von MyHome gepublished werden. Die Daten, die zu einem Topic veröffentlicht werden, können so ziemlich alles sein von reinen Text über Messwerte oder einfache 1/0 Befehle zum Schalten von Licht.

Das Programm: A16_P20_MQTT_Basics.ino
/*
  MQTT Basic functions
  Change SSID and PASSWORD.
*/

#include <NanoESP.h>
#include <NanoESP_MQTT.h>  //special library for MQTT
#include <SoftwareSerial.h>

#define SSID "YourSSID"
#define PASSWORD "YourPassword"

#define LED_WLAN 13
#define DEBUG true

NanoESP nanoesp = NanoESP();
NanoESP_MQTT mqtt = NanoESP_MQTT(nanoesp);

String ip, mqttId;

void setup() {
  Serial.begin(19200);
  nanoesp.init();

  //! Only if you use a new Network
  // nanoesp.configWifi(STATION, SSID, PASSWORD);

  //Station Mode
  nanoesp.configWifiMode(STATION);
  //delay(1000);

  // Wait till Connected to WiFi
  if (nanoesp.wifiConnected())digitalWrite(LED_WLAN, HIGH); else Serial.println(F("Error WLAN Connect"));

  //Print IP in Terminal
  nanoesp.getIpMac(ip,  mqttId);
  Serial.println("My IP: " + ip);

  //Print MQTTid in Terminal
  mqttId.replace(":", "");
  Serial.println("My MQTT ID: " + mqttId+"\n");

//if (mqtt.connect(0, "broker.hivemq.com", 1883, mqttId)) {  //connect to alternative broker
 if (mqtt.connect(0, "broker.fkainka.de", 1883, mqttId)) {  //connect to broker
    Serial.println(F("Connected to Broker\n"));

    Serial.println(F("My personal Topic is:"));
    Serial.println("NanoESP/" + mqttId + "/\n");
    
    if (mqtt.subscribe(0, "NanoESP/" + mqttId + "/test")) Serial.println("Subscribed to:\nNanoESP/" + mqttId + "/test\n"); 
    if (mqtt.publish(0, "NanoESP/" + mqttId + "/test", "Hello from my NanoESP")) Serial.println("Published to:\nNanoESP/" + mqttId + "/test\n");
  }
  else {
    Serial.println(F("error connecting"));
  }
}


void loop() {
  int id, len;

  if (nanoesp.recvData(id, len)) {        //recv data
    String topic, value;
    if (mqtt.recvMQTT(id, len, topic, value)) {      //handle recvd data as mqtt data, parameters topic and value as reference
      Serial.println("New Message:\nTopic=" + topic + " Value=" + value+"\n");         //print message
    }
   }
  
  mqtt.stayConnected(0);        //keep the connection to broker alive 
}

(Die frühere Einbettung über Arduino Create ist nicht mehr verfügbar; der Code stammt aus dem Download aller Programme.)

Hinter dem heutigen Türchen befindet sich ein Taster. In dem heutigen Versuch wollen wir vor allem ein paar Trockenübungen zum Thema MQTT machen. Deswegen laden Sie das heutige Programm in das Board und öffnen Sie den Seriellen Monitor. Nach kurzer Zeit sehen Sie in etwa folgende Meldungen:

Die Meldungen im Seriellen Monitor
Die Meldungen im Seriellen Monitor

Das Board hat sich also erst mit dem WLAN verbunden und dann mit dem Online-Broker. Damit sich die vielen verschiedenen Nutzer nicht in die Quere kommen, muss eine besondere Struktur eingehalten werden. Sie können also nur in Unterthemen der Form NanoESP/MyMQTTiD/… schreiben, wobei Sie MyMQTTiD durch die ID ersetzen müssen, die Sie vom Board im Seriellen Monitor angezeigt bekommen. Für den heutigen Tag heißt dass, dass alle in das individuell angepasste Topic NanoESP/MyMQTTiD/test schreiben.

Damit Sie auch sehen können, was Sie in ein Topic schreiben, benutzen wir auf dem Rechner ein online Tool der Firma HiveMQ. Mit diesem Tool können Sie sich ebenfalls mit dem Broker verbinden und Ihre persönlichen Topics abonnieren oder in dieses schreiben. Gehen Sie nun also auf die Seite www.hivemq.com/try-out/ und klicken dort auf “Try the websocket client”. Nun müssen Sie zunächst eine Verbindung zu dem Broker aufbauen, indem Sie im Punkt Connection unter Host die Adresse broker.fkainka.de eintragen. Der Port und die ClientID können so bleiben und auch die anderen Parameter stimmen. Klicken Sie auf Connect. Hat alles funktioniert erscheint oben rechts neben einem grünen Punkt der Text connected und Sie haben in weiteren Bereichen die Möglichkeit, in ein Topic zu Publishen oder ein Topic zu Subscriben.

Klicken Sie zunächst auf “Add New Topic Subscription” und geben unter Topic NanoESP/MyMQTTiD/test ein, wobei Sie MyMQTTiD durch die ID aus dem Seriellen Monitor ersetzen. Resetten Sie nun den NanoESP mit Druck auf den Resetbutton auf dem Board. Nach kurzer Zeit sollten Sie im Browser unter dem Punkt Messages die Nachricht “Hello from my NanoESP” empfangen. Sie können auch eine Nachricht an das Board senden, indem Sie unter Pubish in das Topic-Feld NanoESP/MyMQTTiD/test eintragen und unter Message eine beliebige Nachricht eingeben, z.B. “Hello from my Browser”. Nun bekommen Sie im Seriellen Monitor die Nachricht angezeigt. Die Kommunikation steht also.

Der Wensocket Client von HiveMQ
Der Wensocket Client von HiveMQ