データソースとフィールド
EMQXのルールは、MQTTメッセージ、MQTTイベント、またはデータブリッジなど、さまざまなデータソースからのデータを処理できます。
Rule SQL Reference セクションで説明したように、FROM
句でデータソースを指定し、対応するフィールドをSELECT
句やwhere
句で参照できます。本セクションでは、MQTTメッセージ、MQTTイベント、およびデータブリッジのフィールドについて紹介します。
MQTTメッセージ
EMQXのルールを使ってメッセージのパブリッシュを処理する場合、FROM
句でメッセージのトピックを指定する必要があります。
例えば、以下のステートメントでは、t/#
というパターンにマッチするトピックにパブリッシュされたメッセージのpayload.msg
(AS
句でmsg
にリネーム)、clientid
、username
、payload
、topic
、qos
の各フィールドを選択しています。
例:
SELECT
payload.msg as msg,
clientid,
username,
payload,
topic,
qos
FROM
"t/#"
出力例:
{
"username": "u_emqx",
"topic": "t/a",
"qos": 1,
"payload": "{\"msg\":\"hello\"}",
"msg": "hello",
"clientid": "c_emqx"
}
受信したMQTTメッセージから選択可能なフィールドは以下の通りです。
フィールド | 説明 |
---|---|
id | MQTTメッセージID |
clientid | パブリッシャーのクライアントID |
username | パブリッシャーのユーザー名 |
payload | MQTTペイロード |
peerhost | クライアントのIPアドレス |
topic | MQTTトピック |
qos | QoSレベル |
flags | フラグ |
headers | メッセージ処理に関連する内部データ |
pub_props | PUBLISHプロパティ(MQTT 5.0クライアントのみ) |
timestamp | タイムスタンプ(単位:ms) |
publish_received_at | PUBLISHメッセージが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ノード、イベント発生時刻の各フィールドを抽出するには、以下のステートメントを使用します。
例:
SELECT
from_clientid,
from_username,
topic,
qos,
node,
timestamp
FROM
"$events/message_delivered"
出力例:
{
"topic": "t/a",
"timestamp": 1645002753259,
"qos": 1,
"node": "emqx@127.0.0.1",
"from_username": "u_emqx_1",
"from_clientid": "c_emqx_1"
}
各フィールドの詳細は以下の通りです。
コード | 説明 |
---|---|
id | MQTTメッセージID |
from_clientid | パブリッシャーのクライアントID |
from_username | パブリッシャーのユーザー名 |
clientid | サブスクライバーのクライアントID |
username | サブスクライバーのユーザー名 |
payload | MQTTペイロード |
peerhost | クライアントのIPアドレス |
topic | MQTTトピック |
qos | QoSレベル |
flags | フラグ |
pub_props | PUBLISHプロパティ(MQTT 5.0クライアントのみ) |
timestamp | イベント発生時刻(単位:ms) |
publish_received_at | PUBLISHメッセージがEMQXに到達した時刻(単位:ms) |
node | イベントが発生したEMQXノード |
メッセージ受領確認イベント ("$events/message_acked")
このイベントトピックは、メッセージ配信がアック(ACK)された際にルールをトリガーできます。
TIP
QOS 1およびQOS 2のメッセージのみ対応しています。
例えば、"$events/message_acked"
イベントトピックから、パブリッシャーのIDとユーザー名、メッセージトピック、メッセージのQoS、イベントが発生したEMQXノード、イベント発生時刻の各フィールドを抽出するには、以下のステートメントを使用します。
例:
SELECT
from_clientid,
from_username,
topic,
qos,
node,
timestamp
FROM
"$events/message_acked"
出力例:
{
"topic": "t/a",
"timestamp": 1645002965664,
"qos": 1,
"node": "emqx@127.0.0.1",
"from_username": "u_emqx_1",
"from_clientid": "c_emqx_1"
}
各フィールドの詳細は以下の通りです。
コード | 説明 |
---|---|
id | MQTTメッセージID |
from_clientid | パブリッシャーのクライアントID |
from_username | パブリッシャーのユーザー名 |
clientid | サブスクライバーのクライアントID |
username | サブスクライバーのユーザー名 |
payload | MQTTペイロード |
peerhost | クライアントのIPアドレス |
topic | MQTTトピック |
qos | QoSレベル |
flags | フラグ |
pub_props | PUBLISHプロパティ(MQTT 5.0のみ) |
puback_props | PUBACKプロパティ(MQTT 5.0のみ) |
timestamp | イベント発生時刻(単位:ms) |
publish_received_at | PUBLISHメッセージがEMQXに到達した時刻(単位:ms) |
node | イベントが発生したEMQXノード |
ルーティング時のメッセージ破棄イベント ("$events/message_dropped")
このイベントトピックは、メッセージがルーティング中に破棄された際にルールをトリガーできます。
例えば、"$events/message_dropped"
イベントトピックから、破棄理由、メッセージトピック、メッセージのQoS、イベントが発生したEMQXノード、イベント発生時刻の各フィールドを抽出するには、以下のステートメントを使用します。
例:
SELECT
reason,
topic,
qos,
node,
timestamp
FROM
"$events/message_dropped"
出力例:
{
"topic": "t/a",
"timestamp": 1645003103004,
"reason": "no_subscribers",
"qos": 1,
"node": "emqx@127.0.0.1"
}
フィールド | 説明 |
---|---|
id | MQTTメッセージID |
reason | 破棄理由:no_subscribers : トピックにサブスクライブしているクライアントがいないreceive_maximum_exceeded : awaiting_rel キューが満杯packet_identifier_inuse : 未解放のパケットIDを持つQoS 2メッセージを受信した |
clientid | パブリッシャーのクライアントID |
username | パブリッシャーのユーザー名 |
payload | MQTTペイロード |
peerhost | クライアントのIPアドレス |
topic | MQTTトピック |
qos | QoSレベル |
flags | フラグ |
pub_props | PUBLISHプロパティ(MQTT 5.0のみ) |
timestamp | イベント発生時刻(単位:ms) |
publish_received_at | PUBLISHメッセージがEMQXに到達した時刻(単位:ms) |
node | イベントが発生したノード |
配信時のメッセージ破棄イベント ("$events/delivery_dropped")
このイベントトピックは、メッセージが配信中に破棄された際にルールをトリガーできます。
例えば、"$events/delivery_dropped"
イベントトピックから、パブリッシャーのIDとユーザー名、破棄理由、メッセージトピック、QoSの各フィールドを抽出するには、以下のステートメントを使用します。
例:
SELECT
from_clientid,
from_username,
reason,
topic,
qos
FROM "$events/delivery_dropped"
出力例:
{
"topic": "t/a",
"reason": "queue_full",
"qos": 1,
"from_username": "u_emqx_1",
"from_clientid": "c_emqx_1"
}
各フィールドの詳細は以下の通りです。
フィールド | 説明 |
---|---|
id | MQTTメッセージID |
reason | 破棄理由:queue_full : メッセージ(QoS>0)キューが満杯no_local : クライアントが自身のパブリッシュしたメッセージを受信できないexpired : メッセージまたはセッションの有効期限切れqos0_msg : メッセージ(QoS 0)キューが満杯 |
from_clientid | パブリッシャーのクライアントID |
from_username | パブリッシャーのユーザー名 |
clientid | サブスクライバーのクライアントID |
username | サブスクライバーのユーザー名 |
payload | MQTTペイロード |
peerhost | クライアントのIPアドレス |
topic | MQTTトピック |
qos | メッセージのQoS |
flags | フラグ |
pub_props | PUBLISHプロパティ(MQTT 5.0クライアントのみ) |
timestamp | イベント発生時刻(単位:ms) |
publish_received_at | PUBLISHメッセージがEMQXに到達した時刻(単位:ms) |
node | イベントが発生したEMQXノード |
接続完了イベント ("$events/client_connected")
このイベントトピックは、クライアントが正常に接続した際にルールをトリガーできます。
例えば、"$events/client_connected"
イベントトピックから、クライアントID、ユーザー名、キープアライブ間隔、接続したMQTTクライアントがブリッジとして動作しているかどうかの各フィールドを抽出するには、以下のステートメントを使用します。
例:
SELECT
clientid,
username,
keepalive,
is_bridge
FROM
"$events/client_connected"
出力例:
{
"username": "u_emqx",
"keepalive": 60,
"is_bridge": false,
"clientid": "c_emqx"
}
受信したMQTTメッセージから選択可能なフィールドは以下の通りです。
フィールド | 説明 |
---|---|
clientid | クライアントID |
username | クライアントのユーザー名 |
mountpoint | ブリッジメッセージのマウントポイント |
peername | 端末のIPアドレスとポート番号 |
sockname | EMQXがリッスンしているIPアドレスとポート番号 |
proto_name | プロトコル名 |
proto_ver | プロトコルバージョン |
keepalive | MQTTキープアライブ間隔 |
clean_start | MQTTクリーンスタートフラグ |
expiry_interval | MQTTセッションの有効期限 |
is_bridge | クライアントがブリッジとして動作しているかどうか |
connected_at | クライアントの接続完了時刻(単位:ms) |
conn_props | CONNECTプロパティ(MQTT 5.0クライアントのみ) |
timestamp | イベント発生時刻(単位:ms) |
node | イベントが発生したEMQXノード |
client_attrs | クライアント属性 |
切断イベント ("$events/client_disconnected")
このイベントトピックは、クライアントが切断した際にルールをトリガーできます。
例えば、"$events/client_disconnected"
イベントトピックから、クライアントID、ユーザー名、切断理由、切断時刻、イベントが発生したEMQXノードの各フィールドを抽出するには、以下のステートメントを使用します。
例:
SELECT
clientid,
username,
reason,
disconnected_at,
node
FROM
"$events/client_disconnected"
出力例:
{
"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_start がtrue の別クライアントが同じClientIDで接続し、前の接続が切断されたtakenover : clean_start がfalse の別クライアントが同じClientIDで接続し、前の接続を引き継いだinternal_error : 不正なメッセージ形式やその他不明なエラーによる切断 |
clientid | クライアントID |
username | クライアントのユーザー名 |
peername | IPアドレスとポート番号 |
sockname | EMQXがリッスンしているIPアドレスとポート番号 |
disconnected_at | クライアント切断完了時刻(単位:ms) |
disconn_props | DISCONNECTプロパティ(MQTT 5.0クライアントのみ) |
timestamp | イベント発生時刻(単位:ms) |
node | イベントが発生したEMQXノード |
client_attrs | クライアント属性 |
接続応答イベント ("$events/client_connack")
このイベントトピックは、EMQXがクライアントにCONNACK
パケットを送信した際にルールをトリガーできます。
例:
SELECT
clientid,
username,
reason_code,
node
FROM
"$events/client_connack"
出力例:
{
"username": "u_emqx",
"reason_code": "success",
"node": "emqx@127.0.0.1",
"connected_at": 1645003578536,
"clientid": "c_emqx"
}
抽出可能なフィールドは以下の通りです。
フィールド | 説明 |
---|---|
reason_code | 理由コード* |
clientid | パブリッシャーのクライアントID |
username | パブリッシャーのユーザー名 |
peername | IPアドレスとポート |
sockname | EMQXがリッスンしているIPアドレスとポート |
proto_name | プロトコル名 |
proto_ver | プロトコルバージョン |
keepalive | MQTTキープアライブ間隔 |
clean_start | MQTTクリーンスタートフラグ |
expiry_interval | MQTTセッションの有効期限 |
conn_props | CONNECTプロパティ(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")
このイベントトピックは、クライアントの認可チェックが完了した際にルールをトリガーできます。
例:
SELECT
clientid,
username,
topic,
action,
result,
authz_source,
node
FROM
"$events/client_check_authz_complete"
出力例:
{
"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アドレス |
topic | MQTTトピック |
action | パブリッシュまたはサブスクライブのアクション |
result | アクセス制御チェックの結果 |
authz_source | 認可のソース |
timestamp | タイムスタンプ(単位:ms) |
node | イベントが発生したEMQXノード |
client_attrs | クライアント属性 |
認証チェック完了イベント ("$events/client_check_authn_complete")
このイベントトピックは、クライアントの認証チェックが完了した際にルールをトリガーできます。
例:
SELECT
clientid,
username,
reason_code,
is_superuser,
is_anonymous
FROM
"$events/client_check_authn_complete"
出力例:
{
"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")
このイベントトピックは、クライアントが正常にサブスクライブした際にルールをトリガーできます。
例:
SELECT
clientid,
username,
topic,
qos
FROM
"$events/session_subscribed"
出力例:
{
"username": "u_emqx",
"topic": "t/a",
"qos": 1,
"clientid": "c_emqx"
}
抽出可能なフィールドは以下の通りです。
フィールド | 説明 |
---|---|
clientid | クライアントID |
username | クライアントのユーザー名 |
peerhost | クライアントのIPアドレス |
topic | MQTTトピック |
qos | QoSレベル |
sub_props | SUBSCRIBEプロパティ(MQTT 5.0クライアントのみ) |
timestamp | イベント発生時刻(単位:ms) |
node | イベントが発生したEMQXノード |
client_attrs | クライアント属性 |
サブスクリプション解除イベント ("$events/session_unsubscribed")
このイベントトピックは、クライアントのサブスクリプション解除が成功した際にルールをトリガーします。
例:
SELECT
clientid,
username,
topic,
qos
FROM
"$events/session_unsubscribed"
出力例:
{
"username": "u_emqx",
"topic": "t/a",
"qos": 1,
"clientid": "c_emqx"
}
抽出可能なフィールドは以下の通りです。
フィールド | 説明 |
---|---|
clientid | クライアントID |
username | クライアントのユーザー名 |
peerhost | クライアントのIPアドレス |
topic | MQTTトピック |
qos | QoSレベル |
unsub_props | UNSUBSCRIBEプロパティ(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
が送信するすべてのメッセージに対してルールを設定するには、以下のステートメントを使用します。
例:
SELECT
*
FROM
"$bridges/mqtt:my_mqtt_bridge"
出力例:
{
"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,
}
返される出力の各フィールドは以下の通りです。
フィールド | 説明 |
---|---|
id | MQTTメッセージID |
server | リモートMQTTブローカーのサーバー名(例:"broker.emqx.io:1883") |
payload | MQTTペイロード |
topic | MQTTトピック |
qos | MQTTのQoS |
dup | MQTTのDUPフラグ |
retain | MQTTのRetainフラグ |
pub_props | PUBLISHプロパティ(MQTT 5.0クライアントのみ) |
message_received_at | メッセージ受信時刻のタイムスタンプ(単位:ms) |