# MQTT-Broker einrichten

| Dieses Buch steht im Regal EDV sowie im Regal Anleitungen. | Zielgruppe: Freizeit, Beruf | Lehrbuch |

## Zusammenfassung des Projekts

„MQTT-Broker einrichten“ ist nach Einschätzung seiner Autoren zu 0 % fertig
* Zielgruppe: Menschen, die MQTT als Transportsystem benutzen
* Projektumfang: Die Konfiguration und Abhärten eines MQTT-Brokers für unterschiedliche Anwendungen wird beschrieben.

## Titelseite
### Autoren

Autoren sind aus der Versionsgeschichte dieses Buches und aller Unterkapitel ersichtlich.
Initiiert wurde dieses Projekt am 01.01.2021 von ademant, welcher MQTT-Broker sowohl beruflich als auch privat nutzt.

### Haftung / Gewähr

Diese Anleitung soll einen sicheren Zustand beschreiben, so dass alle Nutzer hinter dem Router einigermaßen sicher arbeiten können. Die einzelnen Punkte spiegeln aber nur den Sicherheitszustand zu einem bestimmten Zeitpunkt dar. Die Anleitung ist für Privatanwender gedacht. Im geschäftlichen Bereich sind andere Anforderungen bezüglich Sicherheit zu erfüllen.

### Vorwort

Es existieren verschiedene Anleitungen, welche nur einzelne Aspekte eines MQTT-Brokers beschreiben. In dieser Anleitungen sollen verschiedene Szenarien beschrieben werden, unter anderem, wie MQTT sicher über das Internet betrieben werden kann.

## Einleitung

Das MQTT-Protokoll wird sowohl privat als auch industriell zur Übertragung von Telemetriedaten und Anweisungen verwendet. MQTT wird hierbei als Infrastruktur unter Anderem für Anwendungen im Smart Home verwendet. Verschiedene Geräte zur Datenaufnahme (Temperatur, Helligkeit etc.) sind verteilt und eine zentrale Instanz steuert Aktoren wie Heizregler.

### Einsatzzweck

Im privaten Bereich wird MQTT für Smart Home Anwendungen verwendet. Telemetriedaten werden an einem zentralen Broker gesammelt und auch Anweisungen können zentral über einen MQTT-Broker verteilt werden. Mit MQTT ist es möglich, Daten verschiedener Sensoren über Platzhalter abzufragen.
Im industriellen Umfeld wird MQTT zur Anbindung von Aggregaten verwendet.

### Funktionsweise
#### Topic

MQTT verwendet Broker als zentrale Komponente. Der Broker empfängt Daten, hält diese vor und stellt diese Daten anderen Geräten zur Verfügung. Diese Daten werden über Topics verwaltet. Ein Datum wird unter einem Topic veröffentlicht (published) und kann von anderen Geräten unter diesem Topic abonniert (subscribed) werden. Das Topic kann in einer Baumform strukturiert werden, wobei der Schrägstrich / als Trenner verwendet wird.
In einer einfachen Heimautomation können die Topics wie folgt strukturiert sein (siehe obige Grafik):
/plug1/voltage
/plug1/current
/plug1/state
/plug2/voltage
/plug2/current
/plug2/state
/thermo/temperature
Jedes Gerät kann den entsprechenden Status über den Topic veröffentlichen. Ein Abonnent kann verschiedene Topics abonnieren.
Die Zwischenstecker können per MQTT geschaltet werden. Hierzu abonnieren sie vom Broker das zu ihnen gehörige Subtopic state. Ein Abonnent könnte hiermit basierend auf der Temperatur die Zwischenstecker ein- oder ausschalten.

##### Platzhalter (Wildcards)

Mit Wildcards lassen sich verschiedene Topics gleichzeitig abonnieren.
Mit dem '#' lassen sich alle Topics unterhalb einer Hierarchie-Ebene auswählen. Mit '/plug1/#' werden alle Topics des 1. Zwischenschalters abonniert ('/plug1/voltage', '/plug1/current' und 'plug1/state'). Noch eine Hierarchie-Ebene höher mit '#' lassen sich alle Topics abonnieren, die über den Broker laufen (und vom Nutzer aboniert werden dürfen).
Das '+' wird in der Mitte einer Topic-Beschreibung verwendet und es werden alle Topics erfasst, deren restliche Bestandteile übereinstimmen. Bei '/+/voltage' werden alle Topics erfasst, deren 2. Ebene 'voltage' enthält, also '/plug1/voltage' und '/plug2/voltage'.
Die Wildcards funktionieren nur für den lesenden Zugriff. Ein Setzen zweier Topics mit Wildcards ist nicht möglich. Anstelle das Schalten beider Stecker mit '/+/state' müssen beide explizit gesetzt werden über '/plug1/state' und '/plug2/state'.

#### Payload

Zu diesen Topics werden die Inhalte (Payload) gespeichert bzw. veröffentlicht (published) und können von verschiedenen Geräte abonniert werden (subscription). Der Broker informiert alle Abonennten über neue Inhalte der abonnierten Topics. Eine Form für die Payload wird nicht definiert, so dass in einer Installation die Clients selbst wissen müssen, in welchem Format die Daten gespeichert werden. Im einfachsten Fall werden nur einzelne Werte gespeichert. Es können aber beispielsweise auch JSON oder XML Objekte verwendet werden.

#### Nutzername

