MQTT プロトコル

Delphi、C++Builder、.NET 向けのネイティブ MQTT 3.1.1 および MQTT 5.0 クライアントです。WebSocket または raw TCP 上のパブリッシュ/サブスクライブメッセージングを、QoS 0/1/2、保持メッセージ、Last Will、トピックエイリアス、共有サブスクリプションとともに提供します。

MQTT サブプロトコルクライアント

Delphi / .NET ランタイムが動作するあらゆる環境 — デスクトップサービスからモバイルデバイスまで — で実行できる第一級の MQTT 実装であり、標準準拠のあらゆる MQTT ブローカーと通信します。

コンポーネントクラス

TsgcWSPClient_MQTT

標準仕様

MQTT 3.1.1 & MQTT 5.0

プラットフォーム

Windows, macOS, Linux, iOS, Android

エディション

Standard / Professional / Enterprise

MQTT 3.1.1 & 5.0 のフルサーフェス

単なるパブリッシュ/サブスクライブにとどまらず、MQTT のワイヤレベル機能をすべて網羅しています。

QoS 0、1 & 2

Fire-and-forget、at-least-once、exactly-once の配信に対応します。QoS 2 の 4 ウェイハンドシェイク(PUBLISH → PUBREC → PUBREL → PUBCOMP)はイベント経由で完全に公開されており、リトライや監査ロジックを実装できます。

WebSocket または raw TCP

Client プロパティを TsgcWebSocketClient に接続すれば MQTT を WebSocket 上で実行でき、ポート 1883 / 8883 のネイティブ MQTT TCP トランスポートも使用できます — 同じコンポーネント、同じ API です。

保持メッセージ

publication を retained としてマークすれば、ブローカーは最後に既知の値を将来のすべてのサブスクライバーに配信します。Publish の呼び出しごとに retain を設定/解除できます。

Last Will & Testament

LastWillTestament は、クライアントが正常に切断されなかった場合にブローカーが発行するトピック+ペイロードを登録します — デバイスのオフラインイベントを通知する標準的な方法です。

ワイルドカードサブスクリプション

+(単一レベル)および #(複数レベル)のワイルドカードを用いたトピックフィルター: sensors/+/temperaturedevices/# など。

MQTT 5 プロパティ

セッション有効期限、receive maximum、最大パケットサイズ、トピックエイリアス最大値、リクエスト応答情報、ユーザープロパティ — すべて ConnectPropertiesPublishPropertiesSubscribeProperties 経由でアクセスできます。

トピックエイリアス

MQTT 5 ではクライアント(およびブローカー)が、繰り返し発行されるメッセージの長いトピック名を 2 バイト整数のエイリアスに置き換えられます — 高頻度なテレメトリストリームで大きな帯域削減になります。

共有サブスクリプション

MQTT 5 の $share/<group>/<topic> は、受信メッセージをサブスクライバーグループ間でラウンドロビン分配します — 水平方向のワーカープールを構築する基盤です。

リクエスト/レスポンス

MQTT 5 の ResponseTopic および CorrelationData プロパティは、追加のフレーミングなしでパブサブを非同期 RPC に変えます — イベントに組み込まれています。

拡張認証

MQTT 5 の AUTH パケットと AuthenticationMethod / AuthenticationData による SCRAM 形式のチャレンジに対応します — Auth を呼び出し、OnMQTTAuth を処理します。

キープアライブ & WatchDog

HeartBeat は調整可能な間隔で PINGREQ を送信します。WatchDog は指数バックオフで自動再接続し、サブスクリプションを再開します。

OpenSSL または SChannel による TLS

ポート 8883 で MQTTS(raw TCP+TLS)、または 443 で WSS をクライアント証明書付きで実行できます。TLSOptions.IOHandler で OpenSSL(クロスプラットフォーム)または SChannel(Windows カーネル TLS)を選択します。

MQTT が真価を発揮する場面

