sgcMQ in vijf minuten

In dit package zitten zeven native messagingclients. MQTT is de kortste weg naar iets werkends en dat doet deze pagina dan ook: verbinden met een broker, je abonneren op een topic, een bericht publiceren en het zien terugkomen. AMQP, Kafka en STOMP volgen dezelfde opzet met twee componenten.

MQTT 3.1.1 and 5.0, AMQP 0.9.1 and 1.0, Kafka, STOMP
Geen externe bibliotheek en geen DLL
Standard-editie en hoger

Twee componenten, niet één

Dit is het onderdeel waar mensen over struikelen. Het protocolcomponent spreekt MQTT; een apart clientcomponent beheert de socket. Je verbindt ze met één toewijzing.

Het protocolcomponent

TsgcWSPClient_MQTT op de palettabpagina SGC MQ. Het bevat Connect, Subscribe, Publish, UnSubscribe en dertien MQTT-gebeurtenissen.

Het transportcomponent

TsgcWebSocketClient voor MQTT via WebSockets, of TsgcTCPClient voor gewoon MQTT via TCP. Stel Host en Port op dit component in.

De ene regel die ze verbindt

MQTT.Client := WSClient;. Daarna open je de verbinding door WSClient.Active := True in te stellen, niet door een methode van het protocol aan te roepen.

Platforms

sgcWebSocket_Protocol_MQTT_Client.pas heeft geen platformbeveiliging, alleen een voorwaardelijke Windows-import, en het component is geregistreerd met ComponentPlatforms(0). Elk doelplatform compileert.

Vereisten en edities

De editiekolom noemt de define die elk protocol afschermt, met het regelnummer in Source/sgcVer.inc.

Onderdeel Waarde
IDE Delphi 7 tot en met RAD Studio 13 en C++Builder 2007 tot en met 13.
Uses-clausule sgcWebSocket_Protocols voor TsgcWSPClient_MQTT, sgcWebSocket voor de client, sgcWebSocket_Classes voor TsgcWSConnection en sgcWebSocket_Types voor TmqttQoS.
MQTT-editie SGC_MQTT wordt gedefinieerd op regel 717, binnen het {$IFDEF SGC_EDT_STD}-blok dat loopt van regel 675 tot regel 724. Dus Standard en hoger. De blokken zijn cumulatief, dus Professional, Enterprise en All-Access bevatten het ook.
De andere protocollen Allemaal in hetzelfde Standard-blok: SGC_STOMP op regel 716, SGC_AMQP op 718, SGC_AMQP1 op 719, SGC_KAFKA op 720 en SGC_WAMP op 715. Geen van deze is een Enterprise-functie.
Editie, zelfstandig package Het product sgcMQ definieert SGC_PACK_MQ op regel 855 en het eigen blok op regel 959 tot 966 schakelt dezelfde vijf protocoldefines in.
Platforms Geen platformbeveiliging op unitniveau in de MQTT-clientunit. De enige voorwaarde in de uses-clausule is {$IFDEF MSWINDOWS}Windows, {$ENDIF}.

Wil je een broker om tegen te testen zonder er een te installeren? De meegeleverde MQTT-demo wijst naar een openbare testbroker op www.esegece.com, poort 15675 voor MQTT via WebSockets.

Installeer en vind de palettabpagina

sgcMQ wordt geleverd in het sgcWebSockets-installatieprogramma en ook als eigen package. De installatie is in beide gevallen hetzelfde.

1. Uitpakken

Pak de download uit in een map, hieronder {$DIR} genoemd.

2. Bibliotheekpad

Tools, Options, Library. Voeg {$DIR}\source toe en de libmap voor jouw IDE, bijvoorbeeld {$DIR}\libD13\$(Platform).

3. De packages bouwen

Open de packagegroep voor jouw IDE-versie onder {$DIR}\Packages\. Compileer eerst de runtime-.dpk en installeer daarna die van designtime (dcl).

4. Het palet controleren

Er verschijnt een pagina met de naam SGC MQ met de protocolclients die je editie inschakelt. In een Standard-build en hoger staat TsgcWSPClient_MQTT erop.

5. De demo openen

Open {$DIR}\Demos\02.WebSocket_Protocols\08.MQTT_Client. De onderstaande code komt daaruit en de demo wijst al naar een live testbroker.

Verbinden, abonneren, publiceren

Koppel het protocol aan een client, open de verbinding, abonneer je op een topic en publiceer ernaar. Het bericht komt terug op OnMQTTPublish.

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;

