Qt MQTT 概要
Qt MQTT MQテレメトリトランスポート(MQTT)プロトコルを介して通信できるアプリケーションやデバイスを作成できます。MQTTプロトコル仕様に完全に準拠しています。
パブリッシュとサブスクライブ
MQTTは、パブリッシュ・アンド・サブスクライブモデルに基づいて動作する、マシン間接続プロトコルです。 MQTT クライアントとは、MQTT を使用して MQTT サーバー(ブローカーとも呼ばれる)へのネットワーク接続を確立するプログラムまたはデバイスのことです。接続が確立されると、クライアントはブローカーにメッセージを送信できるようになります。他のクライアントは、そのクライアントから送信される特定のトピックに関する通知を購読することができます。

たとえば、クライアント2が トピックAのメッセージを購読している場合、クライアント1がそのトピックでメッセージを送信すると、クライアント2は通知を受け取ります。クライアント3が トピックAと トピックBの両方を購読している場合、その両方のトピックに関するメッセージの通知を受け取ります。
Qt MQTT は、ブローカーを含まないクライアントソリューションです。これは、組み込みデバイス向けのテレメトリアプリケーションの開発に特に適しています。ただし、Qt MQTT には外部依存関係がないため、実装されたクライアントは、サポートされているすべてのQtプラットフォーム上で実行可能です。
トピック
トピックは階層的なツリー構造で格納されます。この標準では、ツリーの設計方法や事前定義された階層セットは規定されていません。プロジェクトの要件に応じて、階層を自由に設計できます。以下はトピック階層の例です。ここで、「active」はすべてのアクティブなセンサーを意味し、「house」と「garage」は個別のセンサーを表します:
sensors/active
sensors/house/temperature
sensors/house/bedroom/light
sensors/house/livingroom/light
sensors/garage/temperature
sensors/garage/lightワイルドカードを使用したトピックの購読
クライアントがトピックを購読する際、ハッシュ記号(#)とプラス記号(+)をワイルドカードとして使用できます。ハッシュ記号は、クライアントがトピックおよびそのサブトピック上のすべてのメッセージに関する通知を受け取りたいことを示します。たとえば、クライアントがsensors/house/# を購読した場合、houseセンサーに関するすべてのメッセージを受信します。
プラス記号は、一致するサブトピックを検索する際に、ツリー上の分岐をスキップできることを示します。たとえば、クライアントがsensors/+/temperature を購読すると、どのセンサーから送信されたかに関係なく、温度に関するメッセージを受信します。 複数のプラス記号を使用することで、複数の分岐をスキップできます。例えば、「house/+/+/temperature」を使用すると、ある家にあるすべてのアパートのすべての部屋の温度に関するメッセージを受信できます。
共有サブスクリプション
共有サブスクリプションとは、1つのトピックフィルターに対するサブスクライバーのプールを指します。すべてのサブスクライバーがメッセージを受信するのではなく、1人のサブスクライバーのみがメッセージを受信します。これにより、複数のクライアント間での負荷分散が可能になります。共有サブスクリプションの形式は次のとおりです。
$share/{sharename}/{topicfilter}たとえば、クライアント 1とクライアント 2がトピック `sensors/house/temperature` へのサブスクリプションを共有する場合、サブスクライブするトピックフィルターは次のようになります:
$share/poolAB/sensors/house/temperatureメッセージがサーバーによってどの順序で配信されるかは定義されていません。これはサーバー固有のオプションです。
サーバーが共有サブスクリプションをサポートしているかどうかを確認するには、QMqttServerConnectionProperties::sharedSubscriptionSupported() も参照してください。
トピックのエイリアス
トピックをツリー構造で整理することで、データチャネルを分離し、情報の論理的な順序を確保できます。しかし、これによりメッセージのパブリッシュ時に非常に長いトピック名が使用されることになり、各メッセージのサイズが増大する可能性があります。
MQTT 5.0 プロトコルバージョンでは、この問題を回避するためにトピックエイリアスが導入されました。トピック文字列の代わりに、整数値が送信されます。クライアントとサーバー間の初期マッピングを作成するには、メッセージにトピック文字列とエイリアスの両方を含める必要があります。その後は、トピックを空にした ID のみが使用されます。
このマッピングは、トピックエイリアスと別のトピック文字列を使用することで、いつでも変更可能です。なお、このマッピングは、サーバーから他のクライアントへの接続など、他の接続には必ずしも適用されるわけではない点に注意してください。各接続において、このマッピングを手動で作成する必要があります。
Qt MQTT は、データ転送量を削減するための自動化されたメカニズムを提供します。QMqttClient が接続を確立した後、サーバーがサポートするトピックエイリアスに関する情報が保存されます。その後、利用可能なすべてのエイリアスが使用されるまで、メッセージがパブリッシュされる順序でトピックエイリアスが使用されます。ユーザーは、パブリッシュ時にQMqttPublishProperties::setTopicAlias()を使用することで、いつでもこのマッピングを変更できます。
QMqttClient がトピックを購読する際、クライアントによって設定されたQMqttConnectionProperties::maximumTopicAlias()の値に応じて、サーバー側でもトピックエイリアスを使用できます。クライアントは自動的にトピックエイリアスをマッピングし、完全なトピック文字列を含めたメッセージを透過的にユーザーに転送します。
セキュリティ
クライアントとブローカー間の接続は、ユーザー名とパスワードを使用する組み込みの認証システムによって保護されています。メッセージは、トランスポート層で SSL/TLS を使用して暗号化されます。暗号化された MQTT メッセージの標準ポート番号は 8883 です。
サービス品質
メッセージに対しては、以下のサービス品質(QoS)レベルが定義されています:
- 「最大1回(0)」とは、メッセージが動作環境のベストエフォートに基づいて配信されることを意味し、そのためメッセージの損失が発生する可能性があります。このレベルは、例えば、個々の測定値が失われても次の測定値がすぐに公開されるため問題にならない、環境センサーデータなどで使用できます。
- 「少なくとも1回(1)」とは、メッセージの到着が保証されるが、重複が発生する可能性があることを意味します。
- 「正確に1回(2)」とは、メッセージが正確に1回だけ確実に届くことを意味します。このレベルは、例えば、メッセージの重複や紛失が誤った課金につながる可能性がある課金システムなどで使用できます。
ウィルメッセージ
「ウィルメッセージ」(testamentとも呼ばれる)とは、クライアントから送信され、ブローカーの場所に保存されるメッセージのことです。クライアントとブローカー間の接続が予期せぬ形で切断された場合、ウィルメッセージは「ウィルトピック」のすべてのサブスクライバーに転送されます。
ウィルメッセージは、接続時に指定する必要があります。したがって、QMqttClient::connectToHost() またはQMqttClient::connectToHostEncrypted() を呼び出す前に設定することが必須です。ウィルメッセージは、通常のメッセージのすべてのプロパティに加え、ウィルトピック、QoSレベル、保持フラグ、およびメッセージペイロードを持ちます。
クライアントがQMqttClient::disconnectFromHost() を呼び出して通常の方法でブローカーから切断した場合、ブローカーは Will メッセージを破棄します。必要に応じて、クライアントは切断前に必要なすべてのメッセージを送信する責任を負います。
リテインメッセージ
リテインされたメッセージはブローカー側に保存されます。今後クライアントが接続すると、そのようなメッセージを受信することになります。典型的なユースケースとして、パブリッシャーの現在の健全性ステータスをリテインされたメッセージに保存することが挙げられます。サブスクライバーは、そのステータスに関するメッセージを即座に受信します。
ブローカーは、指定されたトピックに対して送信されたリテインド・メッセージのうち、最新のメッセージのみを保存できます。クライアントが QoS レベル 0 のリテインド・メッセージをパブリッシュした場合、そのトピックに関してブローカーに保存されていた以前のリテインド・メッセージはすべて破棄されなければなりません。ブローカーは最新のメッセージを保存すべきですが、破棄することもあります。これはブローカーの実装によって異なります。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.