軽量なフレーミング、低オーバーヘッド、ステートフルセッションにより、MQTT は以下のシナリオで定番の選択肢となります。

IoT テレメトリ

センサーはキープアライブされた MQTT セッション上で、温度、振動、GPS、バッテリーの計測値をストリーミングします — LTE/Cat-M/NB-IoT のような不安定な回線でも安定して動作します。

コネクテッドビークル & フリート

フリートトラッカー、OBD ゲートウェイ、EV 充電ステーション向けの QoS 1 双方向コマンドチャネル — 再接続して publication を失うことなく再開できます。

産業用 / SCADA

OPC-UA のポーリングをイベント駆動のパブリッシュ/サブスクライブに置き換えます。トピックエイリアスと共有サブスクリプションにより、数千の PLC やフィールドデバイスまでスケールします。

スマートホーム & スマートビル

照明、HVAC、錠、在室センサーが Mosquitto や Home Assistant 経由で通信します — Delphi クライアントは任意の組み込みノードと同じくらい簡単に統合できます。

クラウド IoT プラットフォーム

同一のコンポーネントが AWS IoT CoreAzure IoT Hub、Google Cloud IoT、IBM Watson、HiveMQ Cloud、EMQX と通信します — X.509 クライアント証明書や SAS トークンに対応します。

Web / ブラウザダッシュボード

RabbitMQ Web-MQTT(ポート 15675)上の MQTT-over-WebSocket により、同じブローカーが単一の TLS ポート経由で Delphi クライアントと JS ダッシュボードの両方にプッシュできます。

モバイルプッシュ & プレゼンス

iOS/Android 上の長寿命 MQTT セッションと Last Will により、ベンダー固有のプロバイダーに依存せずプレゼンスと軽量プッシュを実現できます。

マイクロサービスのファンアウト

中央ブローカーを介してプロデューサーとコンシューマーを疎結合化します。共有サブスクリプションにより、Delphi ワーカーサービスのプール全体に作業をラウンドロビン分配できます。

主要な MQTT ブローカーすべてに対応

仕様準拠のクライアント — お客様が実際にデプロイしているブローカーで検証済みです。

AWS IoT Core

X.509 クライアント証明書、WebSocket 上の SigV4、AWS IoT ブローカークォータに対応します。専用の AWS IoT ページをご覧ください。

Azure IoT Hub

デバイス SAS トークン、twin/method トピック、DPS プロビジョニングに対応します。Azure IoT Hub ページをご覧ください。

HiveMQ & HiveMQ Cloud

MQTT 5 プロパティのフルサーフェス、共有サブスクリプション、拡張認証、HiveMQ Cluster に対応します。

Mosquitto

リファレンスとなるオープンソースのブローカーです — MQTT 3.1.1 と 5.0 を、TCP または WebSocket 経由でサポートします。

EMQX

共有サブスクリプション、ルールエンジン、Kafka へのブリッジを備えた大規模スケーラブルなブローカーです。ドロップインで利用できます。

RabbitMQ Web-MQTT

ポート 15675 の MQTT-over-WebSocket プラグイン — ブラウザと Delphi のダッシュボードを組み合わせる標準的な構成です。

VerneMQ

Erlang/OTP 上に構築されたクラスター型 MQTT ブローカー — MQTT 3.1.1 と 5.0 のいずれもテストスイートに合格しています。

ActiveMQ & Artemis

Apache ActiveMQ の組み込み MQTT リスナーと Artemis ブローカー — AMQP、STOMP、JMS とのマルチプロトコル共存に対応します。

コンポーネントを配置し、いくつかのプロパティを設定するだけ

TsgcWebSocketClient と TsgcWSPClient_MQTT を組み合わせ、OnMQTTConnect / OnMQTTPublish を接続したうえで、Subscribe と Publish を呼び出します。

uses
  sgcWebSocket, sgcWebSocket_Protocol_MQTT_Client,
  sgcWebSocket_Protocol_MQTT_Message;