Maak voor gewoon MQTT via TCP in plaats van via WebSockets in plaats daarvan een TsgcTCPClient aan uit sgcTCP_Client_WS en laat MQTT.Client daarnaar wijzen. Verder verandert er niets, en dat is de reden dat de twee componenten gescheiden zijn.

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 geeft een Word terug, de pakketidentificatie, en wacht niet. PublishAndWait geeft een Boolean terug en blokkeert tot de broker bevestigt, met een time-out die standaard tien seconden is. TmqttQoS komt uit 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;

Dit zijn de drie die als eerste ertoe doen. Er zijn er nog negen voor de bevestigingsflow, het verbreken van de verbinding en MQTT 5.0-authenticatie. Laat de IDE de handlers genereren, want de parameterlijsten zijn lang en de eigenschapsobjecten verschillen per gebeurtenis.

Alle drie de tabbladen komen uit de meegeleverde demo Demos\02.WebSocket_Protocols\08.MQTT_Client\uClientMQTT.pas, met de formulierbesturingselementen vervangen door literals. Het MQTT-object wordt in dat project op het formulier geplaatst; het in code aanmaken werkt op dezelfde manier.

Bewijs de heen-en-terugreis

Twee gebeurtenissen vertellen je dat de broker je heeft geaccepteerd en dat het topic live is.

OnMQTTConnect

De broker heeft de sessie geaccepteerd. ReasonCode en ReasonName vertellen je waarom niet als het niet is gelukt, en dat is veel nuttiger dan een weggevallen socket.

OnMQTTSubscribe

Het abonnement is toegekend. aCodes, een TsgcWSSUBACKS, bevat het antwoord van de broker per topic, dus een geweigerd abonnement is zichtbaar in plaats van stil.

OnMQTTPublish

Er is een bericht binnengekomen. Publiceer naar het topic waarop je je net hebt geabonneerd en het komt meteen terug, waarmee het hele pad met één klik is bewezen.

De bevestigingsgebeurtenissen

Bij QoS 1 en 2 wordt de aflevering later bevestigd, op OnMQTTPubAck, OnMQTTPubRec, OnMQTTPubRel en OnMQTTPubComp. Als je in plaats daarvan een blokkerende aanroep nodig hebt, gebruik dan PublishAndWait.

Wat er de eerste keer meestal misgaat

Zes problemen verklaren bijna elke mislukte eerste verbinding.

Er gebeurt niets als je Subscribe aanroept

De verbinding is nog niet open. Het protocolcomponent opent de socket niet; de client doet dat. Stel WSClient.Active := True in en wacht op OnMQTTConnect voordat je je abonneert.

Access violation bij de eerste aanroep

MQTT.Client is nooit toegewezen. Die ene regel koppelt het protocol aan een transport en zonder die regel heeft het protocol nergens om naartoe te schrijven.

Verkeerde poort voor het verkeerde transport

MQTT via WebSockets en MQTT via gewoon TCP hebben op de meeste brokers verschillende poorten. 1883 en 8883 zijn de gebruikelijke TCP-poorten, terwijl het WebSocket-eindpunt ergens heel anders zit. De meegeleverde demo gebruikt 15675 voor WebSockets.

Je zoekt OnMQTTMessage

Zo'n gebeurtenis bestaat niet. Binnenkomende berichten van de broker komen aan op OnMQTTPublish voor tekst en op OnMQTTPublishEx als je de ruwe payload en het volledige berichtobject wilt.

QoS 1 en 2 lijken niets te doen

Ze worden asynchroon bevestigd. Publish geeft de pakketidentificatie meteen terug; de bevestiging komt later binnen op OnMQTTPubAck, OnMQTTPubRec, OnMQTTPubRel of OnMQTTPubComp. Gebruik PublishAndWait als je een blokkerende aanroep wilt.

De broker weigert de verbinding

De meeste brokers willen een clientidentificatie en inloggegevens. Stel ze in op Authentication en gebruik OnMQTTBeforeConnect als je de clientidentificatie op het moment van verbinden moet berekenen.

Voorbij het eerste topic

Dezelfde opzet met twee componenten geldt voor elk ander protocol in het package.

MQTT 5.0-eigenschappen

Stel MQTTVersion in en de eigenschapsobjecten voor verzoek en antwoord worden beschikbaar. Gebruikerseigenschappen, abonnementsidentificaties, topic-aliassen en redencodes zijn allemaal beschikbaar.

MQTT-referentie

AMQP, beide versies

Twee aparte clients: 0.9.1 voor exchanges en queues in RabbitMQ-stijl en 1.0 voor het nieuwere wire-protocol. Beide koppel je aan een client op dezelfde manier als MQTT.

AMQP 0.9.1-referentie en AMQP 1.0-referentie

Kafka en STOMP

Een native client voor het Kafka-wire-protocol en STOMP 1.0 tot en met 1.2 met brokerspecifieke varianten voor RabbitMQ en ActiveMQ.

STOMP voor RabbitMQ en STOMP voor ActiveMQ

