ワイルドカードサブスクリプション
MQTTのトピック名は、メッセージルーティングに使用されるUTF-8エンコードされた文字列です。より柔軟な運用を可能にするために、MQTTは階層的なトピックネームスペースをサポートしています。トピックは通常、レベルごとに区切られ、スラッシュ /
で区切られます(例:chat/room/1
)。ワイルドカードサブスクリプションとは、トピックフィルターに1つ以上のワイルドカード文字を含むサブスクリプションのことで、複数のトピック名にマッチさせることができます。本ページでは、MQTTでサポートされている2種類のワイルドカードの使い方と、EMQXでワイルドカードを含むトピックをサブスクライブする方法を紹介します。
注意
ワイルドカードはサブスクライブ時のみ使用可能で、パブリッシュ時には使用できません。また、多数のクライアントでワイルドカードサブスクリプションを使用するとパフォーマンスに影響を与える可能性があるため避けてください。
シングルレベルワイルドカード
+
(U+002B)は、トピックの1レベルにのみマッチするワイルドカード文字です。シングルレベルワイルドカードはトピックフィルターの任意のレベルで使用でき、最初や最後のレベルでも可能です。使用する場合、そのレベル全体を占める必要があります。複数のレベルで使用可能で、マルチレベルワイルドカードと組み合わせて使うこともできます。以下はシングルレベルワイルドカードの使用例です。
"+" は有効
"sensor/+" は有効
"sensor/+/temperature" は有効
"sensor+" は無効(レベル全体を占めていない)
クライアントが sensor/+/temperature
をサブスクライブすると、以下のトピックからのメッセージを受信します。
sensor/1/temperature
sensor/2/temperature
...
sensor/n/temperature
ただし、以下のトピックにはマッチしません。
sensor/temperature
sensor/bedroom/1/temperature
マルチレベルワイルドカード
#
(U+0023)は、トピック内の任意の数のレベルにマッチするワイルドカード文字です。マルチレベルワイルドカードを使用する場合、そのレベル全体を占め、トピックの最後の文字でなければなりません。例:
"#" は有効で、すべてのトピックにマッチ
"sensor/#" は有効
"sensor/bedroom#" は無効(+ または # はワイルドカードレベルとしてのみ使用可能)
"sensor/#/temperature" は無効(# は最後のレベルでなければならない)
クライアントが sensor/#
をサブスクライブすると、以下のトピックからのメッセージを受信します。
sensor
sensor/temperature
sensor/1/temperature
MQTTXクライアントでワイルドカードサブスクリプションを試す
このセクションでは、MQTTXクライアントを使ってワイルドカードトピックのサブスクリプションを作成する方法を示します。デモとして、1つのクライアント接続 Demo
をパブリッシャーとしてメッセージをパブリッシュします。もう1つのクライアント接続をサブスクライバーとして作成し、以下のワイルドカードトピックをサブスクライブします。
testtopic/+/temperature
testtopic/#
EMQXとMQTTX Desktopを起動し、New Connectionをクリックしてパブリッシャー用のクライアント接続を作成します。
- Nameに
Demo
と入力します。 - Hostにローカルホスト
127.0.0.1
を入力します(本デモの例として)。 - その他の設定はデフォルトのままにして、Connectをクリックします。
TIP
MQTT接続の作成方法については、MQTTX Desktopで詳しく説明しています。
- Nameに
Connectionsペインの + をクリックし、サブスクライバー用の別の接続を作成します。Nameを
Subscriber
に設定します。Connectionsで
Subscriber
を選択し、+ New Subscriptionをクリックします。ポップアップダイアログで、Topicフィールドにtesttopic/+/temperature
と入力します。その他のオプションはデフォルトのままにします。Connectionsで
Demo
を選択します。トピックフィールドにtesttopic/room1/temperature
と入力し、メッセージフィールドにペイロード28 degree
を入力します。送信ボタンをクリックします。同じペイロードでトピックtesttopic/room2/temperature
にもメッセージを送信します。Connectionsで
Subscriber
を選択します。サブスクライバーがパブリッシャーから送信された異なるトピックの2つのメッセージを受信していることが確認できます。+ New Subscriptionをクリックします。ポップアップダイアログで、デフォルトのトピック
testtopic/#
をTopicフィールドに使用します。その他のオプションはデフォルトのままにします。Connectionsで
Demo
を選択します。トピックフィールドにtesttopic/bedroom/room1/temperature
と入力し、メッセージフィールドにペイロード28 degree
を入力します。送信ボタンをクリックします。Connectionsで
Subscriber
を選択します。メッセージがサブスクリプションtesttopic/#
のみへ送信されていることが確認できます。