sgcMQ en cinq minutes

Sept clients de messagerie natifs sont livrés dans ce package. MQTT est le chemin le plus court pour obtenir quelque chose qui fonctionne, c'est donc ce que fait cette page : se connecter à un broker, souscrire à un topic, publier un message et le voir revenir. AMQP, Kafka et STOMP suivent la même structure à deux composants.

MQTT 3.1.1 et 5.0, AMQP 0.9.1 et 1.0, Kafka, STOMP
Aucune bibliothèque externe et aucune DLL
Édition Standard et supérieures

Deux composants, pas un seul

C'est ce qui piège les gens. Le composant de protocole parle MQTT ; un composant client distinct possède le socket. Tu les relies par une seule affectation.

Le composant de protocole

TsgcWSPClient_MQTT sur la page de palette SGC MQ. Il porte Connect, Subscribe, Publish, UnSubscribe et treize événements MQTT.

Le composant de transport

TsgcWebSocketClient pour MQTT sur WebSockets, ou TsgcTCPClient pour du MQTT simple sur TCP. Définis Host et Port sur celui-ci.

La ligne qui les relie

MQTT.Client := WSClient;. Ensuite, tu ouvres la connexion en définissant WSClient.Active := True, et non en appelant une méthode sur le protocole.

Plateformes

sgcWebSocket_Protocol_MQTT_Client.pas ne comporte aucune garde de plateforme, seulement un import conditionnel de Windows, et le composant est enregistré avec ComponentPlatforms(0). Toutes les cibles compilent.

Prérequis et éditions

La colonne d'édition indique le define qui conditionne chaque protocole, avec la ligne où il se trouve dans Source/sgcVer.inc.

Quoi Valeur
IDE Delphi 7 jusqu'à RAD Studio 13, et C++Builder 2007 jusqu'à 13.
Clause uses sgcWebSocket_Protocols pour TsgcWSPClient_MQTT, sgcWebSocket pour le client, sgcWebSocket_Classes pour TsgcWSConnection, et sgcWebSocket_Types pour TmqttQoS.
Édition MQTT SGC_MQTT est défini à la ligne 717, dans le bloc {$IFDEF SGC_EDT_STD} qui va de la ligne 675 à la ligne 724. Donc Standard et supérieures. Les blocs sont cumulatifs, donc Professional, Enterprise et All-Access l'incluent aussi.
Les autres protocoles Tous dans le même bloc Standard : SGC_STOMP à la ligne 716, SGC_AMQP à la 718, SGC_AMQP1 à la 719, SGC_KAFKA à la 720 et SGC_WAMP à la 715. Aucun n'est une fonctionnalité Enterprise.
Édition, package autonome Le produit sgcMQ définit SGC_PACK_MQ à la ligne 855, et son propre bloc des lignes 959 à 966 active les mêmes cinq defines de protocole.
Plateformes Aucune garde de plateforme au niveau de l'unité du client MQTT. La seule condition dans sa clause uses est {$IFDEF MSWINDOWS}Windows, {$ENDIF}.

Tu veux un broker pour tester sans en installer un ? La démo MQTT livrée pointe vers un broker de test public sur www.esegece.com, port 15675 pour MQTT sur WebSockets.

Installer et trouver la page de palette

sgcMQ est livré dans l'installeur de sgcWebSockets et aussi comme package à part. L'installation est la même dans les deux cas.

1. Décompresser

Décompresse le téléchargement dans un dossier, appelé {$DIR} ci-dessous.

2. Chemin de bibliothèque

Outils, Options, Bibliothèque. Ajoute {$DIR}\source et le dossier lib de ton IDE, par exemple {$DIR}\libD13\$(Platform).

3. Compiler les packages

Ouvre le groupe de packages de ta version d'IDE sous {$DIR}\Packages\. Compile d'abord le .dpk d'exécution, puis installe celui de conception dcl.

4. Vérifier la palette

Une page nommée SGC MQ apparaît, contenant les clients de protocole que ton édition active. À partir d'une version Standard, TsgcWSPClient_MQTT y figure.

5. Ouvrir la démo

Ouvre {$DIR}\Demos\02.WebSocket_Protocols\08.MQTT_Client. C'est de là que provient le code ci-dessous, et elle pointe déjà vers un broker de test en ligne.

Se connecter, souscrire, publier

Relie le protocole à un client, ouvre la connexion, souscris à un topic et publie dessus. Le message revient sur 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;