Praat met een cloudbroker

AWS IoT en Azure IoT spreken allebei MQTT en de bibliotheek levert speciale componenten mee die hun ondertekening en authenticatie voor je afhandelen.

AWS IoT-referentie en Azure IoT-referentie

Referentie, demo's en documentatie

De referentiepagina's documenteren elke eigenschap en gebeurtenis. Demoprojecten zitten in de download, onder Demos\02.WebSocket_Protocols.

Referentie, MQTT-client Elke methode, eigenschap en gebeurtenis van TsgcWSPClient_MQTT.
Referentie, AMQP 0.9.1 Exchanges, queues, bindings en consumers.
Referentie, AMQP 1.0 Links, sessies en het 1.0-berichtmodel.
Componentpagina TsgcWSPClient_MQTT De MQTT-client volledig beschreven, met de andere zes protocolclients erin gelinkt.
Protocollenoverzicht Hoe subprotocolcomponenten aan een client of server worden gekoppeld.
Online help De gegenereerde referentie, altijd in lijn met de huidige release.

Verder lezen: publiceren en wachten op de bevestiging, AMQP-exchanges en -queues en de Kafka-client. Elk product heeft zijn eigen snelstart, te vinden op de pagina Aan de slag.

Vragen over de sgcMQ-snelstart

Omdat het protocol en het transport gescheiden verantwoordelijkheden zijn, en dat maakt het mogelijk dat dezelfde MQTT-client via gewoon TCP of via WebSockets draait zonder je code te wijzigen. TsgcWSPClient_MQTT codeert en decodeert MQTT-pakketten. TsgcWebSocketClient of TsgcTCPClient beheert de socket, de host, de poort en de TLS-instellingen. Eén toewijzing verbindt ze: MQTT.Client := WSClient;.
Stel Active := True in op het clientcomponent, niet op het protocol. De meegeleverde demo doet precies dat. Er is ook een methode Connect op het protocol, maar de demo gebruikt die niet en het instellen van Active is de route die elk voorbeeld volgt.
SGC_MQTT wordt gedefinieerd op regel 717 van sgcVer.inc, binnen het SGC_EDT_STD-blok dat loopt van regel 675 tot regel 724. Dat is de Standard-editie, het laagste betaalde niveau, en de blokken zijn cumulatief, dus elke hogere editie heeft het ook. STOMP op regel 716, AMQP op 718, AMQP 1.0 op 719 en Kafka op 720 staan allemaal in hetzelfde blok. Geen van de messagingprotocollen is een Enterprise-functie.
OnMQTTPublish, met als signatuur procedure(Connection: TsgcWSConnection; aTopic, aText: String; PublishProperties: TsgcWSMQTTPUBLISHProperties). Er is geen gebeurtenis met de naam OnMQTTMessage. Als je de ruwe bytes of het hele berichtobject nodig hebt in plaats van een string, handel dan OnMQTTPublishEx af.
Publish geeft een Word terug, de pakketidentificatie. Aflevering wordt asynchroon bevestigd: bij QoS 1 op OnMQTTPubAck, bij QoS 2 via OnMQTTPubRec, OnMQTTPubRel en OnMQTTPubComp. Als je een aanroep wilt die blokkeert tot de broker bevestigt, gebruik dan PublishAndWait, die een Boolean teruggeeft en een time-out neemt die standaard tien seconden is.
De derde parameter van Publish is een TmqttQoS, gedeclareerd in sgcWebSocket_Types.pas met de leden mtqsAtMostOnce, mtqsAtLeastOnce, mtqsExactlyOnce en mtqsReserved. De standaardwaarde is mtqsAtMostOnce. Subscribe neemt hetzelfde type als tweede parameter.
Ja. sgcWebSocket_Protocol_MQTT_Client.pas heeft geen platformbeveiliging op unitniveau, de enige voorwaarde in de uses-clausule is de Windows-import en het palettcomponent is geregistreerd met ComponentPlatforms(0), dus de IDE beperkt de doelplatforms niet.
Ja. Stel MQTTVersion in op het protocolcomponent. De 5.0-eigenschapsobjecten zijn dan in gebruik: ConnectProperties op de heenweg en de eigenschappenparameter van elke gebeurtenis op de terugweg, bijvoorbeeld TsgcWSMQTTCONNACKProperties bij OnMQTTConnect en TsgcWSMQTTPUBLISHProperties bij OnMQTTPublish.
De beste deal: All-AccessElk eSeGeCe-product, inclusief Premium-ondersteuning, vanaf €1,059 per jaar.
Bekijk de All-Access-prijzen

Klaar om een broker achter je toepassing te zetten?

Download de proefversie en draai de MQTT-demo tegen de openbare testbroker.