Walter Trojan
Elektor-Verlag GmbH 52072 Aachen www.elektor.de
Das MQTT-Praxisbuch führt Schritt für Schritt in die praktische Arbeit mit diesem ressourcensparenden Protokoll ein. Dabei widmet der Autor Walter Trojan dem Thema IoT-Sicherheit ein ausführliches Kapitel. Anhand von abgeschlossenen Projekten zum Nachbauen stellt der Autor in beeindruckender Weise die praktische Bedeutung des MQTT-Protokolls in modernen IoT-Anwendungen dar: • • • • • • •
MQTT auf ESP8266 MQTT mit Arduino-IDE MQTT-Benchmarks MQTT auf dem Raspberry Pi Flow-Programmierung mit Node-RED Boss aller Automaten: openHAB Projekt Gewächshaus mit automatisierter Beleuchtung, Bewässerung, Temperaturregelung sowie Luftund Erdfeuchtigkeitsmessung
DESIGN SHARE
ISBN 978-3-89576-324-3
DAS MQTT-PRAXISBUCH
●
Walter Trojan begann seine berufliche Laufbahn als Fernmelde-Techniker. Anschließend studierte er Nachrichtentechnik. Er war fast 40 Jahre bei einem IT-Hersteller tätig, arbeitete dort auf Großcomputern, im System-Management und in der IT-Sicherheit. Hauptsächlich programmiert er in C und Pascal, hat aber keine Berührungsängste mit Java, Javascript und Python.
MQTT ist ein leichtgewichtiges, ereignis- und nachrichtenorientiertes Protokoll zur effizienten und asynchronen Kommunikation zwischen Geräten auch über limitierte Netzwerke. Das bereits 1999 von IBM entwickelte Protokoll eignet sich heute in besonderer Weise für Internetof-Things-Anwendungen. Im Gegensatz zu HTTP mit Request/Response-Verfahren ist bei MQTT eine Publish/ Subscribe-Architektur umgesetzt. Es stehen mittlerweile zahlreiche MQTT-Broker und -Clients zur Verfügung. Aufgrund der Unterstützung durch die Eclipse Foundation, IBM und vieler anderer stehen zahlreiche Komponenten kostenlos im Internet zur Verfügung. Client-Bibliotheken gibt es für die unterschiedlichsten Plattformen und Programmiersprachen. Unterstützt werden u.a. die PC-Plattform mit Java und .Net sowie Arduino und Raspberry Pi.
DAS MQTT-PRAXISBUCH
DAS MQTT-PRAXISBUCH
MIT ESP8266 UND NODE-RED
WALTER TROJAN
MIT ESP8266 UND NODE-RED
Walter Trojan LEARN DESIGN SHARE
LEARN
LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHAR GN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHA
Das MQTT-Praxisbuch ● Walter Trojan
an Elektor Publication LEARN
MQTT DE 170504.indd 3
DESIGN
SHARE
18-05-17 09:01
●
© 2017: Elektor Verlag GmbH, Aachen.
●
Alle Rechte vorbehalten.
1. Auflage 2017
Die in diesem Buch veröffentlichten Beiträge, insbesondere alle Aufsätze und Artikel sowie alle Entwürfe, Pläne, Zeichnungen und Illustrationen sind urheberrechtlich geschützt. Ihre auch auszugsweise Vervielfältigung und Verbreitung ist grundsätzlich nur mit vorheriger schriftlicher Zustimmung des Herausgebers gestattet. Die Informationen im vorliegenden Buch werden ohne Rücksicht auf einen eventuellen Patentschutz veröffentlicht. Die in diesem Buch erwähnten Soft- und Hardwarebezeichnungen können auch dann eingetragene Warenzeichen sein, wenn darauf nicht besonders hingewiesen wird. Sie gehören dem jeweiligen Warenzeicheninhaber und unterliegen gesetzlichen Bestimmungen. Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Verlag, Herausgeber und Autor können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung noch irgendeine Haftung übernehmen. Für die Mitteilung eventueller Fehler sind Verlag und Autor dankbar. Umschlaggestaltung: Elektor, Aachen Lektorat: Volker Bombien, Köln Satz und Aufmachung: D-Vision, Julian van den Berg | Oss (NL) Druck: Media-Print Informationstechnologie GmbH, Paderborn Printed in Germany
●
ISBN 978-3-89576-324-3
Elektor-Verlag GmbH, Aachen www.elektor.de
Elektor ist Teil der Unternehmensgruppe Elektor International Media (EIM), der weltweit wichtigsten Quelle für technische Informationen und Elektronik-Produkte für Ingenieure und Elektronik-Entwickler und für Firmen, die diese Fachleute beschäftigen. Das internationale Team von Elektor entwickelt Tag für Tag hochwertige Inhalte für Entwickler und DIYElektroniker, die über verschiedene Medien (Magazine, Videos, digitale Medien sowie Social Media) in zahlreichen Sprachen verbreitet werden. www.elektor.de
LEARN
MQTT DE 170504.indd 4
DESIGN
SHARE
18-05-17 09:01
Inhalt Vorwort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Kapitel 1 • MQTT: Das Protokoll des Internets der Dinge . . . . . . . . . . . . . . . . . . . . 11 Anforderungen an ein IoT-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Ein erster Blick auf die MQTT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Architektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Filterung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Qualitätssicherung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Sicherheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Aufbewahrte Nachrichten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Letzter Wille . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Und wer hat´s erfunden? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Positionierung zu HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Broker und Klienten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Kapitel 2 • Von der Theorie zur Praxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Ohne Broker-Installation mit mqtt-spy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Installation von Mosquitto auf PC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Starten des Mosquitto-Brokers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 MQTT-Pub-Klient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 MQTT-Sub-Klient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Einfache Pub/Sub-Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 Pub/Sub-Session mit Retain und QoS=2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Letzter Wille . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Kapitel 3 • Kleines Praxisbeispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Zunächst ein wenig Planung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Und das brauchen wir dazu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Viele Wege führen zur Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Arduino-IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Eclipse und C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 MQTT-Client auf ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Mosquitto Broker auf Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Und jetzt alles zusammen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Und was ist bisher erreicht? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
●5
MQTT DE 170504.indd 5
18-05-17 09:01
Das MQTT-Praxisbuch Kapitel 4 • Ein Blick ins MQTT-Innere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Broker-Konfiguration am Beispiel Mosquitto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 MQTT-Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Generelles Message-Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Fixed-Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Variable(r) Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Payload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Meldungsbeispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 Qualitätssicherung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Protokollmessung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 MQTT über WebSockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Broker-Info mit $SYS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Persistent Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Kapitel 5 • Sicherheit zuerst! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Warum Sicherheit im IoT? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 MQTT-Sicherheitsarchitektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Authentisierung mit Username und Passwort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Gesicherte Client-ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 TSL/PSK-Verschlüsselung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 TLS/SSL-Verschlüsselung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 TLS-Handshake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Ablauf einer TLS-Kommunikation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Autorisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Absicherung von MQTT-Systemen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Kapitel 6 • Steigerung von Leistung und Verfügbarkeit . . . . . . . . . . . . . . . . . . . . 107 Brücken zum Nachbarn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Brücke mit lokalem Broker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Brücke in die Cloud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Cluster mit Load-Balancer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Klient-Resilienz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Kapitel 7 • Hacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Hack#1: MQTT auf ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
●6
MQTT DE 170504.indd 6
18-05-17 09:01
Inhalt Kurze Vorstellung des ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 NodeMCU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 MQTT-Aktor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Entwicklungsumgebung Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Aufbau und Anwendung des MQTT-Klienten in C . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Test-Programm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Hack#2: MQTT auf ESP8266 mit Arduino IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Installation Arduino IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 MQTT-PubSub-Klient . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 Sensor-Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Sensor-Messungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Hack#3: MQTT-Benchmark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 Testprogramm in C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 Ergebnisse auf dem PC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 Ergebnisse auf dem Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Benchmark der Profis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Hack#4: MQTT-Klienten auf dem Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Entwicklungssystem Geany . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Libmosquitto in C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 MQTT-Client in Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 Hack#5: Flow-Programmierung mit Node-RED . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Was ist Node-RED? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Start bei FRED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Installation von Node-RED auf PC und Raspi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 MQTT-Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 Komfortable Benutzerschnittstelle: Das Dashboard . . . . . . . . . . . . . . . . . . . . . . . . 189 Hack#6: Boss aller Automaten: openHAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 Zielsetzung und Struktur von openHAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 Wer angibt, hat mehr vom Leben: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Komponenten von openHAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 openHAB-Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 MQTT-Binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
â—?7
MQTT DE 170504.indd 7
18-05-17 09:01
Das MQTT-Praxisbuch MQTT-Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 Kapitel 8 • Projekt Gewächshaus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Konfiguration Gewächshaus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Mechanischer Aufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Temperatur und Licht werden geregelt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Ein kurzer Ausflug in die Regelungstechnik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Test eines Node-RED PID-Reglers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Ein erster Regelkreis über MQTT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 Manuelle Steuerung und Messung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 Gesamtlösung Gewächshaus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 Node-RED-Dashboard mobil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 Überlegungen für ein Großprojekt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Kapitel 9 • MQTT-Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 MQTT.fx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 mqtt-spy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 MQTT-Zugang über Websockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Leistungstest mit SDKPerf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 Paho MQTT Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 Mobile MQTT-Klienten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 Was es sonst noch gibt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 Kapitel 10 • Referenzprojekte und alternative Protokolle . . . . . . . . . . . . . . . . . . 255 MQTT-Referenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Facebook Messenger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Integrated Electronic Control Centre (IECC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 EVRYTHNG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Amazon Web Services IoT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 Open_Geospatial_Consortium (OGC® ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 Andere Protokolle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260 STOMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 AMQP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
●8
MQTT DE 170504.indd 8
18-05-17 09:01
Vorwort
Vorwort Da Sie dieses Buch in der Hand halten und nun lesen wollen, haben Sie die Bedeutung des Internets der Dinge (IoT) längst erkannt und es ist Ihnen bewusst, dass hier zurzeit eine rasante Entwicklung stattfindet und in naher Zukunft Milliarden von Geräten vernetzt werden, die Billionen Daten austauschen. Vielleicht überlegen Sie gerade, wie Sie die intelligenten Komponenten Ihres Projekts effektiv vernetzen können, denn die Auswahl an Kommunikationsprotokollen ist riesig: RS485, http, ZigBee etc. Oder welche Netzarchitektur man bevorzugen sollte, Punkt-zu-Punkt, vermaschtes Netzwerk (Mesh), mit Broker usw. Für all diese Fragen bietet ein Protokoll, das speziell für das IoT entwickelt wurde, eine überzeugende Lösung an: Message Queue Telemetry Transport, kurz MQTT genannt. Die im Buch dokumentierten Spezifikationen werden Sie überzeugen und vielleicht publizieren bzw. subskribieren Ihre Geräte bald mittels MQTT. Wenngleich auch große Konzerne wie IBM, Facebook und Amazon dieses Protokoll nutzen, sind Ressourcenbedarf und Implementationsaufwand so gering, dass auch Maker und Hobbyisten die Vorteile von MQTT nutzen können. Über dieses Buch Dieses Buch soll Ihre Entscheidung über den Einsatz für ein Protokoll in Ihrem Projekt untermauern und Sie bei der Realisierung unterstützen. Neben der notwendigen Theorie wurde die praktische Anwendung in den Mittelpunkt gestellt. Und das erwartet Sie konkret: Zuerst werden Ihnen in der Einführung die Funktionsweise und Architektur von MQTT vorgestellt sowie auf besondere Fähigkeiten wie Qualitätssicherung und „letzter Wille“ (ja, ein Testament gibt es tatsächlich) hingewiesen. Danach werden Sie ermuntert, die ersten Gehversuche zu unternehmen, Broker und Tools auf einem PC zu installieren und die Basisfunktionen anzutesten. Auf dieser Grundlage lässt sich dann bereits ein erstes zwar einfaches, aber komplettes Projekt realisieren, das sogar von einem mobilen Gerät bedient werden kann. Nun geht’s ans Eingemachte, es folgen drei Kapitel über Protokoll- und Konfigurationsdetails, die Sicherheit mit Authentisierung und Autorisierung sowie Maßnahmen zur Steigerung der Verfügbarkeit. Jetzt können Sie aufatmen, das Schwierigste ist geschafft. Denn nun folgen einige Hacks, das sind in sich abgeschlossene kleine Projekte rund um MQTT. Dabei werden Aktoren und Sensoren auf den Plattformen ESP8266 und Raspberry Pi vorgestellt. Dafür stehen unterschiedliche Entwicklungsplattformen wie Eclipse, Arduino-IDE und Geany für die MQTT-Klienten zur Verfügung. Zusätzlich wird ein kritischer Blick auf die Leistungsstärke der MQTT-Broker im Rahmen von Benchmarks geworfen. Wer mit wenigen Klicks MQTT-Lösungen erstellen möchte, wird sich mit dem grafischen Programmiersystem Node-RED rasch anfreunden. Und für die Integration der vielen auf dem Markt verfügbaren Bedienungssysteme steht die Mutter aller Automaten, OpenHAB, inklusive MQTT-Adapter zur Verfügung. Danach geht es nochmal in die Praxis und zwar mit der der Steuerung/Reglung eines (Modell-) Gewächshauses mittels MQTT und Node-RED. Den Abschluss des Buchs bilden zwei Kapitel über MQTT-Tools sowie Referenzprojekte und alternative Protokolle.
●9
MQTT DE 170504.indd 9
18-05-17 09:01
Das MQTT-Praxisbuch
Der Dank des Autors geht an: Ohne meinen Lektor Herrn Volker Bombien hätte es dieses Buch (von mir) nicht gegeben. Er hat mich mit zahllosen Anregungen versorgt und meine Motivation stets hochgehalten. Auch dem Team des Elektor-Verlags gilt mein Dank für Korrekturen, das exzellente Buch-Cover und den Satz des Werks. Meine besondere Wertschätzung aber haben die Firmen und Gesellschaften, die kostenfrei Protokolle, Broker, Tools und Dokumentation bereitstellen. Ohne sie hätte es für dieses Buch keine Basis gegeben. Nicht zu vergessen auch die zahllosen Communities, Blogger und Youtuber, die ihr Wissen und ihre Unterstützung selbstlos abliefern. Aber ohne Familie läuft gar nichts. Mein vielbeschäftigter Sohn opferte seine Zeit fürs Probelesen, meine Enkel haben mich immer wieder aus dem Laborkeller in das reale Leben geholt und zum Verschnaufen angeregt. Und meine liebe Frau Hanne hat mich bestens versorgt und geduldig auf Ausflüge sowie notwendige Hausreparaturen und Gartenarbeiten verzichtet. Herzlichen Dank an alle! Und nun viel Vergnügen und zahlreiche Erkenntnisse bei der Lektüre dieses Buches.
● 10
MQTT DE 170504.indd 10
18-05-17 09:01
Kapitel 1 • MQTT: Das Protokoll des Internets der Dinge
Kapitel 1 • MQTT: Das Protokoll des Internets der Dinge Schätzungen gehen davon aus, dass bis 2020 das Internet der Dinge (IoT) etwa 4 Milliarden Menschen sowie 25 Milliarden Embedded-Systeme und intelligente Geräte vernetzen wird. Dabei werden mehr als 50 Billionen Daten austauscht, die fast alle Lebensbereiche, vom Kühlschrank bis zur Heizung, von der Kleidung bis zum Auto, vom Rauchmelder bis zum Krankenbett etc., tangieren. Dieser rasante Anstieg der Kommunikation erfordert natürlich besonders leistungsfähige und robuste Verbindungssysteme.
Anforderungen an ein IoT-Protokoll Für das Verbinden der unterschiedlichsten Geräte ist ein vielseitiges Übertragungsprotokoll wünschenswert, bei dem folgende Aspekte Berücksichtigung finden sollten: Schlankheit und Leichtgewichtigkeit Die intelligenten „Dinge“ sind meistens mit Mikrocontrollern ausgestattet, die begrenzte Speicherkapazitäten aufweisen. Deshalb sollte das Protokoll möglichst schlank sein, damit auch kleinere Geräte einbezogen werden können. Ein Webserver überfordert möglicherweise viele Kleinsysteme. Auch im Hinblick auf die abgeforderte Prozessorleistung ist Bescheidenheit angesagt. Geringer Overhead Nicht nur in Bezug auf die Rechner-Ressourcen ist auf einen geringen Overhead zu achten, auch die erforderliche Netzbandbreite ist ein wichtiges Designkriterium. Für batteriebetriebene Knoten ist zudem ein geringer Strombedarf aufgrund möglichst weniger Prozessorzyklen je übermittelter Nachricht wichtig. Offenheit für alle Geräte und Daten Bei der Vielfalt der anzuschließenden Geräte sollte das Protokoll für alle Prozessorfamilien und Programmiersprachen offen sein. Zudem sollte es keine Begrenzung bei der Übertragung unterschiedlicher Datentypen wie Zahlen, Texte oder binäre Objekte geben. Sicherung der Übertragungsqualität Ganz wichtig bei der Implementation missionskritischer Anwendungen ist die Absicherung der Nachrichtenintegrität. Das gilt auch für Netzwerke mit schwankender Übertragungsqualität, wie z.B. in Mobilfunknetzen, bei denen die Gefahr von Aussetzern besteht, oder in der Industrie, bei der Einwirkungen von Störungen auftreten können. Hier sollten Mechanismen verfügbar sein, die die Ankunft einer Nachricht am Ziel garantieren. Überwachung der Verbindung Es kann durchaus passieren, dass ein Knoten seinen Dienst einstellt, z.B. wegen einer leeren Batterie oder aufgrund von Hardware-Störungen. Diese Vorfälle sollten nicht unbemerkt bleiben, sondern anwendungsspezifische Umgehungslösungen aktivieren oder Alarme auslösen. Flexible Architektur Das verwendete Protokoll sollte eine flexible Architektur ermöglichen, bei der sich Knoten
● 11
MQTT DE 170504.indd 11
18-05-17 09:01
Das MQTT-Praxisbuch
beliebig konfigurieren lassen. So sollten Geräte zusätzlich „ein- bzw. ausgehängt“ oder Kommunikationsverbindungen ohne Anpassung der Knoten-Firmware geschaltet werden können. Ganz schön anspruchsvolle Anforderungen - mal sehen, ob und wie sie sich realisieren lassen.
Ein erster Blick auf die MQTT MQTT steht für Message Queue Telemetry Transport oder MQ Telemetry Transport. Und das waren die Original-Entwicklungsziele: • Einfache Anschlussmöglichkeit von M2M an die traditionelle Informationsverarbeitung (Mainframes, Big Data…) • Berücksichtigung von häufigen Verbindungsabbrüchen in instabilen Netzen mit geringer Bandbreite und hohen Latenzwerten • Lauffähigkeit auf Controllern mit limitierten Ressourcen wie 8 Bit, 256 KB RAM • Lose Kopplung der Knoten in dynamischen Systemen mit hochvolumiger Übermittlung von Nachrichten und Ereignissen • Flexible Konfiguration und Anpassung an sich ändernde Situationen • Abgestuftes Qualitätsmanagement zur Anpassung an Bandbreite und Verfügbarkeit sowie Liefergarantie • Unterstützung großer Netze mit vielen Knoten ( ca. 10.000 MQTT-Klienten) • Einfache Anwendungsmöglichkeit für Entwickler und Implementierer • Bereitstellung des Protokolls für Geräteentwickler und Systemhäuser mit diversifizierten Anforderungen • Einsetzbarkeit in allen Industrien Was die Entwickler lieferten, könnte kurz und knapp folgendermaßen definiert werden: MQTT ist ein leichtgewichtiges, ereignis- und nachrichtenorientiertes Protokoll zur effizienten und asynchronen Kommunikation zwischen Geräten auch über limitierte Netzwerke.
Architektur Im Gegensatz zu HTTP mit Request/Response-Verfahren wurde bei MQTT eine Publish/ Subscribe-Architektur realisiert. Dabei wird zur Realisierung der o.g. Entwicklungsziele ein zentraler Broker eingesetzt, der die sonst üblichen Punkt-zu-Punkt-Verbindungen ablöst. Geräte, die etwas zu melden haben, senden ihre Nachrichten einfach an den Broker, d. h. publizieren ihre Nachrichten. Der Broker sendet diese an andere Geräte, die diese Nachrichten benötigen und auswerten. Diese empfangenden Knoten haben die Meldungen subskribiert. Die Kommunikation kann in beide Richtungen erfolgen, ein Knoten kann publizieren und subskribieren. Wenn hier von einem Klienten, Knoten oder Gerät gesprochen wird, ist immer eine intelligente Einheit gemeint. Das kann ein einfacher Mikrocontroller, ein PC, ein Linux-Server oder ein Mainframe sein. Voraussetzung ist eben, dass hierin ein TCP-Stack und das
● 12
MQTT DE 170504.indd 12
18-05-17 09:01
Kapitel 2 • Von der Theorie zur Praxis
Kapitel 2 • Von der Theorie zur Praxis Nachdem Sie sich in das theoretische Grundgerüst eingelesen haben, juckt es Sie sicher in den Fingern, MQTT mal praktisch zu erproben. Dazu bieten sich zwei Möglichkeiten an – es kann ein externer Broker genutzt werden, so dass kein eigener installiert werden muss, es lässt sich alternativ aber auch ein Broker auf dem eigenen System installieren. In diesem Kapitel wird ein PC als Plattform genutzt, im nächsten bildet ein Raspberry Pi die Basis.
Ohne Broker-Installation mit mqtt-spy Für einen nicht sehr aufwendigen Test ohne Installation eines Brokers kann man einen verfügbaren Online-Broker nutzen. In diesem Beispiel habe ich test.mosquitto.org gewählt. Jetzt ist nur noch ein passendes Werkzeug zur Durchführung erforderlich, z.B. mqtt-spy. Dieses eignet sich nicht nur für die ersten Schritte, sondern kann auch später bei weiteren Tests nützlich sein, in denen man schnell mal eine Testmeldung publizieren oder interessierende Topics protokollieren möchte. Hier wird es für eine erste Publikation und Subskription genutzt. Die Bezugsquellen von mqtt-spy sind folgende: Quellen: https://github.com/eclipse/paho.mqtt-spy/wiki/Downloads http://www.oracle.com/technetwork/java/javase/downloads/jre8downloads-2133155.html Da es sich um eine Java-Anwendung handelt, sollte auf dem PC eine Java-Runtime-Environment installiert sein, beziehbar von Oracle.
Abb.2-1: Start-Screen - mqtt-spy.jar
● 25
MQTT DE 170504.indd 25
18-05-17 09:01
Das MQTT-Praxisbuch
Nach dem Start präsentiert sich mqtt-spy etwa wie in voranstehender Abbildung dargestellt. Die Anwendung prüft u.a., ob die aktuelle Version geladen ist, und zeigt die verfügbaren lokalen Broker und Online-Broker. Durch einen Klick auf den Button test.mosquitto.org wird eine Internetverbindung zu diesem Broker aufgebaut und folgendes Fenster gezeigt:
Abb.2-2: Erste Publikation und Subskription Das Fenster ist in drei Sektionen unterteilt, die obere dient zur Publikation, in der Mitte kann man subskribieren und unten werden die empfangenen Nachrichten protokolliert. Für eine Publikation definiert man im Feld Topic das Thema, hier „Test/spy“, und unter Data die Payload, hier „Hallo Welt“. Beim Selektor QoS lässt sich die gewünschte Servicequalität einstellen, hier 2, und das Häkchen bei Retained wird zur Abspeicherung der Nachricht gesetzt. Mit einem Klick auf den Button Publish wird die Meldung auf die Reise geschickt. Zum Empfangen aller Nachrichten unter dem Topic „Test/spy“ wird dieses Thema im Subscribe-Bereich eingegeben. Die bereits gesendete Nachricht „Hallo Welt“ wird sofort angezeigt. Aber warum ist diese Nachricht eingetroffen - die Publikation ist doch bereits vorher erfolgt und der Subscriber erhält normalerweise nur frische, aktuelle Nachrichten? Ganz einfach: Der Publisher hatte Retained angeklickt. Hierbei wird die Meldung auf dem Broker gespeichert und jedem Subscriber beim Anschalten als letzte gültige Nachricht zur Verfügung gestellt. Die Payload wird sowohl beim Subscribe im Data-Feld als auch in der Summary weiter unten dargestellt. An dieser Stelle möchte ich Sie ausdrücklich dazu ermuntern, mit diesem Tool die unterschiedlichen Funktionen von MQTT zu testen und dabei unterschiedliche Topics und Wildcard-Filter auszuprobieren.
● 26
MQTT DE 170504.indd 26
18-05-17 09:01
Das MQTT-Praxisbuch
Kapitel 3 • Kleines Praxisbeispiel Wenn man sich in ein bisher wenig bekanntes Umfeld wagt, startet man zunächst mit einer möglichst einfachen Anwendung. Beim Testen einer neuen Entwicklungsumgebung kann es sich hierbei um die Ausgabe von „Hallo World“ auf der Konsole oder das Blinken einer LED auf einem neuen Board handeln. Dies soll nun auch für den Einstieg in MQTT gelten.
Zunächst ein wenig Planung In Kapitel 2 haben Sie bereits wesentliche Funktionen von MQTT kennengelernt. Nun sollen diese Kenntnisse bzw. Erkenntnisse im Rahmen eines Praxisbeispiels erweitert werden. Unser Einstieg in die reale IoT-Welt besteht aus einer Anwendung mit typischen Elementen, die auch in größeren Projekten eingesetzt werden können. Dabei wird die Komplexität auf ein „Hello World“-Niveau begrenzt. Am Anfang steht die Aufgabenstellung: Es sollen vier LEDs mit unterschiedlichen Farben (grün, rot, blau, weiß) mittels MQTT-Anweisungen ein- bzw. ausgeschaltet werden. Die Aktivitäten des Aktors werden überwacht und Störungen gemeldet. Die Steuerung soll mittels Android-Tablet über eine benutzerfreundliche Schnittstelle erfolgen. Als Träger der Kommunikation dient das WLAN mit gutem Zugriffsschutz und brauchbarer Übertragungsqualität. Die Leistungsaufnahme sollte minimal sein. Nun werden die Komponenten definiert: Als WLAN-fähiger Aktor bietet sich der ESP8266 an, der bei kleineren Projekten auch im Standalone-Modus betrieben werden kann. Über seine reichhaltigen Peripherie-Anschlüsse lässt sich die Aufgabenstellung leicht lösen. Die Steuerung dieses Knotens übernimmt eine in C geschriebene Firmware mit adaptierten MQTT-Klienten. Im Mittelpunkt einer MQTT-Applikation steht naturgemäß die Vermittlungsstelle, auch hier kommt der in Kapitel 2 bereits vorgestellte Mosquitto-Broker zum Einsatz. Im Hinblick auf eine möglichst geringe Leistungsaufnahme wird kein Strom-hungriger PC, sondern als Plattform der Mikrocomputer Rasberry Pi verwendet, der sich mit maximal 10 Watt begnügt. Auf dem Raspberry Pi wird zusätzlich ein MQTT-Klient aktiviert, der sämtliche oder selektierte Aktivitäten protokolliert. Die Steuerung dieser Anwendung kann mittels Tablet, Handy oder PC erfolgen oder auch von einer IoT-Applikation durchgeführt werden. Hier soll ein Android-Tablet eingesetzt werden, für das ein passender MQTT-Klient noch ausgewählt werden muss. Die Blockschaltung ist, wie bei einer „Hello-World“-Anwendung üblich, sehr übersichtlich:
● 42
MQTT DE 170504.indd 42
18-05-17 09:01
Kapitel 3 • Kleines Praxisbeispiel
Abb.3-1: Projekt-Übersicht Als nächstes werden die MQTT-Kanäle definiert: Es gibt natürlich viele Möglichkeiten, die Kommunikation zu gestalten, für dieses Beispiel nutzen wir folgende Topics und Messages: Topic
Message
Aktion
ESP8266
Tablet
RaspberryPi
ESP01/LED/gn
on_LED_gn
grüne LED an
sub
pub
sub
ESP01/LED/gn
off_LED_gn
grüne LED aus
sub
pub
sub
ESP01/LED/rt
on_LED_rt
rote LED an
sub
pub
sub
ESP01/LED/rt
off_LED_rt
rote LED aus
sub
pub
sub
ESP01/LED/bl
on_LED_bl
blaue LED an
sub
pub
sub
ESP01/LED/bl
off_LED_bl
blaue LED aus
sub
pub
sub
ESP01/LED/ws
on_LED_ws
weiße LED an
sub
pub
sub
ESP01/LED/ws
off_LED_ws
weiße LED aus
sub
pub
sub
ESP01/LED/al
on_LED_all
alle LEDs an
sub
pub
sub
ESP01/LED/al
off_LED_all
alle LED aus
sub
pub
sub
ESP01/Status
ready
ESP01 ist ready
pub
sub
sub
Die Definitionen von Topic und Message wurden willkürlich gewählt - hierbei hat der Entwickler alle Freiheiten. Die Substrings in den Topics haben jeweils folgende Bedeutung: ESP01 bezeichnet den Knoten, was bei Konfigurationen mit mehreren Elementen nützlich sein kann, da man beim Subskribieren einzelne Knoten selektieren kann. /LED adressiert
● 43
MQTT DE 170504.indd 43
18-05-17 09:01
Kapitel 4 • Ein Blick ins MQTT-Innere
Kapitel 4 • Ein Blick ins MQTT-Innere Anhand der praktischen Beispiele haben Sie schon wesentliche Funktionen von MQTT kennengelernt und vielleicht ein Gefühl dafür entwickelt, was man mit dieser Technik machen kann. Aber es gibt noch viel mehr zu berichten, z.B. wie der Broker für die jeweilige Anwendung angepasst werden kann, was sich im Netz abspielt oder mit welcher Intensität MQTT genutzt wird. In diesem Kapitel gebe ich Ihnen einen kompakten Einblick in einige Interna von MQTT, ohne aber allzu sehr in die Details einzutauchen, denn diese werden eingehend in entsprechenden Referenzmanuals erläutert. Falls zusätzlicher Informationsbedarf besteht, stöbern Sie bitte in den genannten Quellen.
Broker-Konfiguration am Beispiel Mosquitto Alle MQTT-Broker lassen sich mittels einer Vielzahl von Parametern an die jeweiligen Einsatzanforderungen anpassen. Diese Flexibilität möchte ich anhand von Mosquitto demonstrieren. Mosquitto kann für viele Einsatzfälle individuell konfiguriert werden. Dazu muss man lediglich beim Start eine Konfigurationsdatei spezifizieren. Wenn man das nicht tut, startet Mosquitto mit seinen Default-Optionen. Beispiel: mosquitto –v –c MyMosquitto.conf Als Vorlage dient eine bei der Installation mitgelieferte und gut dokumentierte Datei namens mosquitto.conf. Diese findet sich auf dem PC im Installationsordner und auf dem Raspberry Pi unter /etc/mosquitto zu finden. Man kann diese Datei modifizieren und beim Start verwenden oder man bewahrt das Original als Vorlage, kopiert es in eine eigene Version, z.B. MyMosquitto.conf, und startet diese mit der Option „-c“. Hier ein kurzer Ausschnitt dieser recht umfassenden Datei:
● 69
MQTT DE 170504.indd 69
18-05-17 09:01
Das MQTT-Praxisbuch
Abb.4-1: Auszug aus mosquitto.conf Der Inhalt dieser Datei ist voll durchkommentiert, zur Aktivierung einer Option sind lediglich das Kommentarzeichen „#“ zu entfernen und ggf. Parameterwerte anzupassen. Das Erläutern aller Konfigurationsoptionen würde Umfang und Zielsetzung dieses Buches sprengen, ich möchte hier lediglich auf die Struktur der Datei und einige relevante Optionen eingehen. Quellen zu ausführliche Konfigurationsinformationen von Mosquitto und seinen Klienten finden Sie am Ende dieses Abschnitts. # General configuration ( Allgemeine Konfigurationsdaten ) Zeit für das erneute Senden einer QoS=1 oder QoS=2 Meldung in Sekunden. #retry_interval 20 Maximale Anzahl der einlaufenden QoS=1 oder QoS=2 Meldungen pro Klient, Default = 20, 0 = kein Maximum, 1 = garantierte Reihenfolge. #max_inflight_messages 20 Maximale Anzahl der Nachrichten vom Typ QoS=1 und Typ Qos=2, Default = 100, 0 = kein Maximum. #max_queued_messages 100 Maximale Payload-Länge, 0 = kein Maximum, aber limitiert auf 268.435.455 Bytes. #message_size_limit 0
● 70
MQTT DE 170504.indd 70
18-05-17 09:01
Das MQTT-Praxisbuch
Kapitel 5 • Sicherheit zuerst! Warum Sicherheit im IoT? Bevor man tiefer in dieses Thema einsteigt, sollte man zuerst den ambivalenten Terminus Sicherheit etwas näher betrachten, denn das deutsche Wort steht für die englischen Begriffe Safety und Security. Safety bedeutet Verfügbarkeit, Integrität und Vertrauenswürdigkeit, während Security sich auf die Bereiche Authentisierung und Autorisierung bezieht. Dieses Kapitel behandelt die Sicherheit im Sinne von Security, im nächsten werde ich Ihnen die Safety-Aspekte vorstellen. Was steckt also hinter Authentisierung und Autorisierung? Die Authentisierung überprüft den Zugang eines Benutzers zum System, also jeder Login mit Name/Passwort, Chip oder Handy ist eine Authentisierung. Wenn man nicht die richtigen Zugangsdaten hat, bleibt man ausgesperrt. Die Autorisierung startet in der zweiten Phase, also nach erfolgreicher Einschaltung, mit der Prüfung der Berechtigungen dieses Teilnehmers. Dabei wird z.B. festgelegt auf welche Daten der Teilnehmer zugreifen und ob er diese nur lesen oder sogar verändern kann. Teilnehmer steht hier für eine Person oder eine elektronische Steuerung. Aber wieso ist Sicherheit ein Thema beim Internet der Dinge? In diesem Bereich kommt es doch im Wesentlichen auf die korrekte Funktion der Anwendungen an. Das dachten sich auch die Entwickler des Jeep-Cherokee, die in ihrem Fahrzeug viele Dinge elektronisch gekoppelt hatten, um einen möglichst hohen Komfort für die Fahrer zu realisieren. Und dann kam der Schock, als Hacker am Straßenrand plötzlich die Scheibenwischer einschalteten, um anschließend die Kontrolle über Gaspedal und Bremse zu übernehmen. Die Eindringlinge hatten zuerst das Unterhaltungssystem geknackt und waren dann in andere Subsysteme vorgedrungen. Ein ähnlicher Fall ereignete sich in einer Kaufhauskette, der Millionen von Kreditkartendaten entwendet wurden. Hier waren die Hacker über die nur mäßig gesicherte, jedoch im Unternehmensnetz befindliche Klimaanlage eingedrungen. Wie lautete noch mal der Spruch mit den Gliedern in der Kette? Auch unsere Einbrecher haben aufgerüstet und sind vielfach in der Lage, die Hausautomation zu übernehmen und die Alarmanlage auszuschalten. Es macht den Dunkelmännern, die in Hausnähe herumlungern, wenig Arbeit, die Funkfernsteuerung zum Öffnen der Haustüre aufzeichnen, um sie später bei ihrem „Besuch“ abzuspielen. Hier haben viele Anbieter von Alarmanlagen versäumt, entsprechende Sicherheitsmaßnahmen, z.B. ständig wechselnde Steuerkommandos, einzurichten. Sicherheit im IoT ist also ein hochbrisantes Thema und wird durch die steil ansteigende Verbreitung der intelligenten Dinge immer wichtiger. Für die Entwickler stellt die Sicherheit eine Herausforderung dar, weil ihr Ressourcenbedarf hoch ist und der Benutzerkomfort ggf. reduziert wird. Außerdem werden Pflege und Wartung der verteilten IoT-Knoten durch eingebaute Sicherheitsmaßnahmen möglicherweise erschwert. Erfreulicherweise trägt die Chip-Industrie diesen erhöhten Anforderungen Rechnung, indem sie z.B. 32-Bit-MCUs mit hoher Verarbeitungsleistung und eingebauter Crypto-Hardware zur Verfügung stellt.
● 88
MQTT DE 170504.indd 88
18-05-17 09:01
Kapitel 5 • Sicherheit zuerst!
Wichtig ist natürlich auch, dass bereits zu Beginn einer Entwicklung das erforderliche Sicherheitsniveau festgelegt und mit entsprechenden Maßnahmen umgesetzt wird.
MQTT-Sicherheitsarchitektur Wenn MQTT das Rückgrat einer IoT-Anwendung darstellt, sind die im Zusammenhang mit dieser Technologie anwendbaren Sicherheitsmechanismen von hoher Bedeutung. MQTT setzt bei diesem Thema auf einige wenige eigene Optionen, schließt aber auch verfügbare Standardlösungen wie SSL/TLS und andere ein. Es kommt also nicht darauf an, für jeden Aspekt eigene Lösungen anzubieten - die Kombination eigener und standardisierter Schutzmechanismen gewährleistet ein hohes Sicherheitsniveau. In jeder Netzschicht können bereits Security-Elemente realisiert werden. Hierzu folgt zunächst ein kurzer Überblick, bevor in diesem Kapitel weitere Details erläutert werden. Netzwerk-Ebene Wenn die IoT-Knoten über ein WLAN angebunden sind, ist die Kommunikation aufgrund starker Verschlüsselung bis zum Router bereits ausreichend gegen Lauschangriffe geschützt. Virtuelle Private Netze (VPN) bieten darüber hinaus einen sicheren Tunnel vom Knoten bis zum Broker. Transport-Ebene Ein starkes Verfahren für die Transport-Ebene sind TLS (Transport Layer Security) and SSL (Secure Sockets Layer), wobei TLS der Nachfolger von SSL ist. Basis von TLS 1.0 ist seit 1999 SSL 3.1, im Einsatz ist jetzt TLS 1.2, und seit Januar 2016 existiert der Entwurf für TLS 1.3. Die Software residiert oberhalb von TCP und unterstützt eine Public-Key Infrastruktur. Alternativ kann das PSK (Pre-Shared-Key)-Verfahren eingesetzt werden, das mit symmetrischen Schlüsseln die Kommunikation im Netz codiert/decodiert. Applikations-Ebene Wenn man obige Hilfsmittel einsetzt, kann man davon ausgehen, dass Nachrichten sicher und authentisch im Netz transportiert werden. MQTT bietet aber auch einige eigene Sicherheitsmethoden an: Eine Authentisierung kann mittels Benutzername und Passwort erfolgen. Diese beiden Token lassen sich für jeden Benutzer oder auch für Benutzergruppen definieren und müssen beim Login der Knoten übermittelt werden. Zusätzlich können die Klienten-Informationen mit einem sicherheitsrelevanten Präfix versehen werden, z.B. secu-Klient1, secu-Klient2 usw. Autorisierung und Verschlüsselung werden ebenfalls auf dieser Ebene realisiert. Nach dieser Vorrede möchte ich nun in die Details einsteigen.
Authentisierung mit Username und Passwort Ohne diese Sicherheitsvorkehrung können alle Teilnehmer mittels Broker Nachrichten publizieren und subskribieren, denn als Default ist „allow anonymous true“ eingestellt. Für die Authentisierung seitens des Mosquitto-Brokers ist eine Passwort-Datei zu erstellen und die o.g. Parametrierung in der Konfigurationsdatei auf „allow anonymous false“ einzustellen. Im folgenden Beispiel zeige ich die Einrichtung und Anwendung der Authentisierung mit
● 89
MQTT DE 170504.indd 89
18-05-17 09:01
Kapitel 6 • Steigerung von Leistung und Verfügbarkeit
Kapitel 6 • Steigerung von Leistung und Verfügbarkeit Ein zentraler MQTT-Broker als Mittelpunkt einer IoT-Anwendung bietet die Vorteile einer fokussierten Administration und den vereinfachten Betrieb . Nur an einer Stelle sind Software-Updates einzupflegen, Log-Dateien auszuwerten und den „Rund-um-die-Uhr-Betrieb“ des Servers zu überwachen . Aber was tun, wenn es eng wird und immer mehr Klienten zu bedienen sind? Irgendwann wird die Hardware in Spitzenzeiten überlastet und es kommt zu nicht akzeptablen Verzögerungen oder gar zum Systemausfall . Und ein Ausfall des Brokers ist der Super-Gau einer IoT-Applikation, denn dann steht alles still . In diesem Kapitel wird aufgezeigt, wie Leistung und Verfügbarkeit im MQTT-Umfeld sowohl auf der Broker-Ebene als auch bei den Klienten gesteigert werden können .
Brücken zum Nachbarn Ein Weg, die Verarbeitungsleistung und die Verfügbarkeit zu steigern, ist die Kopplung von zwei oder mehr Brokern mittels Brücken . Dabei handelt es sich um die Verbindung von Brokern über das Netz, über die Publikationen und Subskriptionen ausgetauscht werden . Das Ziel dabei besteht darin, dass allen Klienten Zugriff auf alle Publikationen ermöglicht wird . Konkret kann ein Klient am Broker A etwas publizieren, das ein Klient an Broker B subskribieren kann . Dies funktioniert dann auch in umgekehrter Richtung .
Abb.6-1: Zwei Broker in Brückenschaltung In der vorangehenden Abbildung ist das Prinzip-Schaltbild einer Brückenschaltung dargestellt . Der Broker A, der Quell-Broker, ist über das Netz mit Broker B, dem Zielbroker,
● 107
MQTT DE 170504.indd 107
18-05-17 09:01
Das MQTT-Praxisbuch
verbunden. Die Bezeichnung Quell-Broker signalisiert, dass von diesem der Brückenschlag zum Ziel-Broker ausgeht. Nur der Quell-Broker erhält entsprechende Erweiterungen in seiner Konfigurations-Datei, während am Ziel-Broker nichts verändert werden muss. Im Prinzip verhält sich der Quell-Broker zum Ziel-Broker wie ein zusätzlicher Klient, der alle oder selektierte Topics publiziert bzw. subskribiert. Publiziert z.B. ein Klient A ein Topic, verteilt es der Broker A an alle Subscriber A dieses Topics. Zusätzlich gibt er diese Publikation an Broker B über die Brücke weiter und Broker B verteilt sie dann an alle Subscriber B, die dieses Topic ebenfalls abonniert haben. Die Klienten beider Server wachsen also zu einer großen Gemeinschaft zusammen. Wenngleich der Brückenschlag vom Quell-Broker aus erfolgt, ist die Brücke bidirektional, d.h., es werden Informationen in beide Richtungen ausgetauscht. Die Kopplung zweier Broker mittels Brücke ist in folgenden Fällen vorteilhaft: Entlastung der Broker-Hardware durch die Aufteilung der gesamten Belastung auf zwei oder mehr Broker. Erhöhung der Anzahl zu bedienender Klienten. Sinnvolle Aufteilung der Aufgaben, so könnte Broker A die Klienten mit Sensoren und Aktoren bedienen, während Broker B die Informationsverteilung an Mobil-Telefone, Tablets oder andere IT-Systeme übernimmt. Begrenzte Erhöhung der Verfügbarkeit, fällt ein Broker aus, bleiben die angekoppelten Broker aktiv. Bei entsprechend geschickter Aufteilung der Klienten kann die Applikation ggf. im Notbetrieb weiterlaufen. Konfiguration des Quell-Brokers Eine Brücke zu einem Ziel-Broker lässt sich bei Mosquitto relativ einfach in der Konfigurations-Datei einstellen. Für eine einfache Brücke reichen wenige Eintragungen: connection [ bridgename ] Hiermit wird die Brücke mit einem Namen versehen, unter dem der Quell-Broker beim Ziel-Broker publiziert und subskribiert. address [ IP-address ] Die IP-Adresse des Ziel-Brokers – dabei kann es sich auch um die URL-Adresse handeln. start_type [ automatic | lazy | once ] Diese Anweisung legt das Startverhalten der Brücke fest. Bei automatic, dem Default, startet die Brücke gemeinsam mit dem Quell-Broker und wird nach einer Unterbrechung nach 30 Sekunden wiederbelebt. Bei lazy erfolgt ein Brückenstart erst bei einer definierbaren Anzahl von Anfragen - nach Ablauf einer Time-out-Periode erfolgt eine Terminierung der Verbindung. Dies ist eine gute Option für eine bedarfsgerechte Brückennutzung. Wenn once ausgewählt wird, erfolgt zwar ein automatischer Start gemeinsam mit dem Broker, aber es wird nach einer Unterbrechung kein Neustart durchgeführt.
● 108
MQTT DE 170504.indd 108
18-05-17 09:01
Das MQTT-Praxisbuch
Kapitel 7 • Hacks Nach den eher theorielastigen Kapiteln 4 bis 6 soll im nachfolgenden Buchteil der Fokus stärker auf der Praxis liegen. Diese Praxis wird in sogenannten Hacks vermittelt, das sind kleine Kapitel, die ein bestimmtes MQTT-relevantes Thema behandeln. Diese sind zwar unabhängig voneinander, kommen aber teilweise im Verlauf des Buches noch zum Einsatz. Hack#1: MQTT auf ESP8266 Hier wird ein auf der NodeMCU basiertes Aktor-Board vorgestellt und mit einem MQTT-Klienten ausgestattet. Als Programmiersprache kommt C zum Einsatz und die Implementation erfolgt in einer Eclipse-IDE. Das Aktor-Board hat vier leistungsstarke PWM-Ausgänge, über die auch Lampen und Motoren geschaltet werden können. Das Board lauscht mittels Subskription auf vier Kanälen auf eingehende Kommandos und stellt an den Ausgängen die gewünschten PWM-Signale zur Verfügung. Hack#2: MQTT mit Arduino-IDE In der Arduino-Gemeinde sind die Arduino-IDE und die Programmiersprache C++ sehr beliebt. In diesem Hack wird ein ebenfalls auf der NodeMCU basiertes Board mit Sensoren für Temperatur, Feuchtigkeit und Licht vorgestellt. Dieses publiziert seine Messwerte über MQTT und stellt sie hiermit interessierten Abnehmern zur Verfügung. Die Firmware wurde mit der Arduino-IDE in C++ entwickelt. Hack#3: MQTT-Benchmarks In diesem Hack wird der Frage nachgegangen, wie viele MQTT-Nachrichten Broker und Klienten pro Sekunde verarbeiten können. Die Tests auf unterschiedlichen Plattformen zeigten teilweise überraschende Ergebnisse. Zusätzlich ist ein MQTT-Benchmark der Profis dokumentiert. Hack#4: MQTT-Klienten auf dem Raspberry Pi Erfreulicherweise stehen mittlerweile viele MQTT-Klienten für die unterschiedlichen Plattformen und Programmiersysteme zur Verfügung. In diesem Hack werden einige davon auf dem Raspbery Pi implementiert und demonstriert. Dabei werden drei Entwicklungssysteme eingesetzt. Hack#5: Flow-Programmierung mit Node-RED Fast ohne Schreiben von aufwändigen Programmen kann man mittels Flow-Programmierung auch komplexere Applikationen erstellen. Dabei werden auf einer grafischen Arbeitsoberfläche Funktionsblöcke mit spezialisierten Eigenschaften platziert, verschaltet und parametriert. Zur Anbindung an MQTT-System stehen entsprechende Pub- und Sub-Konnektoren zur Verfügung. Da die Node-RED-Blöcke vielfach sehr leistungsstark sind, lassen sich mit wenigen Klicks bereits anspruchsvolle Anwendungen gestalten. Hack#6: Boss aller Automaten: openHAB Wenn man mehrere Automationssysteme von verschiedenen Herstellern im Hause hat oder deren Einsatz plant, kann sich eine übergreifende Kommunikation und Steuerung als schwierig erweisen. In diesem Fall kann openHAB als Boss aller Automaten helfen und als
● 124
MQTT DE 170504.indd 124
18-05-17 09:01
Kapitel 7 • Hacks
integrierende und übergeordnete Instanz zum Einsatz kommen. Auch hierbei stehen für die Adaption von MQTT sogenannte Bindings zur Verfügung.
● 125
MQTT DE 170504.indd 125
18-05-17 09:01
Das MQTT-Praxisbuch
Kapitel 8 • Projekt Gewächshaus Bevor man ein größeres Projekt startet, kann es sinnvoll sein, die gegebene Aufgabenstellung an einem Modell zu testen und ggf. zu trainieren. Dieses wird im vorliegenden Kapitel am Beispiel eines Gewächshauses dokumentiert. Stellen Sie sich vor, Sie müssten in einer Gärtnerei in mehreren Gewächshäusern Beleuchtung und Temperatur regeln und einige andere Parameter wie Luft- und Erdfeuchtigkeit überwachen. Bei einer solchen Aufgabenstellung ist es nicht mit einem Arduino oder Raspberry Pi getan. Hier müssten zahlreiche Aktoren und Sensoren weitläufig installiert und miteinander vernetzt werden. Es handelt sich also um ein typisches IoT-Projekt, bei dem einige in Kapitel 7 vorgestellte Hacks eingesetzt werden können. Als Testplattform habe ich ein handliches Modell gebaut, in dem eine lebende Pflanze untergebracht und ihre Umweltbedingungen geregelt und überwacht werden können. Natürlich hätte man bei diesem Modell die Aufgabenstellung mit einer MCU und einigen daran angeschlossenen Sensoren bewerkstelligen können. Das wäre in einem realen, größeren Umfeld nicht ohne Weiteres möglich, deshalb ist dieses Modell sehr gut für Test- und Trainingszwecke zur Vorbereitung eines größeren Projekts geeignet. Es bleibt zu hoffen, dass sich die eingesetzte Pflanze in diesem über MQTT gesteuerten Environment prächtig entwickelt.
Aufgabenstellung Für einer erfolgreiche Realisierung des Modells in der Praxis sind die nachfolgend aufgeführten Anforderungen umzusetzen: • Die Sensoren und Aktoren sind wegen der potentiellen Weitläufigkeit des Geländes mittels WLAN zu vernetzen. • Die Kommunikation zwischen Sensoren und Aktoren soll mittels MQTT erfolgen. • Als Broker wird Mosquitto auf einem energieeffizienten Raspberry Pi eingesetzt. • Für die Erfassung von Innen- und Außentemperatur, Luftfeuchtigkeit im Innenraum, Beleuchtungsintensität und Feuchtigkeit der Pflanzenerde stehen entsprechende Sensoren bereit. • Aktoren steuern die Heizung mittels Glühlampen, außerdem kommen weiße LEDs für die Innenbeleuchtung und ein Ventilator für die Belüftung zum Einsatz. • Die Lichtintensität wird mit einer PID-Reglung auf konstanten Werten gehalten. • Die Überwachung der Innentemperatur erfolgt mittels einer Zwei-Punkt-Reglung. • Bei Frostgefahr im Außenbereich soll eine Alarmmeldung per eMail erfolgen. • Wenn die Erdfeuchtigkeit bei der Pflanze sinkt, wird ebenfalls eine Alarmmeldung per Email gesendet. • Die globale System-Steuerung übernimmt ein Node-RED-Programm auf dem Raspberry Pi. Alles in allem keine triviale Aufgabenstellung, die es nachfolgend zu meistern gilt.
Konfiguration Gewächshaus Für die Lösung der Aufgabenstellung stehen die bereits in den vorherigen Kapiteln dokumentierten Komponenten zur Verfügung: ein Raspberry Pi als oberste Steuer- und Rege-
● 206
MQTT DE 170504.indd 206
18-05-17 09:01
Kapitel 8 • Projekt Gewächshaus
linstanz, das Sensor-Board mit Fühlern für Temperatur, Luftfeuchtigkeit und Licht sowie das Aktor-Board mit seinen belastbaren Ausgängen . Abb .8-1 zeigt einen Überblick der Gesamt-Konfiguration .
Abb.8-1: Konfiguration Gewächshaus Raspberry Pi Zum Einsatz kommt ein Modell 3 mit 4-Kern-Prozessor und 1 GB Hauptspeicher . Damit sollte es keinen Leistungsengpass geben . Auf einer 8 GB SD-Karte ist das aktuelle Betriebssystem Rasbian mit der attraktiven Pixel-Oberfläche gespeichert . Das System ist bereits mit einem WLAN-Chip ausgestattet und kann sich darüber einfach in das WLAN einklinken . Erfreulicherweise ist Node-RED bereits unter Rasbian vorinstalliert, so dass lediglich der Mosquitto-Broker, wie in Kapitel 3 beschrieben, installiert werden muss . Zur Inbetriebnahme und für Debug-Zwecke ist es komfortabler, eine USB-Maus und –Tastatur sowie ein HDMI-Terminal anzuschließen, beim späteren Betrieb sind diese Komponenten nicht mehr erforderlich, da man sich von einem externen PC mittels des Kommandos „SSH“ beim Raspberry Pi einloggen und noch anstehende Aufgaben erledigen kann .
● 207
MQTT DE 170504.indd 207
18-05-17 09:01
Das MQTT-Praxisbuch
Kapitel 9 • MQTT-Tools Die Freude an der Arbeit und die Qualität der Ergebnisse lassen sich auch mit gutem Werkzeug steigern. Zwar ist die Erstausstattung bei den MQTT-Brokern, z.B. mit den Basis-Utilities wie mosquitto_pub und mosquitto_sub bereits recht hilfreich, häufig jedoch benötigt man zusätzliche Funktionen oder möchte mehr Komfort. In diesem Kapitel werden einige empfehlenswerte Werkzeuge für die Arbeit im MQTT-Umfeld vorgestellt.
MQTT.fx Wer einen guten MQTT-Klienten einsetzen möchte, ist mit MQTT.fx sehr gut bedient. Er beherrscht alle notwendigen Grundfunktionen, kann publizieren, subskribieren, Skripte ausführen und den Broker-Status sowie Log-Informationen ausgeben. Das Tool wurde von Jens Deters in Java programmiert und steht für die Betriebssysteme Windows, Linux und Mac OSX zur Verfügung. Es wird gepflegt und kontinuierlich weiterentwickelt. Die derzeit aktuelle Version 1.3.1 stammt aus dem Januar 2017. Im Einzelnen beherrscht MQTT.fx folgende Funktionen: • Definition von unterschiedlichen Einschaltprofilen für Broker-Verbindungen • Ad-Hoc-Verbindungen • Publikationen und Subskriptionen • Authentisierung mit Benutzername und Passwort • Unterstützung von SSL/TLS • Auswertung von $SYS-Topics zur Ermittlung der Broker-Daten (für HiveMQ und Mosquitto) • Vordefinierte Meldungen können über das Clipboard eingespeist werden • Proxy-Support • Historie über die letzten benutzten Topics • Skript-Fähigkeit mit Nashorn-Engine • Logging-Konsole • Installationsprogramm für alle Plattformen • Überprüfung auf Updates Das Tool ist kostenfrei im Rahmen der Lizenzbedingungen für Apache 2.0 nutzbar.
● 238
MQTT DE 170504.indd 238
18-05-17 09:01
Kapitel 9 • MQTT-Tools
Abb.9-1: Einschaltprofil definierbar mit MQTT.fx Für die Verbindung zu einem Broker können ein oder mehrere Einschaltprofile eingerichtet werden, z.B. mit und ohne Authentisierung oder letztem Willen. Fünf Tabs, von General bis zum Last Will and Testament, ermöglichen die Definition zahlreicher Parameter. Die vorangehend gezeigte Eingabemaske wird über das Menü oder das Zahnrad-Icon ausgewählt.
Abb.9-2: Publikation mit dem Klient MQTT.fx Eine Publikation ist mit MQTT.fx schnell bewerkstelligt: Über „Connect“ wird die Verbindung zum Broker hergestellt, dann werden der „Publish“-Tab ausgewählt, Topic und Meldung eingeben sowie ggf. noch die Qualität festgelegt und fertig.
● 239
MQTT DE 170504.indd 239
18-05-17 09:01
Kapitel 10 • Referenzprojekte und alternative Protokolle
Kapitel 10 • Referenzprojekte und alternative Protokolle In diesem Buch sind einige eher kleinere Beispiele mit MQTT-Anwendung dokumentiert, aber es geht natürlich auch einige Nummern größer. Die Entstehungsgeschichte von MQTT offenbart, dass dieses Protokoll nicht am grünen Tisch oder im Elfenbeinturm entwickelt, sondern unmittelbar auf die Praxis für ein Projekt zur Überwachung von Öl-Pipelines zugeschnitten wurde. Seine Eigenschaften - geringer Ressourcenbedarf, Sicherung der Übertragungsqualität, binäre Payload, 1:n-, n:1- und n:n-Kommunikation etc. - machen MQTT auch für andere gewichtige Anwendungen interessant. Über einige wird nachfolgend berichtet. Aber MQTT hat keinesfalls eine Monopolstellung. Es gibt leistungsfähige Alternativen, die im zweiten Abschnitt dieses Kapitels kurz vorgestellt werden. Damit ergibt sich für den Anwender die komfortable Situation, dass er für den jeweiligen Einsatzzweck die optimale Lösung auswählen kann.
MQTT-Referenzen Facebook Messenger Was könnte für ein Unternehmen wie Facebook besser geeignet sein als MQTT: Es bietet ein binäres Übertragungsprotokoll für die Versendung von Text-, Bild- und Sprachnachrichten, Unterstützung vielfältiger Kommunikationsbeziehungen, einen geringen Energiebedarf auf mobilen Geräten, eingebaute Sicherheit und einiges mehr. Aus diesem Grund hat Facebook bei der Überarbeitung seines Messengers für mobile Geräte auf iOS-, Android- und Blackberry-Plattformen MQTT für die Nachrichtenübermittlung gewählt. Nach Aussagen aus der Facebook-Software-Entwicklung reduzierte sich damit die Transferzeit bei Phone-zu-Phone gegenüber der Vorgängerversion von einigen Sekunden auf mehrere hundert Millisekunden. Bei einer Benutzeranzahl von über einer Milliarde ist das eine beachtliche Leistung. Weitere Hinweise: http://mqtt.org/2011/08/mqtt-used-by-facebook-messenger https://www.facebook.com/notes/facebook-engineering/building-facebookmessenger/10150259350998920
Integrated Electronic Control Centre (IECC) Zur Steuerung und Überwachung ihrer Signalanlagen hat die Britische Eisenbahn das Integrated Electronic Control Centre entwickelt. Dieses wurde 2006 von der Firma DeltaRail (nun umbenannt in Resonate Group Ltd) auf eine moderne Hard- und Software-Architektur migriert. Zentrale Schaltstelle in diesem weitverzweigten Netz mit vielen Sensoren und Aktoren ist ein MQTT-Broker. Die klassische Architektur ist in Abb.10-1 abgebildet und zeigt im Zentrum den Message-Server, an dem, wie nachfolgend dargestellt, die Signalkomponenten angekoppelt sind. Links in der Abbildung befindet sich die Systemüberwachung, bei der z.B. die Testamente gestörter Knoten auflaufen und von Technikern bearbeitet werden. Rechts
● 255
MQTT DE 170504.indd 255
18-05-17 09:01
Das MQTT-Praxisbuch
sind die Applikationen für Routen und Fahrpläne positioniert und oben schließlich die Bedienungsschnittstelle. Es handelt sich um ein System, das auch in rauer Umgebung eine hohe Zuverlässigkeit sicherstellen muss.
Abb.10-1: Architektur Integrated Elektronic Control Centre Weitere Informationen: https://en.wikipedia.org/wiki/Integrated_Electronic_Control_Centre http://www.irse.org/knowledge/publicdocuments/3.09%20Wood%20-%20Message%20broker%20technology%20for%20flexible%20signalling%20control.pdf Name/Passwort: guest/guest
EVRYTHNG Eine mächtige, fast universelle Lösung für IoT-Anwendungen ist EVRYTHNG. Auch hier übernimmt ein MQTT-Broker die Vermittlung der Nachrichten zwischen den Dingen und den damit verbundenen Applikationen. Dieser ist im Real-Time Data Management verortet. Über das Product Connection Management, das auch Gateways für weniger intelligente Komponenten enthält, können beliebige Aktoren/Sensoren angeschlossen werden. Für die
● 256
MQTT DE 170504.indd 256
18-05-17 09:01
Index
Index Symbolen $SYS 84 A Aktor 44, 129 Amazon 257 Amazon Web Services IoT 257 AMQP 260 Apollo 163 Architektur 12 Arduino-IDE 145 Installation 145 Arduino-IDE 47 Authentisierung 72, 88 Autorisierung 88, 102 B Benchmark 158 Britische Eisenbahn 255 Broker Kopplung 108 Brücken 72 Brückenschaltung 107 C C 48 Client-ID 94 Cloud 114 Cluster 118 CoAP 260 D DHT22 152 DS18B20 152 195 Duke’s Choice Award 2013 E Eclipse 48, 130 120 Elastic Beam eMail 185 42, 126 ESP8266 MQTT 50 EVRYTHNG 256 Expressif 126
F Filterung 14 Floating IP 120 FRED 178 G Geany 167 Gewächshaus 206 H HAProxy 119 HiveMQ 118 HTTP 20 HTTPS 20 I IBM 20 Integrated Electronic Control Centre (IECC) 255 IoT Sicherheit 88 IoT Challenge 2013 195 IoT-Protokoll Anforderungen 11 IP-Adresse 120 iPhone 59 J JavaOne 195 Java-Runtime-Environment 25 JAX Innovation Award 2014 195 JoramMQ 163 L 19, 38 Letzter Wille Libmosquitto 169 Load-Balancer 118 Lua 47 LUBUNTU 46 LX6 127 M Message Queue Telemetry Transport (MQTT) 12
● 275
MQTT DE 170504.indd 275
18-05-17 09:01
Das MQTT-Praxisbuch
Mosquitto 27, 69 Passwort 90 Username 90 mosquitto_pub 30 MQTT Aktor 129 Benchmark 158 Binding 201 Facebook 255 Firewall 105 252 Mobile Klienten PubSub-Klient 146 Sicherheitsarchitektur 89 Werkzeuge 238 Wiki 253 21 MQTT Broker MQTT Client Bibliotheken 23 MQTT-Klienten Raspberry Pi 167 MQTT-Protokoll 72 MQTT-Pub-Klient 30 mqtt-spy 25, 242 MQTT-Sub-Klient 31 N Nipper, Arlen 20 NodeMCU 127 Node-RED 177 189 Dashboard Installation 182 183 Raspberry Pi O Open_Geospatial_Consortium 259 openHAB 194 Installation 197 Sidemaps 195 OpenSSL 29 OSI-Referenzmodell 72
Q Qualitätssicherung
16, 79
R RabbitMQ 163 Raspberry Pi 42, 161, 167 Mosquitto Broker 57 Regelkreis 220 Regelungstechnik 213 Resilienz 121 S Safety 88 SDKPerf 247 SFH300 152 Sicherheit 88 Sicherheitsarchitektur 89 SOAP 259 Stanford-Clark, Andy 20 STOMP 260 SubCli1 37 System-on-a-Chip (SOC) 126 T Tablet 59 Testament 38 TLS-Handshake 100 TSL/PSK-Verschlüsselung 95 W Websockets 83, 245 Wloop 52 Z Zugriffskontrolle 72
P Paho MQTT Utility 251 Payload 77 Protokollmessung 81 Python 172
● 276
MQTT DE 170504.indd 276
18-05-17 09:01
Walter Trojan
Elektor-Verlag GmbH 52072 Aachen www.elektor.de
Das MQTT-Praxisbuch führt Schritt für Schritt in die praktische Arbeit mit diesem ressourcensparenden Protokoll ein. Dabei widmet der Autor Walter Trojan dem Thema IoT-Sicherheit ein ausführliches Kapitel. Anhand von abgeschlossenen Projekten zum Nachbauen stellt der Autor in beeindruckender Weise die praktische Bedeutung des MQTT-Protokolls in modernen IoT-Anwendungen dar: • • • • • • •
MQTT auf ESP8266 MQTT mit Arduino-IDE MQTT-Benchmarks MQTT auf dem Raspberry Pi Flow-Programmierung mit Node-RED Boss aller Automaten: openHAB Projekt Gewächshaus mit automatisierter Beleuchtung, Bewässerung, Temperaturregelung sowie Luftund Erdfeuchtigkeitsmessung
DESIGN SHARE
ISBN 978-3-89576-324-3
DAS MQTT-PRAXISBUCH
●
Walter Trojan begann seine berufliche Laufbahn als Fernmelde-Techniker. Anschließend studierte er Nachrichtentechnik. Er war fast 40 Jahre bei einem IT-Hersteller tätig, arbeitete dort auf Großcomputern, im System-Management und in der IT-Sicherheit. Hauptsächlich programmiert er in C und Pascal, hat aber keine Berührungsängste mit Java, Javascript und Python.
MQTT ist ein leichtgewichtiges, ereignis- und nachrichtenorientiertes Protokoll zur effizienten und asynchronen Kommunikation zwischen Geräten auch über limitierte Netzwerke. Das bereits 1999 von IBM entwickelte Protokoll eignet sich heute in besonderer Weise für Internetof-Things-Anwendungen. Im Gegensatz zu HTTP mit Request/Response-Verfahren ist bei MQTT eine Publish/ Subscribe-Architektur umgesetzt. Es stehen mittlerweile zahlreiche MQTT-Broker und -Clients zur Verfügung. Aufgrund der Unterstützung durch die Eclipse Foundation, IBM und vieler anderer stehen zahlreiche Komponenten kostenlos im Internet zur Verfügung. Client-Bibliotheken gibt es für die unterschiedlichsten Plattformen und Programmiersprachen. Unterstützt werden u.a. die PC-Plattform mit Java und .Net sowie Arduino und Raspberry Pi.
DAS MQTT-PRAXISBUCH
DAS MQTT-PRAXISBUCH
MIT ESP8266 UND NODE-RED
WALTER TROJAN
MIT ESP8266 UND NODE-RED
Walter Trojan LEARN DESIGN SHARE
LEARN
LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHAR GN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHARE ● LEARN ● DESIGN ● SHA