Pour du MQTT simple sur TCP plutôt que sur WebSockets, crée plutôt un TsgcTCPClient depuis sgcTCP_Client_WS et pointe MQTT.Client vers lui. Rien d'autre ne change, et c'est la raison pour laquelle les deux composants sont séparés.

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 renvoie un Word, l'identifiant du paquet, et n'attend pas. PublishAndWait renvoie un Boolean et bloque jusqu'à ce que le broker confirme, avec un délai d'expiration de dix secondes par défaut. TmqttQoS provient de 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;

Ce sont les trois qui comptent d'abord. Neuf autres existent pour le flux d'accusés de réception, la déconnexion et l'authentification MQTT 5.0. Laisse l'IDE générer les gestionnaires, car les listes de paramètres sont longues et les objets de propriétés diffèrent selon l'événement.

Les trois onglets proviennent de la démo livrée Demos\02.WebSocket_Protocols\08.MQTT_Client\uClientMQTT.pas, avec les contrôles de la fiche remplacés par des littéraux. L'objet MQTT est placé sur la fiche dans ce projet ; le créer dans le code fonctionne à l'identique.

Prouver l'aller-retour

Deux événements t'indiquent que le broker t'a accepté et que le topic est actif.

OnMQTTConnect

Le broker a accepté la session. ReasonCode et ReasonName t'indiquent pourquoi quand ce n'est pas le cas, ce qui est bien plus utile qu'un socket coupé.

OnMQTTSubscribe

L'abonnement a été accordé. aCodes, un TsgcWSSUBACKS, contient la réponse du broker pour chaque topic, un abonnement refusé est donc visible plutôt que silencieux.

OnMQTTPublish

Un message est arrivé. Publie sur le topic auquel tu viens de souscrire et il revient directement, ce qui prouve tout le chemin en un clic.

Les événements d'accusé de réception

En QoS 1 et 2, la livraison est confirmée plus tard, sur OnMQTTPubAck, OnMQTTPubRec, OnMQTTPubRel et OnMQTTPubComp. Si tu as besoin d'un appel bloquant, utilise PublishAndWait.

Ce qui se passe généralement mal la première fois

Six problèmes expliquent presque toutes les premières connexions en échec.

Rien ne se passe quand tu appelles Subscribe

La connexion n'est pas encore ouverte. Le composant de protocole n'ouvre pas le socket ; c'est le client qui le fait. Définis WSClient.Active := True et attends OnMQTTConnect avant de souscrire.

Violation d'accès au premier appel

MQTT.Client n'a jamais été affecté. Cette seule ligne lie le protocole à un transport, et sans elle le protocole n'a nulle part où écrire.

Mauvais port pour le mauvais transport

MQTT sur WebSockets et MQTT sur TCP simple utilisent des ports différents sur la plupart des brokers. 1883 et 8883 sont les ports TCP habituels, tandis que le point d'accès WebSocket est tout à fait ailleurs. La démo livrée utilise 15675 pour WebSockets.

Tu cherches OnMQTTMessage

Cet événement n'existe pas. Les messages entrants du broker arrivent sur OnMQTTPublish pour le texte, et sur OnMQTTPublishEx quand tu veux la charge utile brute et l'objet message complet.

QoS 1 et 2 semblent n'avoir rien fait

Ils sont acquittés de façon asynchrone. Publish renvoie immédiatement l'identifiant du paquet ; l'accusé de réception arrive plus tard sur OnMQTTPubAck, OnMQTTPubRec, OnMQTTPubRel ou OnMQTTPubComp. Utilise PublishAndWait quand tu veux un appel bloquant.

Le broker refuse la connexion

La plupart des brokers exigent un identifiant de client et des identifiants de connexion. Définis-les sur Authentication, et utilise OnMQTTBeforeConnect quand tu dois calculer l'identifiant du client au moment de la connexion.

Au-delà du premier topic

La même structure à deux composants porte tous les autres protocoles du package.

Propriétés MQTT 5.0

Définis MQTTVersion et les objets de propriétés de requête et de réponse deviennent disponibles. Les propriétés utilisateur, les identifiants d'abonnement, les alias de topic et les codes de raison sont tous exposés.

Référence MQTT

AMQP, les deux versions

Deux clients distincts, 0.9.1 pour les échanges et files de type RabbitMQ, et 1.0 pour le protocole filaire plus récent. Les deux se rattachent à un client de la même manière que MQTT.

Référence AMQP 0.9.1 et référence AMQP 1.0

Kafka et STOMP

Un client natif du protocole filaire Kafka, et STOMP 1.0 à 1.2 avec des variantes spécifiques aux brokers pour RabbitMQ et ActiveMQ.

STOMP pour RabbitMQ et STOMP pour ActiveMQ

