すべてのプロダクト
Search
ドキュメントセンター

IoT Platform:MQTT プロトコル

最終更新日:Mar 26, 2025

Message Queuing Telemetry Transport(MQTT)は、TCP/IP プロトコルスタックに基づく非同期通信プロトコルです。MQTT は、パブリッシュ/サブスクライブモデルでメッセージを送信するために使用される軽量プロトコルです。MQTT は、信頼性の低いネットワーク環境でスケーラブルです。MQTT は、デバイスハードウェアのストレージ容量またはネットワーク帯域幅が限られているシナリオに適しています。MQTT 経由で送信されるメッセージの送信者と受信者は、時間または空間によって制限されません。MQTT 経由でデバイスを IoT Platform に接続できます。

サポートされているバージョン

IoT Platform は、MQTT 経由のデバイス接続をサポートしています。サポートされている MQTT バージョンは、5.0、3.1.1、および 3.1 です。詳細については、「MQTT 5.0」、「MQTT 3.1.1」、および「MQTT 3.1」をご参照ください。

重要

MQTT 5.0 経由でデバイスを IoT Platform に接続するには、Enterprise Edition インスタンスを購入する必要があります。

IoT Platform ベースの MQTT と標準 MQTT の違い

  • PUB、SUB、PING、PONG、CONNECT、DISCONNECT、UNSUB などの MQTT メッセージをサポートしています。

  • クリーンセッションフラグをサポートしています。

  • will メッセージと retained メッセージはサポートしていません。

  • Quality of Service(QoS)0 メッセージと QoS 1 メッセージをサポートしており、QoS 2 メッセージはサポートしていません。

  • サブスクライバークライアントでの QoS 設定はサポートしていません。パブリッシャー クライアントによって指定された QoS のみがサポートされています。

  • ネイティブ MQTT Topic に基づく同期 Revert-Remote Procedure Call(RRPC)モードをサポートしています。サーバーはデバイスサービスを呼び出し、同時に応答を取得できます。

サポートされている MQTT 5.0 の機能

以前のバージョンと比較して、MQTT 5.0 はパフォーマンスとユーザーエクスペリエンスを向上させるための多くの新機能を提供しています。詳細については、「付録 C. MQTT 5.0 の新機能の概要」および「MQTT 5.0 の概要」をご参照ください。

IoT Platform は、MQTT 5.0 のいくつかの新機能をサポートしています。次の表に、これらの機能を示します。

サポートされている機能

参照

セッションの有効期限

  • デバイスが接続されているときに、クリーンスタート機能とセッションの有効期限の間隔を設定します。

    MqttConnectionOptions options = new MqttConnectionOptions();
    options.setCleanStart(true);
    options.setSessionExpiryInterval(60L);// 単位:秒。
    
    MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
    mqttClient.connect(options);
  • デバイスが切断されているときに、クリーンスタート機能とセッションの有効期限の間隔を設定します。

    MqttProperties mqttProperties = new MqttProperties();
    mqttProperties.setSessionExpiryInterval(60L);// 単位:秒。
    
    MqttAsyncClient mqttAsyncClient = new MqttAsyncClient(host, clientId, new MemoryPersistence());
    mqttAsyncClient.disconnect(30000, null, null, MqttReturnCode.RETURN_CODE_SUCCESS, mqttProperties);

メッセージの有効期限

デバイスがメッセージを送信するときに、メッセージの有効期限の間隔を指定します。

IntervalString content = "Hello World"; // メッセージ内容
byte[] payload = content.getBytes();

// メッセージを作成します。
MqttMessage message = new MqttMessage(payload);
// メッセージの QoS レベルを指定します。
message.setQos(1);

MqttProperties mqttProperties = new MqttProperties();

// メッセージの有効期限の間隔を指定します。
mqttProperties.setMessageExpiryInterval(600L);

message.setProperties(mqttProperties);

// Topic にメッセージをパブリッシュします。
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.publish(topic, message);

サブスクリプション オプション

