sgcMQ in fünf Minuten

Dieses Paket enthält sieben native Messaging-Clients. MQTT ist der kürzeste Weg zu etwas Lauffähigem, daher macht diese Seite genau das: sich mit einem Broker verbinden, ein Topic abonnieren, eine Nachricht veröffentlichen und zusehen, wie sie zurückkommt. AMQP, Kafka und STOMP folgen derselben Zwei-Komponenten-Form.

MQTT 3.1.1 und 5.0, AMQP 0.9.1 und 1.0, Kafka, STOMP
Keine externe Bibliothek und keine DLL
Standard-Edition und höher

Zwei Komponenten, nicht eine

Das ist der Teil, an dem viele hängenbleiben. Die Protokoll-Komponente spricht MQTT, eine separate Client-Komponente besitzt den Socket. Du verbindest sie mit einer einzigen Zuweisung.

Die Protokoll-Komponente

TsgcWSPClient_MQTT auf der Palettenseite SGC MQ. Sie bietet Connect, Subscribe, Publish, UnSubscribe und dreizehn MQTT-Ereignisse.

Die Transport-Komponente

TsgcWebSocketClient für MQTT über WebSockets oder TsgcTCPClient für reines MQTT über TCP. Setze Host und Port bei dieser.

Die eine Zeile, die beide verbindet

MQTT.Client := WSClient;. Danach öffnest du die Verbindung, indem du WSClient.Active := True setzt, nicht indem du eine Methode des Protokolls aufrufst.

Plattformen

sgcWebSocket_Protocol_MQTT_Client.pas hat keinen Plattform-Guard, nur einen bedingten Import von Windows, und die Komponente ist mit ComponentPlatforms(0) registriert. Jedes Ziel lässt sich kompilieren.

Voraussetzungen und Editionen

Die Editionsspalte nennt das Define, das jedes Protokoll steuert, samt der Zeile in Source/sgcVer.inc, in der es steht.

Was Wert
IDE Delphi 7 bis RAD Studio 13 sowie C++Builder 2007 bis 13.
Uses-Klausel sgcWebSocket_Protocols für TsgcWSPClient_MQTT, sgcWebSocket für den Client, sgcWebSocket_Classes für TsgcWSConnection und sgcWebSocket_Types für TmqttQoS.
MQTT-Edition SGC_MQTT wird in Zeile 717 definiert, innerhalb des Blocks {$IFDEF SGC_EDT_STD}, der von Zeile 675 bis Zeile 724 reicht. Also Standard und höher. Die Blöcke sind kumulativ, daher enthalten es auch Professional, Enterprise und All-Access.
Die anderen Protokolle Alle im selben Standard-Block: SGC_STOMP in Zeile 716, SGC_AMQP in 718, SGC_AMQP1 in 719, SGC_KAFKA in 720 und SGC_WAMP in 715. Keines davon ist eine Enterprise-Funktion.
Edition, eigenständiges Paket Das Produkt sgcMQ definiert SGC_PACK_MQ in Zeile 855, und sein eigener Block in den Zeilen 959 bis 966 schaltet dieselben fünf Protokoll-Defines ein.
Plattformen Kein Plattform-Guard auf Unit-Ebene in der MQTT-Client-Unit. Die einzige Bedingung in ihrer Uses-Klausel ist {$IFDEF MSWINDOWS}Windows, {$ENDIF}.

Du willst gegen einen Broker testen, ohne einen zu installieren? Die mitgelieferte MQTT-Demo zeigt auf einen öffentlichen Test-Broker unter www.esegece.com, Port 15675 für MQTT über WebSockets.

Installieren und die Palettenseite finden

sgcMQ wird im sgcWebSockets-Installer und auch als eigenes Paket ausgeliefert. Die Installation läuft in beiden Fällen gleich ab.

1. Entpacken

Entpacke den Download in einen Ordner, unten {$DIR} genannt.

2. Bibliothekspfad

Tools, Optionen, Bibliothek. Füge {$DIR}\source und den lib-Ordner für deine IDE hinzu, zum Beispiel {$DIR}\libD13\$(Platform).

3. Pakete erstellen

Öffne die Paketgruppe für deine IDE-Version unter {$DIR}\Packages\. Kompiliere zuerst das Laufzeit-.dpk und installiere dann das Entwurfszeitpaket mit dcl.

4. Palette prüfen

Es erscheint eine Seite namens SGC MQ mit den Protokoll-Clients, die deine Edition freischaltet. Ab einem Standard-Build ist TsgcWSPClient_MQTT vorhanden.

