Tech-Ecke / Delphi Inhalt / MQTT Client + Server

 

     MQTT Client + Server


MQTT (Message Queuing Telemetry Transport) ist ein schlankes Nachrichtenprotokoll, um Informationen innerhalb eines IoT-Netzwerks (Internet of Things) auszutauschen. Dabei dient ein Server, welcher hier Broker genannt wird als Vermittler zwischen den einzelnen Geräten (Clients). Ein Gerät das Daten empfangen soll "subscribed" für ein Topic beim Broker (-> abonniert ein Thema). Das Gerät das senden soll senden (published) die Information zusammen mit einem Topic an den Broker. Dieser leitet die Information an alle Geräte weiter die den Topic subscribed, also das Thema abonniert haben.
Hier auch noch einmal erklärt, im Zusammenhang mit Arduino + ESP6288, welcher beim Bau von IoT Sensoren, sowie Aktuatoren eingesetzt werden kann.

Komponente für Delphi

Die Anzahl an freien MQTT-Komponenten ist sehr begrenzt und somit wird man früher oder später, zwangsläufig über die TMQTTClient/Server Komponente stolpern. Der Autor ist nicht im Quellcode benannt, lediglich der Verweis auf eine URL "http://www.alphaworks.ibm.com/tech/rsmb", welche mittlerweile jedoch ins Leere läuft. Hier mal eine Lobeshymne an  WaybackMachine, die es einem erlaubt einen Blick in die digitale Vergangenheit werfen und somit auch auf diese Seite :-)

Installation

Die Installation unter D2007 und XE gestaltete sich bei mir nicht ganz reibungslos. Beim Kompilieren erschien folgende Meldung:
   [DCC Error] MQTTComponents.dpk(30): E2202 Required package 'OverbyteIcsDXeRun' not found
In diversen Foren liest man dazu nach, dass hier das ICSv90.Package für Abhilfe sorgen soll, was bei mir jedoch nur zu weiteren Fehlern führte. Letztlich hatte ich mit dem ICSv869.Package dann aber doch Erfolg.
Beim Aufrufen der Demo stößt man noch auf eine Anhängigkeit zur VirtualTreeView-Komponente von JAM-Software.
Um sich das Einsammeln im Netz zu erleichtern gibt es hier die Links. 

Downloads

 

TMQTTClient + Server Komponente (1 MB)

ICSv869.Package (externer Link)

VirtualTreeView (externer Link)

   MQTT Client 

Zur Überwachung bzw. Protokollierung des Clients wird hier im Beispiel eine TMemo verwendet.
Nachdem die TMQTTClient auf die Form gezogen wurde, kann man bei den Events OnFailure, OnMon und OnOnline folgenden Code hinterlegen.

OnOnline:

  Memo1.Lines.Add('Client is online');

OnMon:

  Memo1.Lines.Add (aStr);

OnFailure:

  Memo1.Lines.Add('---- Failure Reported ' + FailureNames (aReason));
ServerAktiv (false);

Der Server wird wie folgt gestartet. bei .Host wird die Adresse des Servers, sprich Broker eingetragen. Entweder URL bei einem Online-Broker oder die IP-Adresse wenn der Serve sich im Lokalen Netwerk befindet. Der Standardport für den Broker ist 1883 und wird bei .Port angegeben.

  TTClient.Host := 'BrokerAdresse';
TTClient.Port := StrToIntDef ('1883', 1883);
TTClient.Activate (true);
 

Um Nachrichten empfangen zu können muss auch noch mindestens ein Topic abonniert werden, das geht wie folgt:

  var
s: TStringList;
...
s := TStringList.Create;
s.AddObject('MeinTopicName', TObject (aQos));
TTClient.Subscribe(s);
s.Free;

Beim Event OnMsg purzeln dann letztlich die Nachrichten herein und werden wie folg abgerufen:

  Memo1.Lines.Add('Msg on Topic: "' + string (aTopic) + '"');
Memo1.Lines.Add(aMessage);



   MQTT Server 


Aktuell hatte ich noch keinen Bedarf einen Server zu realisieren, von daher verweise ich an der Stelle mal auf die Demo, welche sich im Zip-Archiv der Komponente befindet.

Wer einen Raspberry Pi sein Eigen nennt, findet hier eine Kurze Anleitung wie man diesen mittels Mosquitto zum MQTT Broker macht.

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !

[letzte Aktualisierung 30.06.2024]