サポートされているサブスクリプション パラメーター:

  • QoS: MQTT メッセージの QoS レベル。有効な値: 0(QoS 0 メッセージ)および 1(QoS 1 メッセージ)。

  • No Local: クライアントがパブリッシュしたメッセージを受信するかどうかを指定します。

    MQTT 3.1.1 を使用していて、クライアントがメッセージをパブリッシュする Topic をサブスクライブしている場合、クライアントはメッセージを受信します。MQTT 5.0 を使用する場合は、クライアントが Topic をサブスクライブするときに、このパラメーターを true に設定できます。この場合、クライアントは Topic にパブリッシュしたメッセージを受信しません。

    有効な値:

    • true: クライアントは、パブリッシュしたメッセージを受信しません。

    • false: クライアントは、パブリッシュしたメッセージを受信します。

  • Retain As Publish: サーバーがクライアントにメッセージを転送するときに、メッセージの RETAIN 識別子を保持するかどうかを指定します。

    有効な値:

    • true: メッセージに RETAIN 識別子が存在する場合、識別子は保持されます。RETAIN 識別子がメッセージに存在しない場合、この値は無効です。

    • false: メッセージに識別子が存在するかどうかに関係なく、RETAIN 識別子は保持されません。

    重要

    Retain As Publish パラメーターの値は、retained メッセージの RETAIN 識別子には影響しません。

  • Retain Handling: サーバーとクライアントの間にサブスクリプションが確立されたときに、サーバーが retained メッセージをクライアントに送信するかどうかを指定します。

    有効な値:

    • 0: サーバーとクライアントの間にサブスクリプションが確立されると、サーバーは retained メッセージを送信します。

    • 1: サーバーとクライアントの間に新しいサブスクリプションが確立されると、サーバーは retained メッセージを送信します。

    • 2: サーバーとクライアントの間にサブスクリプションが確立されているかどうかに関係なく、サーバーは retained メッセージをクライアントに送信しません。

MqttSubscription mqttSubscription = new MqttSubscription("aaa/bbb"); // サブスクライブする Topic

// QoS パラメーターを設定します。
mqttSubscription.setQos(1);

// No Local パラメーターを設定します。
mqttSubscription.setNoLocal(true);

// Retain As Published パラメーターを設定します。
mqttSubscription.setRetainAsPublished(true);

// Retain Handling パラメーターを設定します。
mqttSubscription.setRetainHandling(1);

MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.subscribe(new MqttSubscription[]{mqttSubscription});

Retained メッセージ

// retained メッセージを作成します。
String content = "Hello World"; // メッセージ内容
byte[] payload = content.getBytes();
MqttMessage message = new MqttMessage(payload);
// メッセージを retained メッセージとして指定します。
message.setRetained(true);

// Topic にメッセージをパブリッシュします。
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.publish(topic, message);

Will メッセージ

// Will メッセージを作成します。
String content = "Will Message"; // Will メッセージの内容
byte[] payload = content.getBytes();
MqttMessage message = new MqttMessage(payload);

MqttConnectionOptions options = new MqttConnectionOptions();
options.setUserName(USERNAME); // ユーザー名
options.setPassword(PASSWORD.getBytes()); // パスワード

// メッセージを Will メッセージとして指定します。
options.setWill(topic, message); // Will メッセージを送信する Topic

// Will メッセージのレイテンシを指定します。
MqttProperties willMessageProperties = new MqttProperties();
willMessageProperties.setWillDelayInterval(60L); // 遅延時間 (秒)
options.setWillMessageProperties(willMessageProperties);

// 接続を確立します。
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.connect(options);

接続確立時のフィードバック

MqttConnectionOptions connOpts = new MqttConnectionOptions();
connOpts.setMaximumPacketSize(1024L); // 最大パケットサイズを設定

ユーザープロパティ

MqttProperties properties = new MqttProperties();
List<UserProperty> userPropertys = new ArrayList<>();
userPropertys.add(new UserProperty("key1","value1")); // ユーザープロパティを追加
properties.setUserProperties(userPropertys);

