Skip to content

MQTT 設定

MQTT は、モノのインターネット(IoT)向けの標準的なメッセージングプロトコルです。非常に軽量なパブリッシュ/サブスクライブ型のメッセージングトランスポートとして設計されており、リモートデバイスを小さなコードフットプリントかつ最小限のネットワーク帯域で接続するのに最適です。

EMQX は 100% MQTT 5.0 および 3.x に準拠しています。本セクションでは、基本的な MQTT 設定項目について紹介します。基本的な MQTT 設定、サブスクリプション設定、セッション設定、強制シャットダウン設定、および強制ガベージコレクション設定などを扱います。

基本的な MQTT 設定

このセクションでは、パケットサイズ、クライアントID長、トピックレベル数、QoS(サービス品質)、トピックエイリアス、保持設定など、MQTT プロトコルの動作を決定する設定項目を紹介します。

TIP

EMQX ダッシュボードの「管理」->「MQTT 設定」->「一般」からも対応する設定項目を確認できます。ダッシュボードで設定した場合、設定ファイル内の同じ設定項目より優先されます。
設定ファイルから MQTT を設定する場合は、emqx.conf ではなく base.hocon の使用を推奨します。
emqx.conf に設定した場合、ダッシュボード経由の変更は一時的なものとなり、EMQX 再起動時に失われるためです。

設定例:

bash
mqtt {
  max_packet_size = 1MB
  max_clientid_len = 65535
  max_topic_levels = 128
  max_qos_allowed = 2
  max_topic_alias = 65535
  retain_available = true
}

各項目の説明は以下の通りです。

設定項目ダッシュボードUI説明デフォルト値選択可能な値
max_packet_sizeMax Packet SizeMQTT パケットは MQTT クライアントと EMQX 間でメッセージを送受信するために使用されます。

許可される最大 MQTT パケットサイズを設定します。
1MB
max_clientid_lenMax Client ID LengthMQTT クライアントIDの最大長を設定します。

過度に長いクライアントIDの使用を防止し、問題を回避します。
6553523 - 65535
max_topic_levelsMax Topic LevelsMQTT トピックはメッセージの整理・分類に使用されます。

トピックの最大レベル数を設定します。
1281 - 35
max_qos_allowedMax QoSQoS(サービス品質)レベルはメッセージの信頼性と配信保証のレベルを決定します。

許可される最大 QoS レベルを設定します。
max_topic_aliasMax Topic Aliasトピックエイリアスは、フルトピック名の代わりに短いエイリアスを使うことで MQTT パケットサイズを削減する方法です。

MQTT セッションで使用可能な最大トピックエイリアス数を設定します。
655351 - 65535
retain_availableRetain Available保持メッセージは、トピックに最後にパブリッシュされたメッセージを保存し、新規サブスクライバーが最新メッセージを受信できるようにします。

MQTT の保持メッセージ機能を有効化するかどうかを設定します。
truetrue, false

サブスクリプション設定

EMQX におけるサブスクリプションとは、クライアントが EMQX のトピックにサブスクライブするプロセスを指します。クライアントがトピックをサブスクライブすると、そのトピックにパブリッシュされたメッセージを受信したいことを示します。

このセクションでは、共有サブスクリプション、ワイルドカードサブスクリプション、排他サブスクリプションの設定方法を紹介します。

TIP

EMQX ダッシュボードの「管理」->「MQTT 設定」->「一般」からも対応する設定項目を確認できます。ダッシュボードで設定した場合、設定ファイル内の同じ設定項目より優先されます。
設定ファイルから MQTT を設定する場合は、emqx.conf ではなく base.hocon の使用を推奨します。
emqx.conf に設定した場合、ダッシュボード経由の変更は一時的なものとなり、EMQX 再起動時に失われるためです。

設定例:

bash
mqtt {
	wildcard_subscription = true
  exclusive_subscription = false
  shared_subscription = true
  shared_subscription_strategy  =  round_robin
}

各項目の説明は以下の通りです。