Clients können sich am Broker mit einem Nutzernamen anmelden. Anhand des Nutzernamens lassen sich Einschränkungen definieren, welche Topics nutzbar sind.

#### Client ID

Unabhängig vom Nutzernamen verwendet jeder Client eine eigene ID, mit der sich der Client am Broker anmeldet. Diese ID wird bei der Umsetzung der Quality of Service Level 1 und 2 verwendet. Zudem kann anhand der Client ID der Zugriff zu einzelnen Topics geregelt werden.

#### Quality of Service (QoS)

Zur Verarbeitung von Daten sind folgende drei QoS-Level definiert:

##### 0 (default)

    at most once - maximal einmal: Die Daten werden maximal einmal übertragen. Bei Verbindungsabbrüchen können Nachrichten verloren gehen.

##### 1

    at least once - mindestens einmal: Die Daten werden mindestens einmal übertragen. Erfolgt von der Gegenstelle keine Empfangsbestätigung, wird die Nachricht wiederholt gesendet.

##### 2

    exact once - genau einmal: Die Daten werden an die Gegenstelle exakt einmal übertragen.
Das QoS-Level 0 wird standardmäßig verwendet. Solange eine aktive Verbindung zum Broker besteht, werden die Daten übertragen. Bricht die Verbindung ab, werden keine weiteren Daten übertragen. Wird die Verbindung wieder aufgebaut, werden neue Daten wieder übertragen. In der Zwischenzeit angefallen Daten sind verloren.
QoS-Level 1 versucht Probleme in einer aktiven Verbindung zu kompensieren. Die Gegenstelle muss den Empfang einer Nachricht quittieren, womit die Nachricht aus dem Ausgangspuffer entfernt wird. Erfolgt die Quittierung nicht, wird die Nachricht als Duplikat markiert weitergesendet.
Bei QoS-Level 2 wird die Nachrict exakt einmal an eine Gegenstelle gesendet. Hierzu verwendet der Broker für jeden angemeldeten Client dessen ID für einen Ausgangspuffer. Meldet sich der Client ordnungsgemäß ab, wird der Ausgangspuffer deaktiviert und es werden keine Nachrichten gemerkt. Wird die Verbindung unterbrochen, beläßt der Broker alle Nachrichten im Ausgangspuffer, bis sich der Client wieder anmeldet. Dann werden alle Nachrichten in der entsprechenden Reihenfolge übertragen.

### Implementationen

Mittlerweile gibt es einige Programme, welche MQTT als Broker bzw. Client zur Verfügung stellen. Eine Übersicht ist in der englischsprachigen Wikipedia zu finden: MQTT-Implementierungen.
Aus diesen sticht Mosquitto hervor. Aufgrund der weiten Verbreitung ist dies fast schon eine Referenzimplementierung. Mosquitto ist zudem für eine Vielzahl an Architekturen verfügbar und kann z.B. auch auf einem OpenWRT-Router installiert werden.

## Einsatzszenarien
### Basiskonfiguration

„MQTT-Broker einrichten“ ist nach Einschätzung seiner Autoren zu 80 % fertig
Dies ist die Standardkonfiguration, wenn Mosquitto auf einem unixoiden System aus den Paketquellen installiert wird.

### Mehrere Listener

„MQTT-Broker einrichten“ ist nach Einschätzung seiner Autoren zu 80 % fertig
Ein MQTT-Broker kann auf verschiedenen Ports lauschen und dort teils abweichende Konfigurationen haben. Dennoch ist der gesamte Topic-Baum auf allen Ports verfügbar.

### Mehrere Instanzen

„MQTT-Broker einrichten“ ist nach Einschätzung seiner Autoren zu 0 % fertig
Etwas mehr Aufwand ist nötig, um auch einen Rechner mehrere Broker parallel zu nutzen, welche getrennte Topics verwenden.

### MQTT mit Benutzer

„MQTT-Broker einrichten“ ist nach Einschätzung seiner Autoren zu 80 % fertig
Sowohl zur Authentifizierung als auch für Rechteverwaltung können Nutzer eingerichtet werden.

### TLS-Zertifikat am Broker

„MQTT-Broker einrichten“ ist nach Einschätzung seiner Autoren zu 90 % fertig
Speziell zur Kommunikation in einem tendenziell unsicheren Netzwerk dient die TLS-Verschlüsselung, um Daten nicht unverschlüsselt zu übertragen.

### Zweiseitige TLS-Anmeldung

„MQTT-Broker einrichten“ ist nach Einschätzung seiner Autoren zu 0 % fertig
TLS-Zertifikate können zudem genutzt werden, um den Zugriff auf einen Broker einzugrenzen. Mit TLS-Zertifikaten kann eine PKI (Public Key Infrastructure) verwendet werden, mit der Nachteile einer Nutzername/Passwort-System beseitigt werden kann.

### Multiple Broker

„MQTT-Broker einrichten“ ist nach Einschätzung seiner Autoren zu 0 % fertig
Je nach Netzwerktopologie macht es Sinn, mehrere Broker einzurichten und diese miteinander zu verbinden. Beispiel sind zwei Netzwerksegmente, welche über eine Firewall miteinander verbunden sind.

### Redundante MQTT-Broker

„MQTT-Broker einrichten“ ist nach Einschätzung seiner Autoren zu 0 % fertig
Ein Client kann für Verbindungen mit mehreren Broker eingerichtet werden; falls ein Broker ausfällt, wird direkt der nächste Broker verwendet.