Ein MQTT Broker auf dem ESP8266: MQTT Goes Embedded
MQTT ist derzeit eines der populärsten Kommunikationsprotokolle für IoT-Anwendungen. Jede Kommunikation findet über einen zentralen Verteiler, den so genannten MQTT Message Broker, statt. Dieser Beitrag stellt die erste quelloffene MQTT-Broker-Implementierung für den WiFi-fähigen Controller ESP8266 vor.
Anbieter zum Thema

Viele aktuelle IoT-Designs basieren auf der Nutzung des MQTT (Message Queuing Telemetry Transport) Protokolls [6], ein offenes Nachrichtenprotokoll für Machine-to-Machine-Kommunikation, das das Publisher/Subscriber-Kommunikationsmodell auf der Basis eines zentralen Brokers implementiert und eine gute Basis zur Integration von IoT-Komponenten darstellen. Für nahezu alle Internet-fähigen embedded Systeme existieren MQTT-Client-Implementierungen, die sich ihrerseits dann mit einem MQTT Broker auf einem Server (ein Raspberry Pi genügt) oder in der Cloud verbinden.
Eine quelloffene und energieeffiziente MQTT-Broker-Lösung
Ein solcher embedded Controller ist der ESP8266 [2] mit einer 32-bit Architektur, 96 KByte RAM, einigen konfigurierbaren GPIOs und als Alleinstellungsmerkmal einer vollständigen WiFi-Schnittstelle mit komplettem TCP/IP Stack. Dieser Controller ist in letzter Zeit aufgrund der Stückpreise von vollständigen Modulen inklusive 4MByte Flash und HF-Teil von unter 2 € sehr populär geworden und findet sich inzwischen in zahlreichen IoT-Geräten.
Es existieren auch mehrere MQTT-Client-Bibliotheken für den ESP8266, allerdings erfordern diese zusätzlich einen MQTT-Broker, der als zentrale Instanz die veröffentlichten Daten („Topics“) vermittelt. Ein solcher Broker läuft in der Regel auf einem lokalen Linux-System oder gleich als Cloud-Anwendung. In manchen vernetzten IoT-Anwendungen ist ein lokaler Linux-Rechner aber aus Kosten- oder Energiegründen nicht realisierbar (selbst ein Raspberry Pi Zero W verbraucht mehr als das doppelte eines ESP8266 und kostet mehr als das fünffache) und eine dauerhafte Internetverbindung in die Cloud ist nicht gegeben – z.B. mobil in Fahrzeugen.
Um hier nicht das bestehende Publisher-Subscriber-Paradigma und existierende Software-Komponenten, die MQTT nutzen, aufgeben zu müssen, wäre es hilfreich, die Anforderungen an die Hardware für einen MQTT-Broker weiter reduzieren zu können, um ihn in die Anwendung integrieren zu können. Dieser Beitrag beschreibt nun die erste quelloffene MQTT-Broker-Implementierung für den ESP8266. Diese dürfte mit ihrem speichersparenden Ansatz die günstigste und energie-effizienteste verfügbare Umsetzung eines MQTT-Brokers darstellen.
Lösung aus drei Software-Schichten
Die „uMQTTBroker“-Bibliothek [5] stelle die Basisschicht der Broker-Lösung dar. Sie implementiert das MQTT-Protokoll auf Client- und Server-Seite, basiert auf dem lwip TCP/IP-Stack [1] sowie einer weit verbreiteten MQTT-Client-Bibliothek [7] und arbeitet mit den Standard-Bibliotheken des ESP8266 ohne Notwendigkeit eines nebenläufigen Tasking-Systems. Sie lässt sich auch in andere Entwicklungsumgebungen integrieren, insbesondere in die in der Maker-Szene beliebte Arduino Shell und Laufzeitumgebung [3].
Die uMQTTBroker-Bibliothek unterstützt die MQTT-Protokollversionen 3.1 und 3.11 und hat als funktionale Limitationen nur die Einschränkung auf das sog. QoS-Level 0, d.h. die Transportsicherung beschränkt sich auf die Übertragung mit TCP, user-level Acknowledgements oder transaktionale Semantik (MQTT QoS-Level 1 und 2) werden nicht unterstützt, da sie potentiell beliebig viel Speicherplatz benötigen.
Darüber hinaus werden die Anzahl der zwischengespeicherten („retained“) Topics und die Anzahl der möglichen Subskriptionen statisch durch die Vorgaben der Anwendung begrenzt. Die Anzahl der Clients ist ebenfalls durch den Speicherplatz beschränkt. Maximal 8 sind möglich eine Verbindung benötigt etwa 3 KB RAM. Mit einem entsprechenden API lassen sich auf dem ESP8266, der den Broker ausführt, auch lokal Topics publizieren und empfangen, sodass dieser Controller nicht auf die Rolle als Broker beschränkt ist, sondern auch funktionale Komponente einer verteilten Anwendung sein kann.
Auf dieser Basis implementiert das Projekt „esp_mqtt“ [4] darüber hinaus eine interaktive Oberfläche, mit deren Hilfe der Broker über WiFi oder über die serielle Schnittstelle konfiguriert werden kann. Insbesondere lassen sich damit auch die Netzwerk-Schnittstellen entweder als WiFi-Client, als Access Point (AP) oder als beides konfigurieren. Mit der AP-Funktion kann der ESP8266 dann auch jegliche weitere Netzwerk-Infrastruktur in einem System ersetzen, was den Aufbau weiter vereinfacht. Zusätzlich lässt sich der Broker gleichzeitig als MQTT-Client eines weiteren Systems, z.B. in der Cloud betreiben, sodass der lokale Broker z.B. als Proxy den lokalen Verkehr vermittelt und bei bestehender Internetverbindung globale Topics an eine übergeordnete Schicht weitergibt oder von ihr empfängt.
Als dritte Schicht lassen sich auf der interaktiven Oberfläche Skripte installieren, die mit einer einfachen Ereignis-basierten Sprache erstellt werden können und zur Beschreibung von Reaktionen auf eingehende Topics, Timer oder I/O-Ereignissen genutzt werden können. Damit lassen sich einfache Anwendungen bereits ohne „richtige“ Programmierung erstellen. Diese Skripte lassen sich interaktiv über HTTPS hochladen, sodass während der Entwicklung und bei Updates kein Neu-Flashen erforderliche ist.
Die Sicherheit der embedded Anwendung wird zunächst über die WPA-PSK-Verschlüsselung der WiFi-Strecke gewährleistet, so können nur autorisierte Clients Kontakt mit dem WiFi-AP aufnehmen. Clients können dann weiterhin über den MQTT-inhärenten Username/Password Mechanismus individuell authentisiert werden. Ausgehende Verbindungen zu einem Broker in der Cloud können über TLS gesichert werden. Eine zusätzliche TLS-Sicherung aller Verbindungen zum Broker auf dem ESP8266 lässt sich mit dem begrenzten Speicherplatz des Controllers allerdings nicht realisieren. Der erforderliche Status für mehrere TLS-Verbindungen wäre zu umfangreich. Der Zugang zu Konfigurationsoberfläche kann auf einzelne WiFi-Netze eingeschränkt und/oder mit Password gesichert oder ganz unterbunden werden.
Eine Beispielsanwendung für den MQTT Broker
Eine typische Anwendung, die mit der vorgestellten Software realisiert wurde, war die Anbindung neuerer MQTT-fähiger WiFi-Steckdosen an eine ältere SmartHome-Steuerung, die lediglich serielle Schnittstellen zur Erweiterung anbietet. Der ESP8266 arbeitet hier als Broker und spannt im AP-Modus ein eigenes WiFi-Netz auf. Ein Script interpretiert die seriellen Kommandos der Steuerung und initiiert entsprechende MQTT-Nachrichten zum Ein- und Ausschalten. Umgekehrt werden eingehende Sensor-Werte (Tasten-Betätigungen) als MQTT-Topics lokal subskribiert und an den seriellen Input weitergeleitet.
Leichtgewichtig und kostengünstig
Zusammenfassend lässt sich festhalten, dass mit der beschriebenen Umsetzung eines MQTT-Brokers auf einem embedded Controller gezeigt wird, dass sich auch kleine, gegebenenfalls nicht dauerhaft mit dem Internet verbundene verteilte Systeme auf dem vergleichsweise einfachen MQTT Protokoll aufsetzen lassen und keine speziellen „leichtgewichtigen“ anwendungsspezifische Kommunikationslösungen entworfen werden müssen. Das fördert die Wiederverwendbarkeit der Komponenten, verbessert die Interoperabilität und trägt zur Stabilität und Sicherheit im Gesamtsystem bei. Die Quellen der Software sind unter [4] und [5] frei verfügbar.
:quality(80)/images.vogel.de/vogelonline/bdb/1436900/1436959/original.jpg)
Connectivity im IIoT – Welcher Konnektivitätsstandard passt zu welcher Anwendung?
:quality(80)/images.vogel.de/vogelonline/bdb/1443300/1443304/original.jpg)
IoT ohne Internet: Pragmatischer Ansatz für Konnektivität
:quality(80)/images.vogel.de/vogelonline/bdb/1413200/1413264/original.jpg)
Was ist MQTT?
(Dieser Beitrag wurde mit freundlicher Genehmigung des Autors dem Tagungsband Embedded Software Engineering Kongress 2018 entnommen.)
Literaturverzeichnis
[1] Dunkels, Adam, “Design and implementation of the lwIP TCP/IP stack”, Swedish Institute of Computer Science. 2, 2001
[2] Espressif Systems, “ESP8266EX Datasheet”, Version 5.8, 2018
[3] Ivan Grokhotkov, “ESP8266 Arduino Core Documentation, Release 2.4.0”, May 14, 2017
[4] Martin Gergeleit, MQTT Broker/Bridge on the ESP8266
[5] Martin Gergeleit, uMQTTBroker, MQTT Broker library for ESP8266 Arduino
[6] OASIS, MQTT Version 3.1.1, December 2015
[7] Dong Viet, Native MQTT client library for ESP8266, Februar 2015
* Martin Gergeleit ist Professor für Informatik an der Hochschule RheinMain in Wiesbaden. Seine Arbeitsschwerpunkte liegen in den Bereichen Computersicherheit, Drahtlose Netzwerke und IoT.
(ID:46010727)