1. Geschichte
-
1999 von IBM entwickelt
-
Seit 2013 standardisiert als IoT-Protokoll
-
Machine-to-Machine-Kommunikation (M2M)
-
Setzt auf TCP/IP-Protokoll
-
Wird von einer Community weiter entwickelt
-
Aktuell in der Version 5
2. Eigenschaften
-
Es ist einfach zu implementieren
-
Leichtgewichtig und minimaler Protokoll-Overhead
-
Push-Messaging
-
Einstellbare Stufen (Quality of Service)
-
Nachrichten können zwischengespeichert werden
-
Eine Verbindung zwischen Client/Server besteht ständig
3. Einsatzgebiete
-
Eigentlich überall da, wo Daten zwischen Geräten unterschiedlichster Bauart ausgetauscht werden sollen (M2M)
-
Auf ressourcenarmen Geräten (IoT, Esp, u.s.w.)
-
Sehr beliebt bei Hausautomatisierung
-
Messenger-Dienste basieren auf MQTT
4. Sicherheit
-
Authentifizierung gegenüber Broker via User/Passwort einstellbar
-
SSL/TLS-Support zwischen Clients und Broker konfigurierbar
6. Problem
-
Sibirien Ölpipelines
-
Daten (Öl Leck, Öl Menge, ..)
-
Datenverbindung in sibirischer Wüste sehr schlecht
-
Lösung: Etwas leichtgewichtiges für Daten von Pipeline → MQTT
-
Geringe Datenmengen an Broker → dieser schickt sie dann weiter
7. MQTT Bedeutung
→ Message-Queue-Telemetry-Transport
-
Es ist einfach zu implementieren
-
Leichtgewichtig und minimaler Protokoll-Overhead
-
Push-Messaging
8. Code Bsp
Falls nicht vorhanden - Docker installieren
Mit folgendem Befehl den Dockercontainer, in welchem sich der Mqtt Broker befindet, hochfahren
docker-compose up
-
quarkus starten
mvn quarkus:dev
-
Auf folgender URL das Ergebnis ansehen
http://localhost:8080/prices.html
8.1. Code snippets
Hier wird ein Preis generiert. Ein sogenanntes "topic" ist eine Art "Variable" am Broker, welche dann die Werte erhält @Outgoing ist dann das Topic, welches die Werte erhält
@ApplicationScoped
public class PriceGenerator {
private Random random = new Random();
@Outgoing("topic-price")
public Multi<Integer> generate() {
return Multi.createFrom().ticks().every(Duration.ofSeconds(5))
.onOverflow().drop()
.map(tick -> {
int price = random.nextInt(100);
System.out.println("Sending price: " + price);
return price;
});
}
}
Eine einfache Ressource, die den "In-Memory" "my-data-stream" abruft und die Elemente an ein Server sent Event sendet.
@Path("/prices")
public class PriceResource {
@Inject
@Channel("my-data-stream")
Publisher<Double> prices;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello 5AHIF";
}
@GET
@Path("/stream")
@Produces(MediaType.SERVER_SENT_EVENTS)
public Publisher<Double> stream() {
return prices;
}
}
Folgendes wird am Localhost angezeigt: