MQTT Deep Dive Workshop [GERMAN]

Preview:

Citation preview

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

dominik.obermaier@dc-square.de

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

Recommended