Dialoguer avec un broker cloud

AWS IoT et Azure IoT parlent tous deux MQTT, et la bibliothèque livre des composants dédiés qui gèrent pour toi leur signature et leur authentification.

Référence AWS IoT et référence Azure IoT

Référence, démos et documentation

Les pages de référence documentent chaque propriété et chaque événement. Les projets de démo sont livrés dans le téléchargement, sous Demos\02.WebSocket_Protocols.

Référence, client MQTT Chaque méthode, propriété et événement de TsgcWSPClient_MQTT.
Référence, AMQP 0.9.1 Échanges, files, liaisons et consommateurs.
Référence, AMQP 1.0 Liens, sessions et le modèle de message 1.0.
Page du composant TsgcWSPClient_MQTT Le client MQTT en détail, avec les six autres clients de protocole liés depuis celle-ci.
Aperçu des protocoles Comment les composants de sous-protocole se rattachent à un client ou à un serveur.
Aide en ligne La référence générée, toujours en phase avec la version actuelle.

Lectures associées : publier et attendre l'accusé de réception, les échanges et files AMQP et le client Kafka. Chaque produit a son propre démarrage rapide, listé sur la page de prise en main.

Questions sur le démarrage rapide de sgcMQ

Parce que le protocole et le transport sont deux préoccupations distinctes, et c'est ce qui permet au même client MQTT de fonctionner sur TCP simple ou sur WebSockets sans changer ton code. TsgcWSPClient_MQTT encode et décode les paquets MQTT. TsgcWebSocketClient ou TsgcTCPClient possède le socket, l'hôte, le port et les paramètres TLS. Une seule affectation les relie : MQTT.Client := WSClient;.
Définis Active := True sur le composant client, pas sur le protocole. La démo livrée fait exactement cela. Il existe aussi une méthode Connect sur le protocole, mais la démo ne l'utilise pas, et définir Active est le chemin que suit chaque exemple.
SGC_MQTT est défini à la ligne 717 de sgcVer.inc, dans le bloc SGC_EDT_STD qui va de la ligne 675 à la ligne 724. C'est l'édition Standard, le niveau payant le plus bas, et les blocs sont cumulatifs, donc toutes les éditions supérieures l'ont aussi. STOMP à la ligne 716, AMQP à la 718, AMQP 1.0 à la 719 et Kafka à la 720 sont tous dans le même bloc. Aucun des protocoles de messagerie n'est une fonctionnalité Enterprise.
OnMQTTPublish, dont la signature est procedure(Connection: TsgcWSConnection; aTopic, aText: String; PublishProperties: TsgcWSMQTTPUBLISHProperties). Il n'existe aucun événement nommé OnMQTTMessage. Quand tu as besoin des octets bruts ou de l'objet message complet plutôt que d'une chaîne, gère plutôt OnMQTTPublishEx.
Publish renvoie un Word, l'identifiant du paquet. La livraison est confirmée de façon asynchrone : en QoS 1 sur OnMQTTPubAck, en QoS 2 via OnMQTTPubRec, OnMQTTPubRel et OnMQTTPubComp. Si tu veux un appel qui bloque jusqu'à la confirmation du broker, utilise PublishAndWait, qui renvoie un Boolean et prend un délai d'expiration de dix secondes par défaut.
Le troisième paramètre de Publish est un TmqttQoS, déclaré dans sgcWebSocket_Types.pas avec les membres mtqsAtMostOnce, mtqsAtLeastOnce, mtqsExactlyOnce et mtqsReserved. Il vaut par défaut mtqsAtMostOnce. Subscribe prend le même type comme deuxième paramètre.
Oui. sgcWebSocket_Protocol_MQTT_Client.pas ne comporte aucune garde de plateforme au niveau de l'unité, la seule condition de sa clause uses est l'import de Windows, et le composant de palette est enregistré avec ComponentPlatforms(0), donc l'IDE ne restreint pas ses plateformes cibles.
Oui. Définis MQTTVersion sur le composant de protocole. Les objets de propriétés 5.0 entrent alors en jeu : ConnectProperties à l'aller, et le paramètre de propriétés de chaque événement au retour, par exemple TsgcWSMQTTCONNACKProperties sur OnMQTTConnect et TsgcWSMQTTPUBLISHProperties sur OnMQTTPublish.
Meilleur rapport qualité-prix : All-AccessTous les produits eSeGeCe, Support Premium inclus, à partir de €1,059/an.
Voir les tarifs All-Access

Prêt à placer un broker derrière ton application ?

Télécharge l'essai et lance la démo MQTT sur le broker de test public.