5. Die Demo öffnen

Öffne {$DIR}\Demos\02.WebSocket_Protocols\08.MQTT_Client. Von dort stammt der Code unten, und sie zeigt bereits auf einen aktiven Test-Broker.

Verbinden, abonnieren, veröffentlichen

Verbinde das Protokoll mit einem Client, öffne die Verbindung, abonniere ein Topic und veröffentliche darauf. Die Nachricht kommt über OnMQTTPublish zurück.

uClientMQTT.pas
uses
  Classes, SysUtils,
  // sgc
  sgcWebSocket, sgcWebSocket_Classes, sgcWebSocket_Protocols,
  sgcWebSocket_Types, sgcWebSocket_Protocol_MQTT_Client,
  sgcWebSocket_Protocol_MQTT_Message;

procedure TfrmClientPROTOCOL.FormCreate(Sender: TObject);
begin
  WSClient := TsgcWebSocketClient.Create(Self);
  WSClient.Host := 'www.esegece.com';
  WSClient.Port := 15675;
  WSClient.TLS := False;

  // ... attach the client to the MQTT protocol
  MQTT.Client := WSClient;

  // ... and THIS is what opens the connection.
  // There is no Connect call on the protocol component.
  WSClient.Active := True;
end;

Für reines MQTT über TCP statt über WebSockets erzeugst du stattdessen einen TsgcTCPClient aus sgcTCP_Client_WS und richtest MQTT.Client darauf. Sonst ändert sich nichts, und genau deshalb sind die beiden Komponenten getrennt.

uClientMQTT.pas
procedure TfrmClientPROTOCOL.btnSubscribeClick(Sender: TObject);
begin
  MQTT.Subscribe('sgc/quickstart');
end;

procedure TfrmClientPROTOCOL.btnPublishClick(Sender: TObject);
begin
  // topic, payload, QoS, retain
  MQTT.Publish('sgc/quickstart', 'hello from Delphi',
    mtqsAtLeastOnce, False);
end;

procedure TfrmClientPROTOCOL.btnUnsubscribeClick(Sender: TObject);
begin
  MQTT.UnSubscribe('sgc/quickstart');
end;

Publish liefert ein Word, den Paketbezeichner, und wartet nicht. PublishAndWait liefert ein Boolean und blockiert, bis der Broker bestätigt, mit einem Timeout, der standardmäßig zehn Sekunden beträgt. TmqttQoS stammt aus sgcWebSocket_Types.

uClientMQTT.pas
procedure TfrmClientPROTOCOL.MQTTMQTTConnect(Connection: TsgcWSConnection;
  const Session: Boolean; const ReasonCode: Integer;
  const ReasonName: String;
  const ConnectProperties: TsgcWSMQTTCONNACKProperties);
begin
  memoLog.Lines.Add('#connected: ' + ReasonName);
end;

procedure TfrmClientPROTOCOL.MQTTMQTTSubscribe(Connection: TsgcWSConnection;
  aPacketIdentifier: Word; aCodes: TsgcWSSUBACKS;
  SubscribeProperties: TsgcWSMQTTSUBACKProperties);
begin
  memoLog.Lines.Add('#subscribed: ' + IntToStr(aPacketIdentifier));
end;

procedure TfrmClientPROTOCOL.MQTTMQTTPublish(Connection: TsgcWSConnection;
  aTopic, aText: string;
  PublishProperties: TsgcWSMQTTPUBLISHProperties);
begin
  memoLog.Lines.Add(aTopic + ': ' + aText);
end;

Das sind die drei, die zuerst wichtig sind. Neun weitere gibt es für den Bestätigungsablauf, das Trennen und die MQTT-5.0-Authentifizierung. Lass die IDE die Handler generieren, denn die Parameterlisten sind lang und die Properties-Objekte unterscheiden sich je Ereignis.

Alle drei Tabs stammen aus der mitgelieferten Demo Demos\02.WebSocket_Protocols\08.MQTT_Client\uClientMQTT.pas, wobei die Formularsteuerelemente durch Literale ersetzt wurden. Das Objekt MQTT ist in diesem Projekt auf dem Formular platziert, es im Code zu erzeugen funktioniert identisch.

Die Hin-und-zurück-Runde belegen

Zwei Ereignisse sagen dir, dass der Broker dich akzeptiert hat und das Topic aktiv ist.

OnMQTTConnect

Der Broker hat die Sitzung akzeptiert. ReasonCode und ReasonName sagen dir, warum nicht, wenn es nicht geklappt hat, und das ist weit nützlicher als ein getrennter Socket.

