Skip to content

データソースとフィールド

EMQXのルールは、MQTTメッセージMQTTイベント、またはデータブリッジなど、さまざまなデータソースからのデータを処理できます。

Rule SQL Reference セクションで説明したように、FROM句でデータソースを指定し、対応するフィールドをSELECT句やwhere句で参照できます。本セクションでは、MQTTメッセージMQTTイベント、およびデータブリッジのフィールドについて紹介します。

MQTTメッセージ

EMQXのルールを使ってメッセージのパブリッシュを処理する場合、FROM句でメッセージのトピックを指定する必要があります。

例えば、以下のステートメントでは、t/#というパターンにマッチするトピックにパブリッシュされたメッセージのpayload.msgAS句でmsgにリネーム)、clientidusernamepayloadtopicqosの各フィールドを選択しています。

例:

sql
SELECT
  payload.msg as msg,
  clientid,
  username,
  payload,
  topic,
  qos
FROM
  "t/#"

出力例:

json
{
  "username": "u_emqx",
  "topic": "t/a",
  "qos": 1,
  "payload": "{\"msg\":\"hello\"}",
  "msg": "hello",
  "clientid": "c_emqx"
}

受信したMQTTメッセージから選択可能なフィールドは以下の通りです。

フィールド説明
idMQTTメッセージID
clientidパブリッシャーのクライアントID
usernameパブリッシャーのユーザー名
payloadMQTTペイロード
peerhostクライアントのIPアドレス
topicMQTTトピック
qosQoSレベル
flagsフラグ
headersメッセージ処理に関連する内部データ
pub_propsPUBLISHプロパティ(MQTT 5.0クライアントのみ)
timestampタイムスタンプ(単位:ms)
publish_received_atPUBLISHメッセージがEMQXに到達した時刻(単位:ms)
nodeイベントが発生したノード
client_attrsクライアント属性

MQTTイベント

データ統合のルールでは、FROM句に指定できる複数のイベントトピックを提供しています。これらのイベントトピックからデータを抽出することで、クライアントのオンライン・オフラインやクライアントのサブスクリプションなどのイベント通知を取得できます。イベントトピックは"$events/"で始まり、例えば"$events/client_connected"のように指定します。

デフォルトでは、クライアントはMQTTイベントメッセージを直接サブスクライブできません。本節では、ルールを使ってこれらのメッセージをサブスクライブする方法と各フィールドの意味を説明します。

イベントトピック一覧

対応するイベントトピック一覧は以下の通りです。

イベントトピック名説明
$events/message_deliveredメッセージ配信
$events/message_ackedメッセージ受領確認
$events/message_droppedルーティング時のメッセージ破棄
$events/delivery_dropped配信時のメッセージ破棄
$events/client_connected接続完了
$events/client_disconnected切断
$events/client_connack接続応答
$events/client_check_authz_complete認可チェック完了
$events/client_check_authn_complete認証チェック完了
$events/session_subscribedサブスクライブ成功
$events/session_unsubscribedサブスクリプション解除

メッセージ配信イベント ("$events/message_delivered")

このイベントトピックは、メッセージがクライアントに配信された際にルールをトリガーできます。

例えば、"$events/message_delivered"イベントトピックから、パブリッシャーのIDとユーザー名、メッセージトピック、メッセージのQoS、イベントが発生したEMQXノード、イベント発生時刻の各フィールドを抽出するには、以下のステートメントを使用します。

例:

sql
SELECT
  from_clientid,
  from_username,
  topic,
  qos,
  node,
  timestamp
FROM
  "$events/message_delivered"

出力例:

json
{
  "topic": "t/a",
  "timestamp": 1645002753259,
  "qos": 1,
  "node": "emqx@127.0.0.1",
  "from_username": "u_emqx_1",
  "from_clientid": "c_emqx_1"
}

各フィールドの詳細は以下の通りです。

コード説明
idMQTTメッセージID
from_clientidパブリッシャーのクライアントID
from_usernameパブリッシャーのユーザー名
clientidサブスクライバーのクライアントID
usernameサブスクライバーのユーザー名
payloadMQTTペイロード
peerhostクライアントのIPアドレス
topicMQTTトピック
qosQoSレベル
flagsフラグ
pub_propsPUBLISHプロパティ(MQTT 5.0クライアントのみ)
timestampイベント発生時刻(単位:ms)
publish_received_atPUBLISHメッセージがEMQXに到達した時刻(単位:ms)
nodeイベントが発生したEMQXノード

メッセージ受領確認イベント ("$events/message_acked")

このイベントトピックは、メッセージ配信がアック(ACK)された際にルールをトリガーできます。

TIP

QOS 1およびQOS 2のメッセージのみ対応しています。

例えば、"$events/message_acked"イベントトピックから、パブリッシャーのIDとユーザー名、メッセージトピック、メッセージのQoS、イベントが発生したEMQXノード、イベント発生時刻の各フィールドを抽出するには、以下のステートメントを使用します。

例:

sql
SELECT
  from_clientid,
  from_username,
  topic,
  qos,
  node,
  timestamp
FROM
  "$events/message_acked"

出力例:

json
{
  "topic": "t/a",
  "timestamp": 1645002965664,
  "qos": 1,
  "node": "emqx@127.0.0.1",
  "from_username": "u_emqx_1",
  "from_clientid": "c_emqx_1"
}

各フィールドの詳細は以下の通りです。

コード説明
idMQTTメッセージID
from_clientidパブリッシャーのクライアントID
from_usernameパブリッシャーのユーザー名
clientidサブスクライバーのクライアントID
usernameサブスクライバーのユーザー名
payloadMQTTペイロード
peerhostクライアントのIPアドレス
topicMQTTトピック
qosQoSレベル
flagsフラグ
pub_propsPUBLISHプロパティ(MQTT 5.0のみ)
puback_propsPUBACKプロパティ(MQTT 5.0のみ)
timestampイベント発生時刻(単位:ms)
publish_received_atPUBLISHメッセージがEMQXに到達した時刻(単位:ms)
nodeイベントが発生したEMQXノード

ルーティング時のメッセージ破棄イベント ("$events/message_dropped")

このイベントトピックは、メッセージがルーティング中に破棄された際にルールをトリガーできます。

例えば、"$events/message_dropped"イベントトピックから、破棄理由、メッセージトピック、メッセージのQoS、イベントが発生したEMQXノード、イベント発生時刻の各フィールドを抽出するには、以下のステートメントを使用します。

例:

sql
SELECT
  reason,
  topic,
  qos,
  node,
  timestamp
FROM
  "$events/message_dropped"

出力例:

json
{
  "topic": "t/a",
  "timestamp": 1645003103004,
  "reason": "no_subscribers",
  "qos": 1,
  "node": "emqx@127.0.0.1"
}
フィールド説明
idMQTTメッセージID
reason破棄理由:

no_subscribers: トピックにサブスクライブしているクライアントがいない

receive_maximum_exceeded: awaiting_relキューが満杯

packet_identifier_inuse: 未解放のパケットIDを持つQoS 2メッセージを受信した
clientidパブリッシャーのクライアントID
usernameパブリッシャーのユーザー名
payloadMQTTペイロード
peerhostクライアントのIPアドレス
topicMQTTトピック
qosQoSレベル
flagsフラグ
pub_propsPUBLISHプロパティ(MQTT 5.0のみ)
timestampイベント発生時刻(単位:ms)
publish_received_atPUBLISHメッセージがEMQXに到達した時刻(単位:ms)
nodeイベントが発生したノード

配信時のメッセージ破棄イベント ("$events/delivery_dropped")

このイベントトピックは、メッセージが配信中に破棄された際にルールをトリガーできます。

例えば、"$events/delivery_dropped"イベントトピックから、パブリッシャーのIDとユーザー名、破棄理由、メッセージトピック、QoSの各フィールドを抽出するには、以下のステートメントを使用します。

例:

sql
SELECT
  from_clientid,
  from_username,
  reason,
  topic,
  qos
FROM "$events/delivery_dropped"

出力例:

json
{
  "topic": "t/a",
  "reason": "queue_full",
  "qos": 1,
  "from_username": "u_emqx_1",
  "from_clientid": "c_emqx_1"
}

各フィールドの詳細は以下の通りです。

フィールド説明
idMQTTメッセージID
reason破棄理由:

queue_full: メッセージ(QoS>0)キューが満杯

no_local: クライアントが自身のパブリッシュしたメッセージを受信できない

expired: メッセージまたはセッションの有効期限切れ

qos0_msg: メッセージ(QoS 0)キューが満杯
from_clientidパブリッシャーのクライアントID
from_usernameパブリッシャーのユーザー名
clientidサブスクライバーのクライアントID
usernameサブスクライバーのユーザー名
payloadMQTTペイロード
peerhostクライアントのIPアドレス
topicMQTTトピック
qosメッセージのQoS
flagsフラグ
pub_propsPUBLISHプロパティ(MQTT 5.0クライアントのみ)
timestampイベント発生時刻(単位:ms)
publish_received_atPUBLISHメッセージがEMQXに到達した時刻(単位:ms)
nodeイベントが発生したEMQXノード

接続完了イベント ("$events/client_connected")

このイベントトピックは、クライアントが正常に接続した際にルールをトリガーできます。

例えば、"$events/client_connected"イベントトピックから、クライアントID、ユーザー名、キープアライブ間隔、接続したMQTTクライアントがブリッジとして動作しているかどうかの各フィールドを抽出するには、以下のステートメントを使用します。

例:

sql
SELECT
  clientid,
  username,
  keepalive,
  is_bridge
FROM
  "$events/client_connected"

出力例:

json
{
  "username": "u_emqx",
  "keepalive": 60,
  "is_bridge": false,
  "clientid": "c_emqx"
}

受信したMQTTメッセージから選択可能なフィールドは以下の通りです。

フィールド説明
clientidクライアントID
usernameクライアントのユーザー名
mountpointブリッジメッセージのマウントポイント
peername端末のIPアドレスとポート番号
socknameEMQXがリッスンしているIPアドレスとポート番号
proto_nameプロトコル名
proto_verプロトコルバージョン
keepaliveMQTTキープアライブ間隔
clean_startMQTTクリーンスタートフラグ
expiry_intervalMQTTセッションの有効期限
is_bridgeクライアントがブリッジとして動作しているかどうか
connected_atクライアントの接続完了時刻(単位:ms)
conn_propsCONNECTプロパティ(MQTT 5.0クライアントのみ)
timestampイベント発生時刻(単位:ms)
nodeイベントが発生したEMQXノード
client_attrsクライアント属性

切断イベント ("$events/client_disconnected")

このイベントトピックは、クライアントが切断した際にルールをトリガーできます。

例えば、"$events/client_disconnected"イベントトピックから、クライアントID、ユーザー名、切断理由、切断時刻、イベントが発生したEMQXノードの各フィールドを抽出するには、以下のステートメントを使用します。

例:

sql
SELECT
  clientid,
  username,
  reason,
  disconnected_at,
  node
FROM
  "$events/client_disconnected"

出力例:

json
{
  "username": "u_emqx",
  "reason": "normal",
  "node": "emqx@127.0.0.1",
  "disconnected_at": 1645003578536,
  "clientid": "c_emqx"
}
フィールド説明
reason切断理由:

normal: クライアントが意図的に切断

kicked: REST API経由でEMQXが強制切断

keepalive_timeout: 指定されたキープアライブ期間のタイムアウト

not_authorized: 認可失敗

tcp_closed: ピアがネットワーク接続を閉じた

discarded: clean_starttrueの別クライアントが同じClientIDで接続し、前の接続が切断された

takenover: clean_startfalseの別クライアントが同じClientIDで接続し、前の接続を引き継いだ

internal_error: 不正なメッセージ形式やその他不明なエラーによる切断
clientidクライアントID
usernameクライアントのユーザー名
peernameIPアドレスとポート番号
socknameEMQXがリッスンしているIPアドレスとポート番号
disconnected_atクライアント切断完了時刻(単位:ms)
disconn_propsDISCONNECTプロパティ(MQTT 5.0クライアントのみ)
timestampイベント発生時刻(単位:ms)
nodeイベントが発生したEMQXノード
client_attrsクライアント属性

接続応答イベント ("$events/client_connack")

このイベントトピックは、EMQXがクライアントにCONNACKパケットを送信した際にルールをトリガーできます。

例:

sql
SELECT
  clientid,
  username,
  reason_code,
  node
FROM
  "$events/client_connack"

出力例:

json
{
  "username": "u_emqx",
  "reason_code": "success",
  "node": "emqx@127.0.0.1",
  "connected_at": 1645003578536,
  "clientid": "c_emqx"
}

抽出可能なフィールドは以下の通りです。

フィールド説明
reason_code理由コード*
clientidパブリッシャーのクライアントID
usernameパブリッシャーのユーザー名
peernameIPアドレスとポート
socknameEMQXがリッスンしているIPアドレスとポート
proto_nameプロトコル名
proto_verプロトコルバージョン
keepaliveMQTTキープアライブ間隔
clean_startMQTTクリーンスタートフラグ
expiry_intervalMQTTセッションの有効期限
conn_propsCONNECTプロパティ(MQTT 5.0クライアントのみ)
timestampイベント発生時刻(単位:ms)
nodeイベントが発生したEMQXノード

[^*]: MQTT v5.0プロトコルでは、戻りコードを理由コードに変更し、より多様なエラータイプを示す理由コードが追加されています(Reason code and ACK - MQTT 5.0 new features)。

以下はMQTT v3.1.1およびMQTT v5.0の理由コードです。

認可チェック完了イベント ("$events/client_check_authz_complete")

このイベントトピックは、クライアントの認可チェックが完了した際にルールをトリガーできます。

例:

sql
SELECT
  clientid,
  username,
  topic,
  action,
  result,
  authz_source,
  node
FROM
  "$events/client_check_authz_complete"

出力例:

json
{
  "username": "u_emqx",
  "topic": "t/a",
  "action": "publish",
  "result": "allow",
  "authz_source": "cache",
  "node": "emqx@127.0.0.1",
  "clientid": "c_emqx"
}

抽出可能なフィールドは以下の通りです。

フィールド説明
clientidクライアントID
usernameユーザー名
peerhostクライアントのIPアドレス
topicMQTTトピック
actionパブリッシュまたはサブスクライブのアクション
resultアクセス制御チェックの結果
authz_source認可のソース
timestampタイムスタンプ(単位:ms)
nodeイベントが発生したEMQXノード
client_attrsクライアント属性

認証チェック完了イベント ("$events/client_check_authn_complete")

このイベントトピックは、クライアントの認証チェックが完了した際にルールをトリガーできます。

例:

sql
SELECT
  clientid,
  username,
  reason_code,
  is_superuser,
  is_anonymous
FROM
  "$events/client_check_authn_complete"

出力例:

json
{
  "clientid": "c_emqx",
  "username": "u_emqx",
  "reason_code": "success",
  "is_superuser": true,
  "is_anonymous": false
}

抽出可能なフィールドは以下の通りです。

フィールド説明
clientidクライアントID
usernameユーザー名
peernameクライアントのIPアドレス
reason_code認証結果
is_superuserスーパーユーザーかどうか
is_anonymous匿名ユーザーかどうか
client_attrsクライアント属性

サブスクライバーイベント ("$events/session_subscribed")

このイベントトピックは、クライアントが正常にサブスクライブした際にルールをトリガーできます。

例:

sql
SELECT
  clientid,
  username,
  topic,
  qos
FROM
  "$events/session_subscribed"

出力例:

json
{
  "username": "u_emqx",
  "topic": "t/a",
  "qos": 1,
  "clientid": "c_emqx"
}

抽出可能なフィールドは以下の通りです。

フィールド説明
clientidクライアントID
usernameクライアントのユーザー名
peerhostクライアントのIPアドレス
topicMQTTトピック
qosQoSレベル
sub_propsSUBSCRIBEプロパティ(MQTT 5.0クライアントのみ)
timestampイベント発生時刻(単位:ms)
nodeイベントが発生したEMQXノード
client_attrsクライアント属性

サブスクリプション解除イベント ("$events/session_unsubscribed")

このイベントトピックは、クライアントのサブスクリプション解除が成功した際にルールをトリガーします。

例:

sql
SELECT
  clientid,
  username,
  topic,
  qos
FROM
  "$events/session_unsubscribed"

出力例:

json
{
  "username": "u_emqx",
  "topic": "t/a",
  "qos": 1,
  "clientid": "c_emqx"
}

抽出可能なフィールドは以下の通りです。

フィールド説明
clientidクライアントID
usernameクライアントのユーザー名
peerhostクライアントのIPアドレス
topicMQTTトピック
qosQoSレベル
unsub_propsUNSUBSCRIBEプロパティ(MQTT 5.0クライアントのみ)
timestampイベント発生時刻(単位:ms)
nodeイベントが発生したEMQXノード
client_attrsクライアント属性

データブリッジ

ルールは、データブリッジによってトリガーされたメッセージやイベントを、$bridges/で始まるトピックで扱います。形式は以下の通りです。

$bridges/<type>:<name>

ここで、

  • <type>:<name>はブリッジID、
  • <type>はブリッジタイプ、
  • <name>はブリッジ名です。

例えば、MQTTブリッジのイベントは"$bridges/mqtt:*"の形式で参照できます。MQTTデータブリッジmy_mqtt_bridgeが送信するすべてのメッセージに対してルールを設定するには、以下のステートメントを使用します。

例:

sql
SELECT
  *
FROM
  "$bridges/mqtt:my_mqtt_bridge"

出力例:

sql
{
  "id": "0005E27C1D24E44FF440000017520000",
  "server": "broker.emqx.io:1883",
  "payload": "hello",
  "topic": "t/a",
  "qos": 1,
  "dup": false,
  "retain": false,
  "pub_props": {
    "Message-Expiry-Interval": 30,
    "Payload-Format-Indicator": 0,
    "User-Property": {
      "foo": "bar"
    },
    "User-Property-Pairs": [
      {
        "key": "foo"
      },
      {
        "value": "bar"
      }
    ]
  },
  "message_received_at": 1645002753259,
}

返される出力の各フィールドは以下の通りです。

フィールド説明
idMQTTメッセージID
serverリモートMQTTブローカーのサーバー名(例:"broker.emqx.io:1883")
payloadMQTTペイロード
topicMQTTトピック
qosMQTTのQoS
dupMQTTのDUPフラグ
retainMQTTのRetainフラグ
pub_propsPUBLISHプロパティ(MQTT 5.0クライアントのみ)
message_received_atメッセージ受信時刻のタイムスタンプ(単位:ms)