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

5. Broker

  • Moquette

  • Mosquitto

  • MQTTRoute

  • Emqttd

  • HiveMQ

  • HBMQTT

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:

localhost