var
  WSClient: TsgcWebSocketClient;
  MQTT: TsgcWSPClient_MQTT;
begin
  WSClient := TsgcWebSocketClient.Create(nil);
  WSClient.Host := 'www.esegece.com';
  WSClient.Port := 15675;

  MQTT := TsgcWSPClient_MQTT.Create(nil);
  MQTT.Client := WSClient;
  MQTT.Authentication.Enabled  := True;
  MQTT.Authentication.UserName := 'sgc';
  MQTT.Authentication.Password := 'sgc';

  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/#');
end;

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

// 保持された QoS 1 メッセージをパブリッシュ
MQTT.Publish('sensors/temperature/room1',
  '{"value":22.5,"unit":"C"}', mtqsAtLeastOnce, True);
// uses: sgcWebSocket, sgcWebSocket_Protocol_MQTT_Client
TsgcWebSocketClient *WSClient = new TsgcWebSocketClient(this);
WSClient->Host = "www.esegece.com";
WSClient->Port = 15675;

TsgcWSPClient_MQTT *MQTT = new TsgcWSPClient_MQTT(this);
MQTT->Client = WSClient;
MQTT->Authentication->Enabled  = true;
MQTT->Authentication->UserName = "sgc";
MQTT->Authentication->Password = "sgc";

MQTT->OnMQTTConnect = MQTTConnect;
MQTT->OnMQTTPublish = MQTTPublish;

WSClient->Active = true;

void __fastcall TForm1::MQTTPublish(TsgcWSConnection *Connection,
    UnicodeString aTopic, UnicodeString aText,
    TsgcWSMQTTPublishProperties PublishProperties)
{
  Memo1->Lines->Add(aTopic + ": " + aText);
}

MQTT->Publish("sensors/temperature/room1",
  "{\"value\":22.5,\"unit\":\"C\"}", mtqsAtLeastOnce, true);
using esegece.sgcWebSockets;

var WSClient = new TsgcWebSocketClient();
WSClient.Options.Parameters = "/ws";

var MQTT = new TsgcWSPClient_MQTT();
MQTT.Client = WSClient;
MQTT.Authentication.Enabled  = true;
MQTT.Authentication.UserName = "sgc";
MQTT.Authentication.Password = "sgc";
MQTT.HeartBeat.Enabled  = true;
MQTT.HeartBeat.Interval = 5;

MQTT.OnMQTTConnect += (conn, session, code, name, props) => MQTT.Subscribe("sensors/temperature/#");
MQTT.OnMQTTPublish += (conn, topic, text, props) => Console.WriteLine(topic + ": " + text);

WSClient.Host = "www.esegece.com";
WSClient.Port = 15675;
WSClient.Active = true;

MQTT.Publish("sensors/temperature/room1",
  "{\"value\":22.5,\"unit\":\"C\"}", TmqttQoS.mtqsAtLeastOnce, true);

仕様 & 参考資料

このコンポーネントが実装するプロトコルの一次情報源です。

ドキュメント & デモ

コンポーネントリファレンスへのディープリンク、すぐに実行できるデモプロジェクト、そして体験版をダウンロードできます。

オンラインヘルプ — Protocol_MQTT このコンポーネントのプロパティ、メソッド、イベントの完全なリファレンスです。
デモプロジェクト — Demos\Protocols\MQTT すぐに実行できるサンプルプロジェクトです。sgcWebSockets パッケージに同梱されています — 下記から体験版をダウンロードしてください。
技術ドキュメント (PDF) 機能、クイックスタート、Delphi、C++ Builder、.NET のコードサンプル、および一次情報源への参照を、このコンポーネントに絞ってまとめています。
ユーザーマニュアル (PDF) ライブラリ内のすべてのコンポーネントを網羅した包括的なマニュアルです。

MQTT を始める準備はできましたか?

無料体験版をダウンロードして、IoT メッセージングソリューションの構築を数分で始めましょう。