EMQX Dedicated New Feature: Event History is available for private beta test. →

MQTT Subscription Identifier の説明

EMQX Team
Dec 13, 2023
MQTT Subscription Identifier の説明

Subscription Identifier が必要なのはなぜですか?

MQTT クライアントのほとんどの実装では、コールバック メカニズムを使用して受信メッセージを処理します。

コールバック関数内では、メッセージのトピック名にのみアクセスできます。非ワイルドカード サブスクリプションの場合、サブスクリプション中に使用されるトピック フィルターは、メッセージ内のトピック名と同じになります。したがって、サブスクライブされたトピックとコールバック関数の間のマッピングを直接確立できます。その後、メッセージが到着すると、メッセージ内のトピック名に基づいて対応するコールバックを検索し、実行できます。

ただし、ワイルドカード サブスクリプションの場合、メッセージ内のトピック名は、サブスクリプション中に使用された元のトピック フィルターとは異なります。この場合、メッセージ内のトピック名と元のサブスクリプションを 1 つずつ照合して、どのコールバック関数を実行するかを決定する必要があります。これは明らかにクライアントの処理効率に影響を与えます。

MQTT Subscription

さらに、MQTT ではクライアントが複数のサブスクリプションを確立できるため、ワイルドカード サブスクリプションを使用すると、1 つのメッセージが複数のクライアント サブスクリプションと一致する可能性があります。

このような場合、MQTT を使用すると、サーバーは重複するサブスクリプションごとに個別のメッセージを送信したり、重複するすべてのサブスクリプションに対して 1 つのメッセージだけを送信したりできます。前者のオプションは、クライアントが複数の重複メッセージを受信することを意味します。

前者のオプションであるか後者のオプションであるかに関係なく、クライアントはメッセージの発信元のサブスクリプションを判断できません。たとえば、クライアントがメッセージが 2 つのサブスクリプションと一致することを発見した場合でも、サーバーがメッセージをクライアント自体に転送するときに両方のサブスクリプションが正常に作成されたことを保証できません。したがって、クライアントはメッセージに対して正しいコールバックをトリガーできません。

MQTT Subscription

Subscription Identifier はどのように機能しますか?

この問題に対処するために、MQTT 5.0 では Subscription Identifier が導入されました。その使用法は非常に簡単です。クライアントはサブスクライブ時に Subscription Identifier を指定でき、サーバーはサブスクリプションと Subscription Identifier の間のマッピング関係を保存する必要があります。PUBLISH パケットがサブスクリプションと一致し、クライアントに転送する必要がある場合、サーバーはサブスクリプションに関連付けられた Subscription Identifier を PUBLISH パケットとともにクライアントに返します。

Subscription Identifier

サーバーが重複するサブスクリプションに対して個別のメッセージを送信することを選択した場合、各 PUBLISH パケットにはサブスクリプションと一致するサブスクリプション ID が含まれている必要があります。サーバーが重複するサブスクリプションに対して 1 つのメッセージのみを送信することを選択した場合、PUBLISH パケットには複数のサブスクリプション ID が含まれます。

クライアントは、 Subscription Identifier とコールバック関数の間のマッピングを確立するだけで済みます。メッセージ内の Subscription Identifier を使用することにより、クライアントはメッセージの発信元のサブスクリプションと、どのコールバック関数を実行する必要があるかを決定できます。

MQTT Subscription

クライアントでは、 Subscription Identifier はセッション状態の一部ではなく、コンテンツとの関連付けは完全にクライアントによって決定されます。したがって、コールバック関数のほかに、 Subscription Identifier とサブスクライブされたトピックの間、または Subscription Identifier とクライアント ID の間のマッピングを確立することもできます。後者は、ゲートウェイがサーバーからメッセージを受信し、それらを適切なクライアントに転送する必要があるゲートウェイ シナリオで特に役立ちます。サブスクリプション ID を使用すると、ゲートウェイはトピックの再照合やルーティングを行わずに、どのクライアントがメッセージを受信すべきかを迅速に判断できます。

SUBSCRIBE パケットには、 Subscription Identifier を 1 つだけ含めることができます。SUBSCRIBE パケットに複数のサブスクリプションが含まれる場合、同じサブスクリプション ID がそれらすべてのサブスクリプションに関連付けられます。したがって、複数のサブスクリプションを同じコールバック関数に関連付けることが意図的であることを確認してください。

デモ

  1. Web ブラウザでMQTTX Webにアクセスします。

  2. MQTT over WebSocket接続を作成し、無料のパブリック MQTT サーバーに接続します。

    MQTT over WebSocket

  3. 接続が成功した後、トピックをサブスクライブmqttx_4299c767/home/+し、サブスクリプション ID を 1 に指定します。次に、トピックをサブスクライブしmqttx_4299c767/home/PM2_5、サブスクリプション ID を 2 に指定します。パブリック サーバーは多くの人が同時に使用できるため、トピックの競合を避けるために、トピックのプレフィックスとしてクライアント ID を使用します。

    New Subscription 1

    New Subscription 2

  4. サブスクリプションが成功すると、トピックにメッセージを公開しますmqttx_4299c767/home/PM2_5。現在のクライアントが 2 つのメッセージを受信し、メッセージ内のサブスクリプション ID がそれぞれ 1 と 2 であることがわかります。これは、EMQX の実装が重複するサブスクリプションに対して個別のメッセージを送信するためです。

    Receive MQTT Messages

  5. そして、トピックにメッセージをパブリッシュするとmqttx_4299c767/home/temperature、受信したメッセージの Subscription Identifier が 1 であることがわかります。

    image.png

MQTTXを介してサブスクリプションの Subscription Identifier を設定する方法を説明してきました。 Subscription Identifier に基づいてさまざまなコールバックをトリガーする方法についてまだ興味がある場合は、ここで Subscription Identifier の Python サンプル コードを入手できます。

無料トライアルEMQX Cloud
IoT向けフルマネージド型MQTTサービス
無料トライアル →

おすすめ閲読

Nov 28, 2023EMQX Team
Will Message の説明と使用例 ( Last Will 機能 & テスト) | MQTT 5 の仕様

Will Messageは、MQTTの重要な機能で、クライアントがオフラインになったことをサーバーだけが知る問題を解決します。これにより、予期せずオフラインになったクライアントに対して、適切なフォローアップアクションを取ることができます。