Skip to content

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

MQTTのトピック名は、メッセージルーティングに使用されるUTF-8エンコードされた文字列です。より柔軟な運用を可能にするために、MQTTは階層的なトピックネームスペースをサポートしています。トピックは通常、レベルごとに区切られ、スラッシュ / で区切られます(例:chat/room/1)。ワイルドカードサブスクリプションとは、トピックフィルターに1つ以上のワイルドカード文字を含むサブスクリプションのことで、複数のトピック名にマッチさせることができます。本ページでは、MQTTでサポートされている2種類のワイルドカードの使い方と、EMQXでワイルドカードを含むトピックをサブスクライブする方法を紹介します。

注意

ワイルドカードはサブスクライブ時のみ使用可能で、パブリッシュ時には使用できません。また、多数のクライアントでワイルドカードサブスクリプションを使用するとパフォーマンスに影響を与える可能性があるため避けてください

シングルレベルワイルドカード

+(U+002B)は、トピックの1レベルにのみマッチするワイルドカード文字です。シングルレベルワイルドカードはトピックフィルターの任意のレベルで使用でき、最初や最後のレベルでも可能です。使用する場合、そのレベル全体を占める必要があります。複数のレベルで使用可能で、マルチレベルワイルドカードと組み合わせて使うこともできます。以下はシングルレベルワイルドカードの使用例です。

"+" は有効
"sensor/+" は有効
"sensor/+/temperature" は有効
"sensor+" は無効(レベル全体を占めていない)

クライアントが sensor/+/temperature をサブスクライブすると、以下のトピックからのメッセージを受信します。

awk
sensor/1/temperature
sensor/2/temperature
...
sensor/n/temperature

ただし、以下のトピックにはマッチしません。

bash
sensor/temperature
sensor/bedroom/1/temperature

マルチレベルワイルドカード

#(U+0023)は、トピック内の任意の数のレベルにマッチするワイルドカード文字です。マルチレベルワイルドカードを使用する場合、そのレベル全体を占め、トピックの最後の文字でなければなりません。例:

pgsql
"#" は有効で、すべてのトピックにマッチ
"sensor/#" は有効
"sensor/bedroom#" は無効(+ または # はワイルドカードレベルとしてのみ使用可能)
"sensor/#/temperature" は無効(# は最後のレベルでなければならない)

クライアントが sensor/# をサブスクライブすると、以下のトピックからのメッセージを受信します。

pgsql
sensor
sensor/temperature
sensor/1/temperature

MQTTXクライアントでワイルドカードサブスクリプションを試す

このセクションでは、MQTTXクライアントを使ってワイルドカードトピックのサブスクリプションを作成する方法を示します。デモとして、1つのクライアント接続 Demo をパブリッシャーとしてメッセージをパブリッシュします。もう1つのクライアント接続をサブスクライバーとして作成し、以下のワイルドカードトピックをサブスクライブします。

  • testtopic/+/temperature
  • testtopic/#

前提条件

  1. EMQXとMQTTX Desktopを起動し、New Connectionをクリックしてパブリッシャー用のクライアント接続を作成します。

    • NameDemo と入力します。
    • Hostにローカルホスト 127.0.0.1 を入力します(本デモの例として)。
    • その他の設定はデフォルトのままにして、Connectをクリックします。

    TIP

    MQTT接続の作成方法については、MQTTX Desktopで詳しく説明しています。

    新しい接続の一般設定
  2. Connectionsペインの + をクリックし、サブスクライバー用の別の接続を作成します。NameSubscriber に設定します。

  3. ConnectionsSubscriber を選択し、+ New Subscriptionをクリックします。ポップアップダイアログで、Topicフィールドに testtopic/+/temperature と入力します。その他のオプションはデフォルトのままにします。

    ワイルドカードサブスクリプション1
  4. ConnectionsDemo を選択します。トピックフィールドに testtopic/room1/temperature と入力し、メッセージフィールドにペイロード 28 degree を入力します。送信ボタンをクリックします。同じペイロードでトピック testtopic/room2/temperature にもメッセージを送信します。

    ワイルドカードサブスクリプション2
  5. ConnectionsSubscriber を選択します。サブスクライバーがパブリッシャーから送信された異なるトピックの2つのメッセージを受信していることが確認できます。

    ワイルドカードサブスクリプション3
  6. + New Subscriptionをクリックします。ポップアップダイアログで、デフォルトのトピック testtopic/#Topicフィールドに使用します。その他のオプションはデフォルトのままにします。

  7. ConnectionsDemo を選択します。トピックフィールドに testtopic/bedroom/room1/temperature と入力し、メッセージフィールドにペイロード 28 degree を入力します。送信ボタンをクリックします。

  8. ConnectionsSubscriber を選択します。メッセージがサブスクリプション testtopic/# のみへ送信されていることが確認できます。

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