デバイスが MQTT 5.0 経由で IoT Platform に接続されると、送信された [UserProperty] パラメーターを IoT Platform ログで表示できます。

重要

最大 20 個のプロパティを追加できます。プロパティのキーはアンダースコア(_)で始めることはできません。キーと値の合計の長さは 128 文字を超えることはできません。

リクエスト-レスポンス パターン

たとえば、リクエスターがデバイスで、レスポンダーがビジネスサーバーであるとします。Advanced Message Queuing Protocol (AMQP) サブスクリプションまたはデータ転送機能を使用した後、メッセージのプロパティデータから ResponseTopic パラメーターと CorrelationData パラメーターを解析できます。その後、Pub 操作を呼び出して、デバイスに応答を送信できます。

MqttProperties properties = new MqttProperties();
properties.setCorrelationData("requestId12345".getBytes()); // 相関データ
properties.setResponseTopic("/" + productKey + "/" + deviceName + "/user/get"); // レスポンス Topic
重要
  • CorrelationData パラメーターの解析された値は、デバイスによって送信されたバイト配列に Base64 デコードする必要があります。

  • ResponseTopic パラメーターまたは CorrelationData パラメーターの値の長さは、128 文字を超えることはできません。

エラーコードの機能強化

詳細については、「トラブルシューティング」をご参照ください。

Topic エイリアス

N/A

共有サブスクリプション

共有サブスクリプション Topic は、$share/${ShareName}/${filter} 形式です。

  • $share: 固定項目。各共有サブスクリプション Topic の名前は $share で始まります。

  • ${ShareName}: 文字、数字、およびアンダースコア(_)のみを含むことができる文字列。

    ${ShareName} は、サブスクリプションを共有するセッションのグループを指定します。共有サブスクリプションに一致する各メッセージは、1 つのセッションのみに送信されます。

  • ${filter}: 非共有サブスクリプションの Topic フィルター。値には、文字、数字、およびアンダースコア(_)を含めることができます。

例:

MqttConnectionOptions options = new MqttConnectionOptions();
options.setUserName(username); // ユーザー名
options.setPassword(password); // パスワード

MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.connect(options);

mqttClient.subscribe("$share/testGroup/user/post", 1); // 共有サブスクリプションにサブスクライブ

セキュリティレベル

  • 暗号化された Transport Layer Security (TLS) 接続: 高いセキュリティ。

    重要
    • TLS 1.0、1.1、1.2、および 1.3 がサポートされています。暗号化には TLS 1.2 または 1.3 を使用することをお勧めします。TLS 1.0 および 1.1 は以前のバージョンであり、セキュリティリスクが生じる可能性があります。

    • Link SDK は TLS 1.2 および TSL 1.3 で設定されています。Link SDK を使用する場合は、TLS プロトコルを設定する必要はありません。

  • 暗号化されていない Transport Layer Security (TLS) 接続: 低いセキュリティ。この機能はまもなく廃止される予定です。この機能を使用しないことをお勧めします。

    重要

    暗号化されていない TLS 接続を使用する場合は、接続によって発生する可能性のあるデータ漏洩のリスクとそれに対応する結果を理解していることを確認してください。

Topic の仕様

Topic を定義および分類する方法の詳細については、「Topic」をご参照ください。

IoT Platform コンソール の [デバイスの詳細] ページでシステム Topic を表示できます。機能固有の Topic については、特定の機能のドキュメントを参照してください。

制限

デバイスを登録した後、IoT Platform にデバイスを接続するために使用できるプロトコルは 1 つだけです。同じデバイスに複数のプロトコルを使用することはできません。

使用上の注意

IoT Platform は、さまざまなデバイス SDK を提供しています。デバイス SDK を使用して、MQTT 経由でデバイスを IoT Platform に接続できます。Link SDK の入手方法の詳細については、「Link SDK をダウンロードする」をご参照ください。

さまざまな通信プロトコルを使用してデバイスと IoT Platform 間の MQTT 通信を有効にする方法の詳細については、以下のトピックを参照してください。