OnMQTTSubscribe

Das Abonnement wurde gewährt. aCodes, ein TsgcWSSUBACKS, enthält die Antwort des Brokers pro Topic, sodass ein abgelehntes Abonnement sichtbar statt stumm ist.

OnMQTTPublish

Eine Nachricht ist eingetroffen. Veröffentliche auf dem Topic, das du gerade abonniert hast, und sie kommt direkt zurück, was den gesamten Pfad mit einem Klick belegt.

Die Bestätigungsereignisse

Bei QoS 1 und 2 wird die Zustellung später bestätigt, über OnMQTTPubAck, OnMQTTPubRec, OnMQTTPubRel und OnMQTTPubComp. Wenn du stattdessen einen blockierenden Aufruf brauchst, verwende PublishAndWait.

Was beim ersten Mal meistens schiefgeht

Sechs Probleme erklären fast jede fehlgeschlagene erste Verbindung.

Beim Aufruf von Subscribe passiert nichts

Die Verbindung ist noch nicht offen. Die Protokoll-Komponente öffnet den Socket nicht, das tut der Client. Setze WSClient.Active := True und warte auf OnMQTTConnect, bevor du abonnierst.

Zugriffsverletzung beim ersten Aufruf

MQTT.Client wurde nie zugewiesen. Diese eine Zeile bindet das Protokoll an einen Transport, und ohne sie hat das Protokoll nichts, wohin es schreiben kann.

Falscher Port für den falschen Transport

MQTT über WebSockets und MQTT über reines TCP laufen bei den meisten Brokern auf verschiedenen Ports. 1883 und 8883 sind die üblichen TCP-Ports, während der WebSocket-Endpunkt ganz woanders liegt. Die mitgelieferte Demo verwendet 15675 für WebSockets.

Du suchst OnMQTTMessage

Dieses Ereignis gibt es nicht. Eingehende Broker-Nachrichten kommen für Text in OnMQTTPublish an und in OnMQTTPublishEx, wenn du die rohe Nutzlast und das vollständige Nachrichtenobjekt willst.

QoS 1 und 2 scheinen nichts bewirkt zu haben

Sie werden asynchron bestätigt. Publish gibt sofort den Paketbezeichner zurück, die Bestätigung kommt später über OnMQTTPubAck, OnMQTTPubRec, OnMQTTPubRel oder OnMQTTPubComp. Verwende PublishAndWait, wenn du einen blockierenden Aufruf willst.

Der Broker lehnt die Verbindung ab

Die meisten Broker verlangen eine Client-Kennung und Zugangsdaten. Setze sie in Authentication und verwende OnMQTTBeforeConnect, wenn du die Client-Kennung erst beim Verbindungsaufbau berechnen musst.

Über das erste Topic hinaus

Dieselbe Zwei-Komponenten-Form trägt jedes andere Protokoll im Paket.

MQTT-5.0-Eigenschaften

Setze MQTTVersion, und die Properties-Objekte für Anfrage und Antwort stehen zur Verfügung. User Properties, Subscription Identifiers, Topic Aliases und Reason Codes sind alle verfügbar.

MQTT-Referenz

AMQP, beide Versionen

Zwei getrennte Clients, 0.9.1 für Exchanges und Queues im RabbitMQ-Stil und 1.0 für das neuere Wire-Protokoll. Beide hängen sich an einen Client genauso wie MQTT.

AMQP-0.9.1-Referenz und AMQP-1.0-Referenz

Kafka und STOMP

Ein nativer Kafka-Wire-Protokoll-Client sowie STOMP 1.0 bis 1.2 mit brokerspezifischen Varianten für RabbitMQ und ActiveMQ.

STOMP für RabbitMQ und STOMP für ActiveMQ

Mit einem Cloud-Broker sprechen

AWS IoT und Azure IoT sprechen beide MQTT, und die Bibliothek liefert dedizierte Komponenten, die Signierung und Authentifizierung für dich übernehmen.

AWS-IoT-Referenz und Azure-IoT-Referenz

Referenz, Demos und Dokumentation

Die Referenzseiten dokumentieren jede Eigenschaft und jedes Ereignis. Die Demo-Projekte liegen im Download unter Demos\02.WebSocket_Protocols.