設定項目ダッシュボードUI説明デフォルト値選択可能な値
wildcard_subscriptionWildcard Subscription Availableワイルドカードサブスクリプションは、+# といったワイルドカードを使い、複数のトピックを単一のサブスクリプションでサブスクライブ可能にします。

ワイルドカードサブスクリプションを有効化するかどうかを設定します。
truetrue, false
exclusive_subscriptionExclusive Subscription排他サブスクリプションは、同時に1つの MQTT クライアントのみがトピックをサブスクライブできるようにします。

排他サブスクリプションを有効化するかどうかを設定します。
truetrue, false
shared_subscriptionShared Subscription Available共有サブスクリプションは、複数の MQTT クライアントがトピックのサブスクリプションを共有できるようにします。

共有サブスクリプションを有効化するかどうかを設定します。
truetrue, false
shared_subscription_strategy共有サブスクリプションでメッセージを複数の MQTT クライアントに分配する戦略を定義します。

shared_subscriptiontrue の場合にのみ必要です。
round_robin- random(ランダムにサブスクライバーへメッセージを配送)

- round_robin(ラウンドロビン方式でサブスクライバーを選択)

- sticky(最後に選択されたサブスクライバーに常に配送、切断まで継続)

- hashclientIds のハッシュでサブスクライバーを選択)

遅延パブリッシュ設定

遅延パブリッシュ機能は、クライアントが指定した時間だけメッセージのパブリッシュを遅延させることを可能にします。この機能は、特定の時間にメッセージをパブリッシュしたい場合や、特定条件を満たしたときにパブリッシュしたい場合に有用です。

このセクションでは、遅延パブリッシュの有効化方法と、許可される遅延メッセージの最大数の設定方法を紹介します。

設定例:

bash
delay {
  delayed_publish_enabled = true
  max_delayed_messages = 0
}

各項目の説明は以下の通りです。

  • delayed_publish_enabled は遅延パブリッシュ機能の有効化設定です。デフォルト値は true、選択可能な値は true または false です。
  • max_delayed_messages は許可される遅延メッセージの最大数を設定します。デフォルト値は 0 です。

キープアライブ設定

キープアライブは 2 バイトの整数で、秒単位の時間間隔を表します。これは、MQTT クライアントと EMQX 間の接続がデータ送信がなくてもアクティブな状態を維持するための仕組みです。MQTT クライアントが EMQX に接続を確立するとき、CONNECT パケットのヘッダーに非ゼロのキープアライブ値を設定することで、双方間のキープアライブ機構を有効にできます。キープアライブの動作詳細については、MQTT キープアライブパラメータとは? を参照してください。

MQTT 5.0 プロトコルによれば、キープアライブが有効なクライアントに対し、サーバーがクライアントからキープアライブ時間の1.5倍以内に MQTT コントロールパケットを受信しなかった場合、ネットワーク接続を切断しなければなりません。
そのため、EMQX ではクライアントのキープアライブタイムアウト状態を定期的にチェックするための設定 keepalive_multiplier を導入しています。デフォルト値は 1.5 です。

bash
keepalive_multiplier = 1.5

タイムアウト計算式は以下の通りです。

Keep Alive×keepalive_multiplier

動的キープアライブ調整

車載ネットワーク(T-Box)やモバイル IoT などのシナリオでは、MQTT クライアントは「アクティブ状態」(頻繁な通信)と「スリープ状態」(低消費電力の待機)を切り替える必要があります。単一の固定キープアライブ値では両方のニーズを満たせません。

  • 短いキープアライブはアクティブ時の切断検知を迅速にしますが、デバイスが駐車中やアイドル時には過剰なハートビートトラフィックとバッテリー消費を招きます。
  • 長いキープアライブはスリープ時のトラフィックを抑制しますが、アクティブ時の切断検知が遅れます。

EMQX は $SETOPTS/ システムトピック群を通じて、クライアントごとに動的にキープアライブを調整する機能をサポートしています。クライアントはこれらのトピックにパブリッシュすることで、自身のブローカー側キープアライブ許容値を更新できます。また、権限のあるバックエンドサービスは複数クライアントを一括更新可能です。MQTT 接続を切断・再交渉することなく、アクティブなセッションに対してメモリ上でのみ適用され、永続化はされません。

