Delphi MQTT クライアント — あらゆる MQTT 3.1 / 5.0 ブローカーに接続

Delphi と C++Builder 向けのネイティブ MQTT 3.1.1 および MQTT 5.0 クライアントコンポーネント。発行、購読、retained メッセージ、last will、QoS 0/1/2、TLS、共有購読、完全な MQTT 5 プロパティ面 — HiveMQ、Mosquitto、EMQX、AWS IoT Core、Azure IoT Hub に対して検証済み。

Pascal 向けの第一級 MQTT クライアント

MQTT は IoT、テレメトリ、モバイルプッシュ、コネクテッドビークルのデファクトメッセージングプロトコルです。フレーミングのバイトを 1 つも書かずに Delphi コードベースにそれをもたらしてください。

Delphi MQTT クライアントにより、VCL または FMX アプリケーションが OASIS MQTT プロトコル — 制約あるデバイスと低帯域・高レイテンシのネットワーク向けに設計された軽量 publish/subscribe プロトコル — を話せるようになります。sgcWebSockets では、Delphi 7 から Delphi 13 まで、すべての Embarcadero ターゲットプラットフォーム(Win32、Win64、Linux64、macOS、iOS、Android)で動作する単一の非可視コンポーネント TsgcWSPClient_MQTT として、完全なクライアント面を入手できます。

コンポーネントは同じコードパスで主要な MQTT バージョンを両方実装します: 長らくデプロイされている MQTT 3.1.1(OASIS 標準、2014 年以来ほぼすべての IoT ブローカーで使用)と、モダンな MQTT 5.0(トピックエイリアス、セッション期限、ユーザープロパティ、強化された認証、リクエスト/レスポンス、共有購読を備える)。単一のプロパティ — Version — がそれらを切り替えます。

コンポーネントクラス

TsgcWSPClient_MQTT

トランスポート

ネイティブ TCP(1883 / 8883)、WebSocket(80 / 443)、OpenSSL または SChannel 経由の TLS

バージョン

MQTT 3.1.1 と MQTT 5.0

プラットフォーム

Windows、macOS、Linux、iOS、Android、.NET

テストするすべての MQTT ブローカーで動作

仕様準拠クライアントは原則としてブローカー非依存ですが — 実世界のブローカーには癖があります。各リリースを顧客が実際にデプロイするブローカーに対してテストします。

HiveMQ と HiveMQ Cloud

完全な MQTT 5 プロパティ面、共有購読、強化された認証、HiveMQ Cluster。無料の Cloud ティアは、コンポーネントをエンド・ツー・エンドで試す最も簡単な方法です。

Eclipse Mosquitto

リファレンスオープンソースブローカー。docker run -p 1883:1883 eclipse-mosquitto でローカル実行し、30 秒で開発ターゲットが用意できます。

EMQX

ルールエンジン、Kafka ブリッジ、共有購読を備えた、巨大スケールの Erlang ブローカー。数百万接続で本番運用可能。

AWS IoT Core

X.509 クライアント証明書、443 上の ALPN ネゴシエート MQTT、SigV4 署名済み WebSocket、AWS IoT ブローカークォータ。専用の AWS IoT Core ページを参照。

Azure IoT Hub

デバイス SAS トークン、ツイン/ダイレクトメソッドトピック、DPS プロビジョニング。専用の Azure IoT Hub ページを参照。

Google Cloud IoT

ポート 8883 での JWT ベースのデバイス認証。コンポーネントは自動的に JWT を生成・ローテーションします。

RabbitMQ Web-MQTT

ポート 15675 上の RabbitMQ Web-MQTT プラグイン — 単一の TLS ポート上でブラウザと Delphi クライアントに対する同じブローカー。

VerneMQ、ActiveMQ、Artemis

すべて統合テストスイートをパス。AMQP / STOMP / JMS とのマルチプロトコル共存が無料。

QoS、retained、will、TLS — 完全な面

あらゆるワイヤーレベルの MQTT 機能がプロパティ、メソッド、イベントとして公開されます — 隠されたものは何もありません。

Quality of Service 0/1/2

Fire-and-forget(QoS 0)、PUBACK 付きの at-least-once(QoS 1)、4-way ハンドシェイク PUBREC → PUBREL → PUBCOMP(QoS 2)の exactly-once。Publish() 呼び出しごとに選択。

Retained メッセージ

発行を retained としてマークすると、ブローカーは将来の購読者に最後の既知の値を配信します — 「現在の状態」トピックの標準パターン。

Last Will & Testament

LastWillTestament は、クライアントが優雅でなく切断した場合にブローカーが発行するトピック + ペイロードを登録します — 標準のデバイスオフラインシグナル。

Clean / persistent セッション

CleanSession が false の場合、購読と未配信の QoS 1/2 メッセージが再接続をまたいで永続化されます — 断続的な接続性をデータを失わずにブリッジ。