Referenz, MQTT-Client Jede Methode, Eigenschaft und jedes Ereignis von TsgcWSPClient_MQTT.
Referenz, AMQP 0.9.1 Exchanges, Queues, Bindings und Consumer.
Referenz, AMQP 1.0 Links, Sessions und das 1.0-Nachrichtenmodell.
Komponentenseite TsgcWSPClient_MQTT Der MQTT-Client vollständig, mit Verweisen auf die anderen sechs Protokoll-Clients.
Protokollübersicht Wie Sub-Protokoll-Komponenten sich an einen Client oder Server anhängen.
Online-Hilfe Die generierte Referenz, stets auf dem Stand der aktuellen Version.

Zum Weiterlesen: veröffentlichen und auf die Bestätigung warten, AMQP-Exchanges und -Queues und der Kafka-Client. Jedes Produkt hat einen eigenen Schnellstart, aufgelistet auf der Seite Erste Schritte.

Fragen zum sgcMQ-Schnellstart

Weil Protokoll und Transport getrennte Belange sind, und genau das erlaubt es, denselben MQTT-Client ohne Codeänderung über reines TCP oder über WebSockets laufen zu lassen. TsgcWSPClient_MQTT kodiert und dekodiert MQTT-Pakete. TsgcWebSocketClient oder TsgcTCPClient besitzt den Socket, den Host, den Port und die TLS-Einstellungen. Eine Zuweisung verbindet sie: MQTT.Client := WSClient;.
Setze Active := True auf der Client-Komponente, nicht auf dem Protokoll. Die mitgelieferte Demo macht genau das. Es gibt zwar auch eine Methode Connect am Protokoll, aber die Demo verwendet sie nicht, und das Setzen von Active ist der Weg, dem jedes Beispiel folgt.
SGC_MQTT wird in Zeile 717 von sgcVer.inc definiert, innerhalb des Blocks SGC_EDT_STD, der von Zeile 675 bis Zeile 724 reicht. Das ist die Standard-Edition, die niedrigste kostenpflichtige Stufe, und die Blöcke sind kumulativ, sodass jede höhere Edition es ebenfalls hat. STOMP in Zeile 716, AMQP in 718, AMQP 1.0 in 719 und Kafka in 720 liegen alle im selben Block. Keines der Messaging-Protokolle ist eine Enterprise-Funktion.
OnMQTTPublish, dessen Signatur procedure(Connection: TsgcWSConnection; aTopic, aText: String; PublishProperties: TsgcWSMQTTPUBLISHProperties) lautet. Ein Ereignis namens OnMQTTMessage gibt es nicht. Wenn du die rohen Bytes oder das gesamte Nachrichtenobjekt statt eines Strings brauchst, behandle stattdessen OnMQTTPublishEx.
Publish liefert ein Word, den Paketbezeichner. Die Zustellung wird asynchron bestätigt: bei QoS 1 über OnMQTTPubAck, bei QoS 2 über OnMQTTPubRec, OnMQTTPubRel und OnMQTTPubComp. Wenn du einen Aufruf willst, der blockiert, bis der Broker bestätigt, verwende PublishAndWait, das ein Boolean liefert und einen Timeout entgegennimmt, der standardmäßig zehn Sekunden beträgt.
Der dritte Parameter von Publish ist ein TmqttQoS, deklariert in sgcWebSocket_Types.pas mit den Membern mtqsAtMostOnce, mtqsAtLeastOnce, mtqsExactlyOnce und mtqsReserved. Der Standardwert ist mtqsAtMostOnce. Subscribe nimmt denselben Typ als zweiten Parameter.
Ja. sgcWebSocket_Protocol_MQTT_Client.pas enthält keinen Plattform-Guard auf Unit-Ebene, die einzige Bedingung in der Uses-Klausel ist der Import von Windows, und die Palettenkomponente ist mit ComponentPlatforms(0) registriert, sodass die IDE ihre Zielplattformen nicht einschränkt.
Ja. Setze MQTTVersion auf der Protokoll-Komponente. Dann kommen die 5.0-Properties-Objekte ins Spiel: ConnectProperties auf dem Hinweg und der Properties-Parameter jedes Ereignisses auf dem Rückweg, zum Beispiel TsgcWSMQTTCONNACKProperties bei OnMQTTConnect und TsgcWSMQTTPUBLISHProperties bei OnMQTTPublish.
Bestes Preis-Leistungs-Verhältnis: All-AccessAlle eSeGeCe-Produkte, inklusive Premium-Support, ab €1,059 pro Jahr.
All-Access-Preise ansehen

Bereit, einen Broker hinter deine Anwendung zu setzen?

Lade die Testversion herunter und starte die MQTT-Demo gegen den öffentlichen Test-Broker.