リスナーマウントポイントとの非互換性

動的キープアライブ調整は、マウントポイント が設定されたリスナー経由で接続するクライアントには機能しません。EMQX はマウントポイントを $SETOPTS/ プレフィックスのマッチング前に適用するため、更新はマウントされたリテラルトピックへの通常メッセージとしてルーティングされ、クライアントにはエラーが通知されません。

単一クライアント更新: $SETOPTS/mqtt/keepalive

クライアントはこのトピックにパブリッシュして、自身のブローカー側キープアライブタイムアウトを更新します。EMQX はパブリッシュ元のセッションからクライアントIDを自動取得します。

ペイロード: 秒単位の非負整数を文字列で表現。

text
300

有効範囲: 065535 秒。0 はそのセッションのキープアライブチェックを無効化します。65535 を超える値は 65535 にクランプされます。クライアントのゾーンに mqtt.server_keepalive が設定されている場合は、両者の最小値が有効値となります。

利用例: 車両が駐車状態に入る際、T-Box クライアントが $SETOPTS/mqtt/keepalive300 をパブリッシュします。EMQX はブローカー側のキープアライブ許容値を 300 秒(デフォルトの 1.5× 乗数で有効アイドルタイムアウトは 450 秒)に延長し、リモートコマンド配送のために MQTT 接続を維持します。なお、これはブローカー側のタイムアウト調整のみであり、クライアント側の実際の PINGREQ 間隔は変わりません。ハートビートトラフィックを減らすには、クライアント側もキープアライブ間隔を延長する必要があります。

一括更新: $SETOPTS/mqtt/keepalive-bulk

バックエンドサービスはこのトピックにパブリッシュして、複数クライアントのキープアライブを一括更新できます。

ペイロード: JSON 配列。各要素は以下を含みます。

フィールド必須説明
clientid文字列はい対象 MQTT クライアントID
keepalive整数はい新しいキープアライブ間隔(秒単位、0〜65535)
json
[
  { "clientid": "tbox-001", "keepalive": 300 },
  { "clientid": "tbox-002", "keepalive": 60 }
]

一括更新は非同期で処理され、クラスター対応しています。EMQX は各クライアントをホストするノードを特定し、ノード間 RPC で更新を適用します。内部キューに 10 件を超える一括リクエストが溜まると、追加リクエストは破棄され、警告ログが記録されます。

アクセス制御

2 つのトピックは細かい ACL をサポートするために分離されています。

  • 認証済みクライアントが $SETOPTS/mqtt/keepalive にパブリッシュ可能にし、各デバイスが自身のキープアライブを自己調整できるようにする。
  • $SETOPTS/mqtt/keepalive-bulk は信頼できるバックエンドサービスのみに制限する。

TIP

信頼できないクライアントに $SETOPTS/mqtt/keepalive へのパブリッシュ権限を与えることは避けてください。キープアライブを 0 に設定すると、そのセッションのキープアライブチェックが完全に無効化され、過度に大きな値は古い接続が残存しブローカーリソースを消費する恐れがあります。

これらのトピックにパブリッシュされたメッセージは、EMQX によってインターセプトされ消費され、ルーティングされることもサブスクライバーに配信されることもありません。

セッション設定

MQTT におけるセッションとは、クライアントとブローカー間の接続を指します。EMQX では、クライアントが EMQX に接続すると、トピックのサブスクライブやメッセージの受信、EMQX へのメッセージパブリッシュを可能にするセッションが確立されます。

このセクションでは、セッションの設定方法を紹介します。

設定例:

bash
mqtt {
    max_subscriptions = infinity
    upgrade_qos = false
    max_inflight = 32
    retry_interval = 30s
    max_awaiting_rel = 100
    await_rel_timeout = 300s
    session_expiry_interval = 2h
    max_mqueue_len = 1000
    mqueue_priorities = disabled
    mqueue_default_priority = lowest
    mqueue_store_qos0 = true
    force_shutdown {
      max_mailbox_size = 1000
      max_heap_size = 32MB
    }
    force_gc {
      count  =  16000
      bytes  =  16MB
    }
  }

