In der letzten Folge dieser Serie habe ich mich erstmals mit dem Pretzel-Board beschäftigt, das einen ATmega328 und einen WLAN-Chip ESP8266 vereint. Das Pretzel-Board wurde über USB an meinen PC angeschlossen; über einfache Textkommandos, die der ATmega328 einfach an den ESP8266 weitergab, konnte ich den WLAN-Chip von einem PC-Terminalprogramm aus steuern. Und so hatte ich mich erfolgreich ins heimische WLAN-Netzwerk eingeloggt und konnte schließlich auch Zeichen über TCP/IP innerhalb meines Intranets versenden.

Nun sollte es mit MQTT weitergehen. Die nötigen Kommandos manuell zusammenzustellen und ins Terminalprogramm einzugeben war freilich etwas umständlich. Doch ich hatte ja schon für den 9. Teil der Serie eine kleine Minimalbibliothek für den PC geschrieben, welche Zeichenketten für die MQTT-Kommandos CONNECT und PUBLISH zusammenstellen und dann an einen MQTT-Testbroker im Internet schicken konnte.

Wenn ich die Routinen
TCPClient_Connect(String IPAddressString, int Port)
zum Verbinden mit einem TCP-Server im Netz und
TCPClient_Send(Byte[] data, int length, Boolean Answer)
zum Senden von Daten an diesen Server
nun einfach so umschrieb, dass der ESP8266 anstatt des eingebauten Netzwerkinterfaces die nötigen Aufgaben erledigte, dann konnte ich die Routinen zum Zusammenstellen der MQTT-Kommandos einfach 1:1 wiederverwenden.

Das Pretzel-Board wurde damit zu einer Art WLAN-Dongle für meinen PC. Die Firmware im ATmega328 blieb ja vorerst: Sie gab brav alle Zeichen an den ESP8266 weiter, die über einen virtuellen COM-Port vom PC aus empfangen wurden und umgekehrt. Die nötigen C#-Routinen zum Senden über die serielle Schnittstelle hatte ich ja auch schon vorliegen. Einen Thread zum fortwährenden Einlesen empfangener Zeichen benötigte ich noch, damit ich die Rückantwort des ESP8266 im PC-Programm anzeigen lassen konnte. Den Code übernahm ich im Wesentlichen von der offiziellen C#/.NET-Dokumentation.
Ich versah mein PC-Programm danach mit mehreren Schaltflächen, um verschiedene Aktionen auszulösen: Einmal für einen Reset des ESP8266 und einmal für das Verbinden mit meinem WLAN-Netzwerk. Zur Kontrolle des Ganzen zog ich noch ein großes Textfeld auf, in dem die Rückmeldungen des ESP8266 an den PC angezeigt wurden.
 
Das Ergebnis meiner Bemühungen sieht man im Screenshot. Bei meinem „MQTT Minimal Client mit ESP8266“ muss man in der Dropdownbox oben rechts zuerst den COM-Port auswählen, über den sich das Pretzel-Board mit dem PC verbunden hat. Danach sollte man den WLAN-Chip über die Schaltfläche darunter resetten. Nun trägt man die SSID und das Passwort für das eigene WLAN-Netzwerk in die Textfelder ein und betätigt die Schaltfläche „WiFi Connect“. Das AT-Kommando und die etwas verzögerte Antwort des WLAN-Chips (sie müsste im Erfolgsfall schlicht „OK“ lauten) kann man im großen Textfenster sehen.

Hat bis hierhin alles geklappt, dann kann man sich über den Button direkt darunter mit dem TCP-Server im Netz verbinden, welcher als MQTT-Broker fungiert (in meinem Fall der HiveMQ-Broker). Hier zeigt ein „CONNECT“, gefolgt von „OK“, dass eine TCP/IP-Verbindung steht.

Nun können wir mit MQTT beginnen. Ein Druck auf die Schaltfläche „MQTT Connect“ lässt die Minimalbibliothek das nötige MQTT-Kommando zusammenstellen und an den Testbroker über TCP/IP senden. Alles funktioniert hier wie im 9. Teil beschrieben, nur dass diesmal eben der ESP8266 die Netzwerk-Arbeit erledigt. Die Ähnlichkeit der Programme ist auch im Quellcode  zu erkennen, den man unten downloaden kann – diesen sollte man einfach einmal mit dem Quellcode des Programms aus dem 9. Teil vergleichen.

Nach Eingabe eines Topics und eines Textes kann man Nachrichten an den MQTT-Testbroker versenden, die mit einem MQTT-Client überall auf der Welt abonniert und angezeigt werden können. Übrigens dürfen – weder beim HiveMQ-Broker noch beim ebenfalls schon in dieser Serie verwendeten Mosquitto-Testbroker – die Zeichen CrLf mitgeschickt werden, die der ESP8266 standardmäßig an TCP/IP-Nachrichten anhängt; dann beenden die Testbroker die TCP-Verbindung. Man muss also als Zeichenzahl im AT+CIPSEND-Kommando die genaue Länge des MQTT-Strings angeben.

Nach etwa zwei Minuten schließt der ESP8266 übrigens eine TCP/IP-Verbindung, wenn hierüber nichts mehr hierüber gesendet wird („CLOSED“); dann muss sie neu aufgebaut werden. Man könnte das vermeiden, indem man das PC-Programm mit einem Timer anweisen würde, jede Minute eine neue MQTT-Nachricht zu versenden. Ein solches Verhalten wäre zum Beispiel bei einem Temperatursensor sinnvoll, der Messwerte über MQTT veröffentlicht. Mehr darüber in einer der nächsten Teile der Serie!