mqtt deep dive workshop [german]
TRANSCRIPT
MQTT Deep Dive
MQTT In-Depth Workshop
#buildingIoT Workshop https://flic.kr/p/orFVYi Image by Charles Chang
2
EINFÜHRUNG - VORSTELLUNG
Dominik Obermaier
CTO @ dc-square
@dobermai
3
EINFÜHRUNG - AGENDA
Einführung in MQTT
Überblick über das MQTT Ökosystem
MQTT Clients & Broker
Hands-on MQTT Testen und “Spielen” mit MQTT
Zusammenfassung & Ausblick Ende
Entwicklung eines MQTT Simulators Mit Java und Paho
Web Application MQTT über Websockets
Q&ABeginn
4
EINFÜHRUNG - LERNZIELE
Was werden wir bei diesem Workshop
lernen?
Was ist MQTT?
Warum nicht immer HTTP?
MQTT Broker?
MQTT Clients?
Wie funktioniert MQTT im Detail?Umsetzung verschiedener MQTT Patterns
Wie funktioniert MQTT für Webseiten?
Was ist “MQTT over Websockets?”
Wie entwickle ich einen MQTT Client in Java?
5
EINFÜHRUNG - ANWENDUNGSFALL
Unser Anwendungsfall: Deathstar SimulalatorImplementierung eines MQTT Todesstern Simulators und eines Web-Dashboards
zur Anzeige von Daten und Steuerung des Simulators
6
EINFÜHRUNG - BENÖTIGTE SOFTWARE
Benötigte Software
HiveMQ MQTT Broker
MQTT Client
MQTT.fx mosquitto Tools
HiveMQ Web Client
IDE / Editor
IntellIj IDEA
7
Wer benötigt noch diese Software?
EINFÜHRUNG - BENÖTIGTE SOFTWARE
8
Useful Resources
MQTT - RESSOURCES
http://www.hivemq.com/mqtt-essentials/
http://www.hivemq.com/mqtt-security-fundamentals/
9
Useful Resources
MQTT - RESOURCES
https://dzone.com/refcardz/getting-started-with-mqtt
Einführung in MQTT
Überblick und wichtigste Features und Eigenschaften
11
Unzuverlässige Netzwerke
Skalierbarkeit
Bidirektionale Kommunikation
Constrained Devices
Security
Push Messaging
Herausforderungen im IoT
MQTT - HERAUSFORDERUNGEN
12
Bandbreiteneffizient
Skalierbar
Standardisiert
Offen
Datenagnostisch
Sowohl für schwache Hardware
als auch Server geeignet
Anforderungen an ein IoT Protokoll
MQTT - IOT PROTOKOLL ANFORDERUNGEN
13
Sehr verbreitet
Request / Response
Seit 1991 verbreitet
Dokumentenzentriert
HTTP?
MQTT - HTTP?
14
Viel Overhead
Polling statt Push
Kein Quality of Service
Stateless
Wie merken wir, dass ein Client offline ist?
Warum nicht immer HTTP?
MQTT - HTTP?
15
MQTT - Messaging für das Internet der Dinge
Einfach
Publish / Subscribe
Binär
Messaging Protokoll
Minimaler Overhead
Datenagnostisch
MQTT - MESSAGING FÜR DAS INTERNET DER DINGE
16
Push statt Pull
Zuverlässigkeit auch bei unzuverlässigen Netzwerken
Constrained Devices
Geringe Bandbreite und hohe Latenz
Enterprise -> Mobile
Anwendungsfälle
MQTT - ANWENDUNGSFÄLLE
17
3 QoS Stufen
Retained Messages
Topic Wildcards
Last Will and Testament
Persistent Sessions
Heartbeats
Features
MQTT - FEATURES
18
MQTT - Historische Entwicklung
1999 2010 2013 2014
Arlen Nipper (Arcom) & Andy Stanford-Clark (IBM)
entwickeln MQTT
MQTT wird offengelegt
OASIS TC MQTT 3.1.1 ist OASIS Standard
MQTT - GESCHICHTE
Was ist Publish / Subscribe Messaging?
20
Pub / Sub
MQTT - PUB / SUB
temperature sensor
MQTT-Broker
laptop
mobile device
publish: “21°C“publish: “21°C“
publish: “21°C“
subscribe
subscribe
21
MQTT IM OSI SCHICHTENMODELL
MQTT
TCP
IP
5-7
ISO/OSI
Layer
4
ISO/OSI
Layer
3
ISO/OSI
Layer
22
CONNECTING TO A BROKER
MQTT Client MQTT Broker
CONNACK
CONNECT
23
CONNECTING TO A BROKER
MQTT Client MQTT Broker
CONNACK
CONNECT
CONNACK
sessionPresentreturnCode
MQTT-Packet:
contains: Exampletrue
0
CONNECT
clientIdcleanSessionusernamepasswordlastWillTopiclastWillQoslastWillMessagekeepAlive
MQTT-Packet:
contains:
(optional)(optional)
(optional)(optional)
(optional)
Example“client-1“
true“hans“
“letmein““/hans/will“
2“unexpected exit“
60
24
PUBLISH
MQTT Client MQTT Broker
PUBLISH
MQTT Client
MQTT Client
MQTT Client
PUBLISH
PUBLISH
PUBLISH
25
PUBLISH
PUBLISH
packetIdtopicNameqosretainFlagpayloaddupFlag
MQTT-Packet:
contains: Example4314
“topic/1“1
false“temperature:32.5“
false
(always 0 for qos 0)
26
Hierarchisch
Wildcards (+ und #)
Queuing (QoS > 0)
Sehr Leichtgewichtig
Dynamisch
MQTT Topics
MQTT - MQTT TOPICS
27
MQTT
MQTT Topics
- MQTT TOPICS
myhome / groundfloor / livingroom / temperaturetopic level topic level
topic levelseparator
28
MQTT
MQTT Topics
- MQTT TOPICS
myhome / groundfloor / + / temperature
only one level
single-levelwildcard
29
MQTT
MQTT Topics
- MQTT TOPICS
myhome / groundfloor / #only at the end
multiple topic levels
multi-levelwildcard
Topic Matching Beispiele
31
deathstar
superlaser
greenhouse
status
usages
humidity
temp
/ /
MQTT - MQTT TOPICS
32
deathstar
superlaser
greenhouse
status
usages
humidity
temp
/ /
Deathstar superlaser status: deathstar/superlaser/status
MQTT - MQTT TOPICS
33
deathstar
superlaser
greenhouse
status
usages
humidity
temp
/ /
All Data from Greenhouse: deathstar/greenhouse/#
MQTT - MQTT TOPICS
34
deathstar
superlaser
greenhouse
status
usages
humidity
temp
/ /
All Data from deathstar: deathstar/#
MQTT - MQTT TOPICS
35
SUBSCRIBE
MQTT Client MQTT Broker
PUBLISH MQTT Client
PUBLISHSUBACK
SUBSCRIBE 1
2
4
3
36
SUBSCRIBE
SUBSCRIBE
packetIdqos1topic1qos2topic2...
MQTT-Packet:
contains: Example4312
1“topic/1“
0“topic/1“
...
}
}
(list of topic + qos)
MQTT Client MQTT Broker
PUBLISH MQTT Client
PUBLISHSUBACK
SUBSCRIBE 1
2
4
3
37
UNSUBSCRIBE
MQTT Client MQTT Broker
UNSUBACK
UNSUBSCRIBE
38
UNSUBSCRIBE
MQTT Client MQTT Broker
UNSUBACK
UNSUBSCRIBE
UNSUBACK
packetId
MQTT-Packet:
contains: Example4316
UNSUBSCRIBE
packetIdtopic1topic2...
MQTT-Packet:
contains: Example4315
“topic/1““topic/2“
...
} (list of topics)
39
Username / Password
Payload Verschlüsselung
TLS
Client Certificate Authentication
Permissions
MQTT Security
MQTT - MQTT SECURITY
40
1. Weitgehend abwärtskompatibel
2. Effizientere Header
3. Client-ID Längenrestriktion entfernt
4. Connect ohne Client-ID
5. Persistent Present Flag
6. Fehlercode bei Subscriptions
7. Direktes Publishen nach dem Verbinden
8. MQTT over Websockets spezifiziert
9. Alle Strings sind nun UTF-8
10.Protokollname nun offiziell “MQTT”
MQTT 3.1.1 Verbesserungen zu MQTT 3.1
MQTT - MQTT 3.1.1
Überblick über das MQTT Ökosystem
MQTT Clients und Broker
42
MQTT - MQTT CLIENT LIBRARY ENCYCLOPEDIA
http://www.hivemq.com/mqtt-client-library-encyclopedia/
MQTT Client BibliothekenÜberblick über die populärsten Alternativen
Java
45
Open Source
“Referenzimplementierung”
Aktive Community
Sync und Async API
Lauffähig auf JavaME
Eclipse Paho
CLIENTS - PAHO
46
Open Source
3 API Styles
Sehr performant
Basiert auf HawtIO
Verfügbar in Maven Central
Fusesource MQTT Client
CLIENTS - FUSESOURCE
Javascript
48
Open Source
“Referenzimplementierung”
Basierend auf Websockets
Sehr gut dokumentiert
keine Abhängigkeiten
Eclipse Paho
CLIENTS - PAHO
49
Open Source
Node.js Bibliothek
Verfügbar in npm
MQTT.js
CLIENTS - MQTT.JS
C
51
Open Source
“Referenzimplementierung”
Auch für C++ verfügbar
Verfügbar für POSIX / Windowsund Embedded
Eclipse Paho
CLIENTS - PAHO
Sonstige
53
Paho (Python, Go, Lua)
M2Mqtt (C#)
ruby-mqtt (Ruby)
Arduino Client
MQTTKit (Objective C)
Mosquitto-PHP (PHP)
Sonstige Clients
CLIENTS - SONSTIGES
MQTT Client AppsÜberblick über die gängigsten Tools
55
Kommandozeilentool
Sehr viele Features
Debug Modus
Einbettbar (libmosquitto)
Mosquitto_Pub / Mosquitto_Sub
CLIENTS - MOSQUITTO
56
Betriebssystemunabhängig
Benötigt aktivierte Websockets
Publish / Subscribe
Real-Time Updates
HiveMQ Web Client
CLIENTS - HIVEMQ WEB CLIENT
57
JavaFX
Mit nativen Wrapper für alle gängigen Betriebssysteme
Scripting Support
Broker Status ($SYS) Support
MQTT.fx
CLIENTS - MQTT.FX
58
MQTTLens (Browser)
MQTTSpy (JavaFX)
MyMQTT (Android)
MQTT Inspector (iOS)
viele andere
Sonstige Applikationen
CLIENTS - SONSTIGES
MQTT BrokerAlternativen für das “Herzstück” von MQTT
60
Open Source
Ideal für Constrained Devices
Unterstützt Bridging
In C implementiert
Mosquitto
BROKER - MOSQUITTO
61
High Performance MQTT Broker
Nativer Websockets Support
Open Source Plugin System
Clustering
Skaliert > 100.000 Connections
HiveMQ
BROKER - HIVEMQ
62
QoS 0 QoS 1 QoS 2 Bridge SSL Cluster WebsocketsPlugin
System
mosquitto ✔ ✔ ✔ ✔ ✔ X ✔ ✔Mosca ✔ ✔ X ? ? ? ✔ X
RabbitMQ ✔ ✔ X X ✔ ? ? ?HiveMQ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔
ActiveMQ ✔ ✔ ✔ X ? ? ✔ ?RSMB ✔ ✔ ✔ ✔ X X X ?
moquette ✔ ✔ X ? ? X X X
MQTT Broker Übersicht Source: https://github.com/mqtt/mqtt.github.io/wiki/Server%20support
BROKER - ÜBERSICHT
Hands-on MQTT
Testen und “Spielen” mit MQTT
Übung 1: Publish / Subscribe
Showtime! Ausprobieren mit einem Tool der Wahl
Übung 2: Retained Messages
67
“Last Known Good Value”
Die letzte Nachricht wirdvom Broker gespeichert
Client entscheidet ob eine Nachricht retained wird
Clients bekommen retained message nach Subscribe
Retained Messages
ÜBUNGEN - RETAINED MESSAGES
Showtime! Ausprobieren mit einem Tool der Wahl
Übung 3: Last Will and Testament
70
Client definiert LWT
Broker schickt diese Nachricht nach Client “Tod”.
Echter Push
Nützlich um on / offverlässlich zu implementieren
Last Will and Testament
ÜBUNGEN - LWT
Showtime! Ausprobieren mit einem Tool der Wahl
Übung 4: Persistent Session
73
Broker speichert Client Session
Client entscheidet ob er einepersistent Session haben möchte
Queuing für QoS > 0
Persistent Session
B
Connect
Subscribedevice/+/status
device/12/status: „1“
1st
BRe-Connect
device/12/status: „1“2nd
ÜBUNGEN - PERSISTENT SESSION
74
Keine erneuten Subscriptions nach Verbindungsabbruch
Keine Nachricht geht verloren
Persistent Session
Vorteile
75
Exactly once deliveryQoS 2
QoS 0 At most once delivery
QoS 1 At least once delivery
ÜBUNGEN - QOS
76
QOS 0 - AT MOST ONCE
MQTT Client MQTT Broker
PUBLISH QoS 0
77
QOS 0 - AT MOST ONCE
MQTT Client MQTT Broker
PUBLISH QoS 0
PUBLISH
packetIdtopicNameqosretainFlagpayloaddupFlag
MQTT-Packet:
contains: Example4314
“topic/1“1
false“temperature:32.5“
false
(always 0 for qos 0)
78
QOS 1 - AT LEAST ONCE
MQTT Client MQTT Broker
PUBACK
PUBLISH QoS 1
79
QOS 1 - AT LEAST ONCE
MQTT Client MQTT Broker
PUBACK
PUBLISH QoS 1
PUBACK
packetId
MQTT-Packet:
contains: Example4319
PUBLISH
packetIdtopicNameqosretainFlagpayloaddupFlag
MQTT-Packet:
contains: Example4314
“topic/1“1
false“temperature:32.5“
false
(always 0 for qos 0)
80
QOS 2 - EXACTLY ONCE
MQTT Client MQTT Broker
PUBREC
PUBLISH QoS 2
PUBCOMP
PUBREL
81
QOS 2 - EXACTLY ONCE
MQTT Client MQTT Broker
PUBREC
PUBLISH QoS 2
PUBCOMP
PUBREL
PUBCOMP
packetId
MQTT-Packet:
contains: Example4320
PUBREC
packetId
MQTT-Packet:
contains: Example4320
PUBREL
packetId
MQTT-Packet:
contains: Example4320
PUBLISH
packetIdtopicNameqosretainFlagpayloaddupFlag
MQTT-Packet:
contains: Example4314
“topic/1“1
false“temperature:32.5“
false
(always 0 for qos 0)
Showtime! Ausprobieren mit einem Tool der Wahl
83
Packet loss meist durch Bitfehler (durch schlechtes Netzwerk). Meist keine Congestion
“Error Bursts” bei schlechtem Signal oder längeren Signalstörungen
Sehr lange Verzögerungen. Variable RTT, Timeout Mechanismen funktionieren oft nicht
TCP geht bei einem Packet Loss von Congestion oder Packet Reordering aus.
Bei Funknetzen tritt meist Packet Loss durch Übertragungsfehler auf
TCP wurde ursprünglich für E2E Systeme und fixe Netzwerke entwickelt
Probleme in Funknetzwerken
MQTT - PROBLEME IN FUNKNETZWERKEN
84
MQTT - LÖSUNGEN IN FUNKNETZWERKEN
85
Exactly once deliveryQoS 2
QoS 0 At most once delivery
QoS 1 At least once delivery
B
Connect
Subscribedevice/+/status
device/12/status: „1“
1st
BRe-Connect
device/12/status: „1“2nd
MQTT - LÖSUNGEN IN FUNKNETZWERKEN
QoS LWT
86
Heartbeat Mechanismus
Löst das Problem von Half-Open TCP Connections
Grace Period möglich
Heartbeat / PING
MQTT - LÖSUNGEN IN FUNKNETZWERKEN
87
PINGREQMQTT-Packet:
no payload
PINGRESPMQTT-Packet:
no payload
MQTT - LÖSUNGEN IN FUNKNETZWERKEN
Heartbeat / PING
88
Client verliert die Verbindung, die Connection ist “half-open”
=> Broker denkt der Client ist noch verbunden
Client mit gleicher ClientId verbindet sich erneut
=> Alter Client mit gleicher ClientId wird getrennt
Client Take-Over
MQTT - LÖSUNGEN IN FUNKNETZWERKEN
Entwicklung eines MQTT Todesstern
SimulatorsMQTT mit Java und
Eclipse Paho
90
Deathstar Simulator Implementiert in Java
Dashboard Web Application
MQTT Broker HiveMQ
DEATHSTAR SIMULATOR
Todesstern?!?!?
92
DEATHSTAR - ANATOMY
93
Features
• Alarmierung wenn Eindringlingedem Reaktor zu nahe kommen
• Abfeuern des Superlasers • Fernsteuerung der Meldefrequenz • Temperaturanzeige des Imperialen
Gewächshauses • Melden des Status (Online / Offline)
DEATHSTAR - FEATURES
94
MqttClient client = new MqttClient( "tcp://localhost:1883", //URI "publisher", //Client ID new MemoryPersistence()); //Persistence
client.connect();
client.publish("the/topic", //topic "message".getBytes(), //message 1, //QoS false); //retained
client.disconnect();
DEATHSTAR - PAHO
95
MqttClient client = new MqttClient( "tcp://localhost:1883", //URI "publisher", //Client ID new MemoryPersistence()); //Persistence
MqttConnectOptions connOptions = new MqttConnectOptions();
connOptions.setKeepAliveInterval(120); connOptions.setWill("help/I/died",
new byte[0], 2, true); connOptions.setCleanSession(false); connOptions.setUserName("username"); connOptions.setPassword("passw".toCharArray());
client.connect(connOptions);
DEATHSTAR - PAHO
96
final MqttClient client = new MqttClient(...);
client.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable cause) {}
@Override public void messageArrived(String topic,
MqttMessage message)throws Exception { System.out.println(new String(message.getPayload())); }
@Override public void deliveryComplete(IMqttDeliveryToken token) {} }); client.connect();
client.subscribe("#");
DEATHSTAR - PAHO
Übung 1: Deathstar Reactor Alert
98
code/uebung1
Projekt öffnen
DEATHSTAR
Implementierung
Übung 2: Superlaser
MQTT Workshop
102
code/uebung2
Projekt öffnen
DEATHSTAR
103
Subscriben auf deathstar/superlaser/status
Laser abfeuern
Status wieder auf deaktiviert setzen
Was ist zu tun?
DEATHSTAR - SUPERLASER
Implementierung
Übung 3: Update Frequenz ändern
106
code/uebung3
Projekt öffnen
DEATHSTAR
Implementierung
Übung 4: Imperial Bath Greenhouse
109
code/uebung4
Projekt öffnen
DEATHSTAR
Implementierung
Übung 5: Statusanzeige
112
code/uebung5
Projekt öffnen
DEATHSTAR
Implementierung
MQTT Todesstern Kontroll App
MQTT over Websockets
115
Features
• Alarmierung wenn Eindringlingedem Reaktor zu nahe kommen
• Abfeuern des Superlasers • Fernsteuerung der Meldefrequenz • Temperaturanzeige des Imperialen
Gewächshauses • Anzeigen des Status (Online / Offline)
DASHBOARD - FEATURES
116
MQTT Over Websockets
DASHBOARD - WEBSOCKETS
MQTT-Broker Laptop
WebsocketFrame
MQTTMessage
Demonstration
Übung 6: Deathstar Reactor Alert
119
code/uebung6
Projekt öffnen
DEATHSTAR
Implementierung
Übung 7: Superlaser
122
code/uebung7
Projekt öffnen
DEATHSTAR
Implementierung
Übung 8: Imperial Greenhouse
125
code/uebung8
Projekt öffnen
DEATHSTAR
Implementierung
Übung 9: Update Frequenz ändern
128
code/uebung9
Projekt öffnen
DEATHSTAR
Implementierung
Übung 10: Statusanzeige
131
code/uebung10
Projekt öffnen
DEATHSTAR
Implementierung
Q & A
Danke!@dobermai
135
Credits (all Images under Creative Commons)
‣ “The Stormtrooper” by leg0fenris: https://flic.kr/p/9beh6M ‣ “Stormtroopers Training: Theory” by Pedro Vezini: https://flic.kr/p/9iCMCB ‣ “Impending Doom (Explored)” by Pascal: https://flic.kr/p/8sjHyA ‣ “Is this Jabba the Hut's son?” by Kristina Alexanderson: https://flic.kr/p/9WDcSx ‣ “#135/366” by Robert McGoldrick: https://flic.kr/p/bXKkBG ‣ “Old droids” by stavos: https://flic.kr/p/jfYxPA ‣ “#23/366 The Plan” by Robert McGoldrick: https://flic.kr/p/bhgZbx ‣ “Day 112” by Pascal: https://flic.kr/p/7jbBvN ‣ “New Navcom” by Jason Ternus: https://flic.kr/p/5zkmHe ‣ “Got the Superman Cape... Let's do this!” by Brian Neudorff: https://flic.kr/p/jmowHw ‣ “"..And The Nominees Are…”" by Predro Vezini: https://flic.kr/p/8wFkyN
136
Credits II (all Images under Creative Commons)
‣ “Hardcore Stormies Hit The Gym” by W_Minshull: https://flic.kr/p/9pbzs7 ‣ “#145/366” by Robert McGoldrick: https://flic.kr/p/c4zqAJ ‣ “Rocking Hard” by W_Minshull: https://flic.kr/p/dB13LP ‣ “Weightlifting” by 713 Avenue: https://flic.kr/p/5cdK3z ‣ “Kaos - Chaos paiting (ii)” by Kristina Alexanderson: https://flic.kr/p/ajcZoo ‣ “Pole Vault” by 713 Avenue: https://flic.kr/p/5eAzQi ‣ “T as in teaching Tech” by Kristina Alexanderson: https://flic.kr/p/cyAA8d ‣ “Escaping the Death Star” by Paulo Valdivieso: https://flic.kr/p/eHQ9kr ‣ “Death Star Prototype”: http://starwars.wikia.com/wiki/File:DSprototype_egvv.jpg ‣ “Luke Skywalker flying his X-Wing, getting ready to blow up the Death Star” by Fredrik Perman: https://flic.kr/p/c3qivy
137
Credits III (all Images under Creative Commons)
‣ “move to the new deathstar” by Nerd herdr: https://flic.kr/p/oqxYue ‣ “I think it is time we demonstrated the full power of this station” by Fanboy30: https://flic.kr/p/5YYbLK ‣ “Stromtrooper's clone robots” by Jay: https://flic.kr/p/b3mvcX ‣ “Hot Tub” by W_Minshull: https://flic.kr/p/9nMWxp ‣ “Searching for Droids” by Guy Streatfeild: https://flic.kr/p/bAvbWW ‣ “Stormpainter” by Pedro Vezini”: https://flic.kr/p/9SrKQU ‣ “Let The Wookie Hug” by Pedro Vezini: https://flic.kr/p/8ukTZe ‣ “Daisy Squad” by Stéfan: https://flic.kr/p/bD6ANy ‣ “Enjoying the sunset” by Kristina Alexanderson: https://flic.kr/p/avNV2Q