TLS と mTLS

OpenSSL または SChannel での 8883 上 MQTTS。ディスク、Windows 証明書ストア、PKCS#12 バンドル、ハードウェアトークンから証明書を読み込み。

WebSocket トランスポート

コンポーネントを TsgcWebSocketClient にプラグして、ポート 443 上の WSS 経由で MQTT を実行 — あらゆる HTTP 対応ロードバランサーや企業プロキシを通過。

MQTT 5 プロパティ

セッション期限、receive maximum、maximum packet size、トピックエイリアス最大、ユーザープロパティ、レスポンス情報 — すべての CONNECT / PUBLISH / SUBSCRIBE / DISCONNECT で。

共有購読

$share/<group>/<topic> がワーカーのプールに受信メッセージをラウンドロビンします — 無料の水平スケールアウト。

WatchDog 再接続

指数バックオフでの自動再接続。購読とキューに入った QoS 1/2 発行は再開時にリプレイされます。

ゼロから publish/subscribe ループへ

コンポーネントをドロップし、2 つのイベントを結線し、Active を設定。

uses
  sgcWebSocket, sgcWebSocket_Protocol_MQTT_Client,
  sgcWebSocket_Protocol_MQTT_Message;

var
  WSClient: TsgcWebSocketClient;
  MQTT: TsgcWSPClient_MQTT;
begin
  WSClient := TsgcWebSocketClient.Create(nil);
  WSClient.Host := 'broker.hivemq.com';
  WSClient.Port := 1883;
  WSClient.WatchDog.Enabled := True;

  MQTT := TsgcWSPClient_MQTT.Create(nil);
  MQTT.Client  := WSClient;
  MQTT.Version := mqtt50;
  MQTT.LastWillTestament.Enabled := True;
  MQTT.LastWillTestament.Topic   := 'devices/sensor-01/status';
  MQTT.LastWillTestament.Message := 'offline';
  MQTT.LastWillTestament.QoS     := mtqsAtLeastOnce;
  MQTT.LastWillTestament.Retain  := True;

  MQTT.OnMQTTConnect := MQTTConnect;
  MQTT.OnMQTTPublish := MQTTPublish;

  WSClient.Active := True;
end;

procedure TForm1.MQTTConnect(Connection: TsgcWSConnection;
  const Session: Boolean; const ReasonCode: Integer;
  const ReasonName: string;
  const ConnectProperties: TsgcWSMQTTCONNACKProperties);
begin
  MQTT.Subscribe('sensors/+/temperature', mtqsAtLeastOnce);

  // Retained “online” message
  MQTT.Publish('devices/sensor-01/status',
    'online', mtqsAtLeastOnce, True);
end;

procedure TForm1.MQTTPublish(Connection: TsgcWSConnection;
  aTopic, aText: string;
  PublishProperties: TsgcWSMQTTPublishProperties);
begin
  Memo1.Lines.Add(aTopic + ' = ' + aText);
end;

認証とトランスポートセキュリティ

4 つすべてのブローカー認証パターンが標準でサポートされます: シンプルなユーザー名/パスワード(CONNECT パケット内で送信)、X.509 クライアント証明書(mTLS)、JWT(Google Cloud IoT、カスタムブローカー)、SAS トークン(Azure IoT Hub)。MQTT 5 強化認証は、SCRAM スタイルのチャレンジ/レスポンスフロー向けに OnMQTTAuth 経由で AUTH パケットを公開します。

トランスポートでは、ネイティブ MQTT-over-TCP を標準の 1883(平文)または 8883(TLS)ポートで実行するか、MQTT を WebSocket(Client プロパティは任意の TsgcWebSocketClient を受け付け)でトンネルして、厳格な HTTP 専用ファイアウォールや CDN エッジを越えてください。両オプションとも同じコンポーネントと同じイベントを使用します。

sgcWebSockets での MQTT 詳細

MQTT プロトコルページ

TsgcWSPClient_MQTT の完全リファレンス — プロパティ、メソッド、イベント、すべてのサブプロトコル機能。

クラウド IoT ブローカー

AWS IoT Core、Azure IoT Hub、Google Cloud IoT の専用ページ。

リアルタイムピッカー

WebSocket、SSE、AMQP、HTTP/2 push よりも MQTT をいつ選ぶか。

ブログ: MQTT 上のリクエスト/レスポンス

非同期 RPC のための MQTT 5 ResponseTopic + CorrelationData の使用。

ブログ: SigV4 付き AWS IoT

AWS IoT Core に対する署名済み WebSocket 認証。

ブログ: AWS IoT カスタム認証

AWS IoT カスタムオーソライザー経由のトークンベース認証。

5 分で publish を開始

トライアルを入手し、broker.hivemq.com:1883 を指して同梱のデモプロジェクトを実行してください。