# MQTT

Diese Seite beschreibt den Einsatz von MQTT um Datenpakete zwischen Applikationen zu vermitteln

## MQTT Theorie

[Wikipedia zu MQTT](https://de.wikipedia.org/wiki/MQTT): ein offenes Netzwerkprotokoll für Machine-to-Machine-Kommunikation (M2M), das die Übertragung von Telemetriedaten in Form von Nachrichten zwischen Geräten ermöglicht, trotz hoher Verzögerungen oder beschränkter Netzwerke. Entsprechende Geräte reichen von Sensoren und Aktoren, Mobiltelefonen, Eingebetteten Systemen in Fahrzeugen oder Laptops bis zu voll entwickelten Rechnern.

[![mqtt-publish-subscribe.png](https://wiki.oberlab.de/uploads/images/gallery/2024-05/scaled-1680-/o96UCJ1nnMXzpWqQ-mqtt-publish-subscribe.png)](https://wiki.oberlab.de/uploads/images/gallery/2024-05/o96UCJ1nnMXzpWqQ-mqtt-publish-subscribe.png "Datenübertragung mit MQTT - Quelle MQTT.org")

In der MQTT Architektur werden Daten von einem Client zu einem Server (*Broker*) geschickt (*published*). Dieser puffert die Pakete für eine gewisse Zeit.

Pakete werden einem Thema (*topic*) zugewiesen. Topics sind hierarchisch angeordnet (z.B. projekte/connecting\_peaks/v2023/miesbach-pxc-01 oder home\_automation/lab\_gmund/sensoren/tür01), womit man eine gewisse Struktur erstellen kann.

Andere Clients melden sich beim Broker an, abonnieren (*subscribe*) dedizierte Themen oder horchen allem zu. Sobald ein Datenpaket zu einem abonnierten Thema verfügbar ist, sendet ihn der Broker dem Client (Push-Verfahren).

Dank des Zwischenpufferns können zeitversetzt abgeholt werden, bzw können verzögert zugestellt werden falls die Verbindung instabil ist.

Die Kommunikation ist ggf bidirektional, d.h. ein Sensor published ein Paket, welches empfangen wird, und eine Reaktion auslöst, die als weiteres Paket über MQTT published wird, entweder zum Sensor zurück, oder zu einem weiteren Aktuator.

## MQTT und TTN

[The Things Network](https://wiki.oberlab.de/books/allgemeines-wissen/page/lora-ttn "LoRa & TTN") bildet die Brücke zwischen IoT Geräte, die per [LoRa](https://wiki.oberlab.de/books/allgemeines-wissen/page/lora-ttn "LoRa & TTN") funken, und Applikationen. TTN stellt einen MQTT Server zur Verfügung, der die Datenpakete weiterleitet.

Die Topics folgen dem [Schema](https://www.thethingsindustries.com/docs/integrations/mqtt/#subscribing-to-upstream-traffic): v3/{application id}@{tenant id}/devices/{device id}, wobei

- *application id* ist z.B.oberlab-counter-sandbox, also der Name der Applikation wie der Benutzer sie vergeben hat
- *tenant id* ist “ttn”
- *device id* ist nicht die DeviceEID, sondern der DeviceName

## Clients

- Grafische Oberfläche [mqtt-explorer](https://mqtt-explorer.com/) für Windows, Mac, Linux
- Kommandozeile unter Linux : z.B. [mosquitto-client](https://mosquitto.org/) Paket, welches die Befehle mosquitto\_sub und mosquitto\_pub bereitstellt.
- [Telegraf](https://www.influxdata.com/time-series-platform/telegraf/): Client, um die Datenpakete an eine Influx Datenbank weiterzuleiten

## Ober-MQTT Server

Auf dem OberServer im Lab läuft ein zentraler MQTT Server (mit der [Mosquitto Software](https://mosquitto.org/)). Er ist unter mqtt.oberlab.de erreichbar. Der Zugang ist allerdings nur mit Login/Passwort möglich. Es sollte pro Client ein eigener Satz an Credentials erstellt werden!

Er verwaltet nciht nur eigene Daten, sondern meldet sich als Client bei anderen Server als Client an (z.B. bei TTN), sammelt und konzentriert die Datenpakete. Somit reicht es, sich mit dem OberMTT Server zu verbinden, um auf alle MQTT-Daten zuzugreifen.

### Daten von TTN zu OberMQTT spiegeln

Die Daten der Sandbox Applikation werden zu unseren Server gespiegelt, dabei wird der Topic zu connecting\_peaks/sandbox geändert

Der passende Eintrag wird in `/docker/conf/mosquitto.conf` vorgenommen:

```plaintext
connection ttn_mqtt_01
address eu1.cloud.thethings.network:1883
remote_password <API Key>
remote_username <API Key User>
local_password <password>
local_username <username>
notifications true
# topic pattern [[[ out | in | both ] qos-level] local-prefix remote-prefix]
# subscribes to the remote topic $SYS/broker/clients/total and republishes the messages received to the local topic test/mosquitto/org/clients/total
# topic clients/total in 0 test/mosquitto/org/ $SYS/broker/
topic # in 0 connecting_peaks/sandbox/ v3/oberlab-counter-sandbox@ttn/
```

### Credentials

Die lokalen Credentials werden in `/docker/conf/mosquitto.conf` abgelegt