MQTT (Message-Queue-Telemetry-Transport-Protokoll) ist ein einfaches aber effektives Protokoll für den Datenaustausch von Informationen jeglicher Art.
Beispielsweise für die Übermittlung der Daten eines Temperatursensors.

https://entwickler.de/online/iot/kuck-mal-wer-da-spricht-114744.html

 

Auch für die Nutzung einer "einfachen" publish / subscribe Routine gibt es natürlich in der Arduino IDE
wieder ein fertiges Beispiel für den ESP8266 was nur darauf wartet herrunter geladen zu werden.

Zuerst müssen wir die entsprechende Library hinzufügen im Library-Manager hinzufügen.(Sketch/Include Library/Manage Librarys)

Als Filter geben wir "MQTT" ein.

LibraryManager

Nach der Installation steht uns ein vollwertiger MQTT-Client zur Verfügung!

 


 

Abhängig von der Version des installierten MQTT-Brokers muss der zu verwendende MQTT-Protkoll-Standard in der "PubSubClient" Library umgestellt werden.
Aktuell ist die Version V3.1.1, ältere Broker können aber auch noch die Versioin V3.1 als Standard nutzen.
https://www.dinotools.de/2015/04/11/mosquitto-als-mqtt-broker/
Ein V3.1.1 Client kann sich nicht mit einem V3.1 Server Verbinden, da die Initialisierungs-Strings nicht kompatibel sind! 

Bei der Verwendung eines älteren Linux-Mosquitto-Brokers (< V1.3.5) auf einem Raspberry Pi muss der ältere V3.1 Standard eingestellt werden,anderen Falls kommt es zu Probleme mit der Initialisierung.

Library:
C:\Users\USER\Documents\Arduino\libraries\PubSubClient\src\PubSubClient.h

// MQTT_VERSION : Pick the version
#define MQTT_VERSION MQTT_VERSION_3_1
//#define MQTT_VERSION MQTT_VERSION_3_1_1

 

Abfrage der installierten MQTT-Protokoll-Version auf dem Raspberry:

sudo apt-cache search mosquitto

mosquitto - MQTT version 3.1 compatible message broker

 

Informationen zum Installierten Broker können unter einem eigenen System-Topic abgefragt werden.

http://mosquitto.org/man/mosquitto-8.html

Damit das $-Zeichen nicht als Systemvariable interpretiert wird muss das Topic in einfache Anführungszeichen ('Topic') gesetzt werden

mosquitto_sub -d -t '$SYS/broker/version'

Received PUBLISH (d0, q0, r1, m0, '$SYS/broker/version', ... (22 bytes))
mosquitto version 0.15

 

Der komplette Systemstatus kann übrigens mit

mosquitto_sub -v -t '$SYS/#'

abgefragt werden

$SYS/broker/version mosquitto version 0.15
$SYS/broker/timestamp 2013-01-09 05:15:05+0000
$SYS/broker/changeset $Revision: e745e1ab5007 $
$SYS/broker/uptime 96555 seconds
$SYS/broker/messages/stored 20
$SYS/broker/messages/received 18076
$SYS/broker/messages/sent 22396
$SYS/broker/messages/per second/received 0
$SYS/broker/messages/per second/sent 0
$SYS/broker/clients/total 5
$SYS/broker/clients/inactive 0
$SYS/broker/clients/active 5
$SYS/broker/clients/maximum 6
$SYS/broker/heap/current size 7860 bytes
$SYS/broker/heap/maximum size 10628 bytes
$SYS/broker/bytes/received 464456
$SYS/broker/bytes/sent 709640
$SYS/broker/bytes/per second/received 4
$SYS/broker/bytes/per second/sent 7
$SYS/broker/uptime 96566 seconds

 


 

Jetzt nur noch fix das Sample:

PubSubClient/mqtt_esp8266

laden und die Anpassungen für das eigene Netz vornehmen.

const char* ssid     = "SSID";
const char* password = "PASS";
const char* mqtt_server = "192.168.xxx.xxx";

Die Konstante "BUILTIN_LED" sollte eigentlich je nach Modultyp den richtigen Port für die onBord LED des ESP ermitteln.
Bei dem hier eingesetzten ESP8266-12e scheint die LED aber an einem anderen GPIO angeschlossen zu sein
oder einer der freundlichen Chinesen hats verfriemelt....:-)
Daher habe ich den GPIO von Hand geändert:

 void setup() {
  pinMode(2, OUTPUT);     // Initialize the BUILTIN_LED pin as an output

....
....

// Switch on the LED if an 1 was received as first character
  if ((char)payload[0] == '1') {
    digitalWrite(2, LOW);   // Turn the LED on (Note that LOW is the voltage level
    // but actually the LED is on; this is because
    // it is acive low on the ESP-01)
  } else {
    digitalWrite(2, HIGH);  // Turn the LED off by making the voltage HIGH
  }

Und ab damit in den ESP8266........

 


 

Nach dem Flashen sollte in der Debugausgabe des Terminalprograms die erfolgreiche Verbindung zum MQTT-Broker,
sowie das erfolgreiche Senden des ersten "Hello World" Topic in Endlosschleife zu sehen sein!

 MQTT Connect

 


 

Schauen wir jetzt auf der anderen Seite was am MQTT-Broker ankommt:

MQTT Broker RxD

läuft......

 


 

Jetzt die andere Richtung....
Jedes beliebige publish an das Topic "in Topic" erscheint bereitwillig in der Debugausgabe:

ESP8266 RxD

 


 

Zurück zur LED.........
Empfängt der ESP8266 Daten mit einer führenden 1 oder 0 wird der konfigurierte GPIO für die onBoard LED geschaltet.

MQTT Broker LED

ESP8266 LED

 

Mit diesem Sample sollte sich eine vollständige MQTT-Kommunikation aufbauen lassen.....

 


 

 https://youtu.be/yTxkEN63iFs
Breadboard

 

Kommentare (2)

Cancel or

  • Marco Pfannenstiel
    Moin,

    sorry, habe heute erst gesehen das du was geschrieben hattest.....?

    Den FHEM-TEIL wollte ich noch einstellen, es fehlt leider momentan die Zeit.
    Schicke mir mal eine Mail.... pf@nne-mail.de
    dann sende ich dir meine fhem.cfg, ist eigentlich nicht so wild.
  • lenoxef
    Hallo,

    super Anleitung.. hat alles geklappt so wie beschrieben, allerdings hängts bei mir bei der einbindung in FHEM.. könntest du mir oder der allgemeinheit vieleicht den MQTT Bereich deiner fhem.cfg zur Verfügung stellen?

    Danke.