各項目の説明は以下の通りです。

設定項目ダッシュボードUI説明デフォルト値選択可能な値
max_subscriptionsMax Subscriptionsクライアントが許可される最大サブスクリプション数を設定します。infinity1 - infinity
upgrade_qosUpgrade QoSメッセージパブリッシュ後にクライアントが QoS(サービス品質)レベルをアップグレードできるかどうかを設定します。false(無効)true, false
max_inflightMax InflightQoS 1 および QoS 2 メッセージの最大同時送信数(送信済みでまだアックを受けていない数)を設定します。321 - 65535
retry_intervalRetry IntervalQoS 1 または QoS 2 メッセージの再送間隔を設定します。30s
単位: 秒
--
max_awaiting_relMax Awaiting PUBREL各セッションで PUBREL を受信またはタイムアウトまで保留できる QoS 2 メッセージ数の上限を設定します。
上限超過時、新規 QoS 2 PUBLISH はエラーコード 147(0x93) で拒否されます。
MQTT における PUBREL は QoS 2 メッセージフローの制御パケットです。
1001 - infinity
await_rel_timeoutMax Awaiting PUBREL TIMEOUTQoS 2 メッセージの PUBREL 受信待機時間を設定します。
タイムアウト時、EMQX はパケットIDを解放し、警告ログを出力します。
注: EMQX は PUBREL 受信の有無にかかわらず QoS 2 メッセージの転送を行います。
300s
単位: 秒
--
session_expiry_intervalSession Expiry Intervalセッションがアイドル状態で自動的にクローズされるまでの時間を設定します。
注: MQTT 5.0 非対応クライアント用。
2h
max_mqueue_lenMax Message Queue Length永続化クライアント切断時やインフライトウィンドウが満杯の際の最大キュー長を設定します。10000 - infinity
mqueue_prioritiesTopic Prioritiesトピック優先度を設定します。ここでの設定は mqueue_default_priority の設定を上書きします。disabled
セッションは mqueue_default_priority の優先度を使用
disabled
または
1 - 255
mqueue_default_priorityDefault Topic Prioritiesデフォルトのトピック優先度を設定します。lowesthighestlowest
mqueue_store_qos0Store QoS 0 Message接続断時にセッションが残っている場合、QoS 0 メッセージをメッセージキューに保存するかどうかを設定します。truetrue, false
force_shutdownEnable Force Shutdown強制シャットダウン機能を有効にするかどうかを設定します。メールボックスキュー長(max_mailbox_size)またはヒープサイズ(max_heap_size)が指定値に達すると、クライアント接続処理を強制終了します。truetrue, false
force_shutdown.max_mailbox_sizeMax Mailbox Size強制シャットダウンをトリガーする最大メールボックスキュー長を設定します。10001 - infinity
force_shutdown.max_heap_sizeMax Heap Size強制シャットダウンをトリガーする最大ヒープサイズを設定します。32MB--
force_gc--指定されたメッセージ数(count)または受信バイト数(bytes)に達した場合に強制ガベージコレクションを有効にするかどうかを設定します。truetrue, false
force_gc.count--強制ガベージコレクションをトリガーする受信メッセージ数を設定します。160000 - infinity
force_gc.bytes--強制ガベージコレクションをトリガーする受信バイト数を設定します。16MB
単位: MB
--

TIP

ダッシュボードで MQTT 設定を行うには、左側ナビゲーションメニューの「管理」->「MQTT 設定」をクリックしてください。ダッシュボードで設定した場合、設定ファイル内の同じ設定項目より優先されます。
設定ファイルから MQTT を設定する場合は、emqx.conf ではなく base.hocon の使用を推奨します。
emqx.conf に設定した場合、ダッシュボード経由の変更は一時的なものとなり、EMQX 再起動時に失われるためです。

TIP

EMQX はより詳細なカスタマイズニーズに対応するため、さらに多くの設定項目を提供しています。詳細は EMQX Enterprise Configuration Manual for Enterprise を参照してください。