コンテンツにスキップ
MQTT API

MQTT API

Machbase Neoは、MQTTプロトコルでデータを取り込み、検索できます。

MQTT APIは、Machbaseのappend機能を活用して書き込み性能を最大化できる点でHTTPより優れています。MQTTはセッション中に接続を維持するため、クライアントはメッセージを繰り返し送信してデータを記録できます。また、MQTTは多くのIoT機器で広く使用されています。

そのため、センサーが収集したデータをMachbase Neoに送信するには、MQTTが最も効率的です。

データ書き込みの流れ

以下の例は、MQTTクライアント(mosquitto_pub)でデータを効率的に記録する方法を示しています。 送信先トピックは、db/write/にテーブル名を連結した文字列である必要があります。

    sequenceDiagram
    CLIENT->> SERVER: CONNECT
    activate SERVER
    SERVER -->> CLIENT: CONNACK
    deactivate SERVER
    loop
        CLIENT ->> SERVER: PUBLISH 'db/write/{table_name}'
        activate SERVER
        SERVER -->> CLIENT: PUBACK
        deactivate SERVER
    end
    CLIENT->> SERVER: DISCONNECT
  

データ検索の流れ

一般的なMQTTブローカーは、以下の図のように特定のトピックを購読するすべてのクライアントにメッセージを配信します。パブリッシャーがTOPICM1M2を送信すると、SUBSCRIBER-ASUBSCRIBER-Bは同じメッセージを受信します。

    flowchart LR
PUBLISHER -->|m1,m2| TOPIC

TOPIC -->|m1, m2| A(SUBSCRIBER-A)
TOPIC -->|m1, m2| B(SUBSCRIBER-B)
  

Machbase Neoも標準のMQTTブローカーと同様に、すべてのメッセージを購読者に配信します。ただし、クエリの応答メッセージは、要求したクライアントにのみ送信します。つまり、パブリッシャーとサブスクライバーが同じ接続(MQTTでいうセッション)を共有している場合にのみ、クエリ結果が配信されます。Machbase Neoはメッセージブローカーとして動作しますが、クエリ結果のメッセージを他の購読者には複製しません。

たとえば、CLIENT-MCLIENT-Pが同じTOPICを購読しているとします。 サーバーがCLIENT-M宛てのメッセージM1M2TOPICに送信すると、これらはCLIENT-Mにのみ届き、 CLIENT-Pは、サーバーが直接指定したP1P2を受信します。別のクライアントPUBLISHER-XTOPICX1を送信すると、サーバーには届きますが、他のクライアントにはこのイベントは通知されません。

    flowchart LR

M -->|m1|Q(db/query)
P -->|p1|Q(db/query)

R -->|m2|M(CLIENT-M)
R -->|p2|P(CLIENT-P)

Q -->|m1| SERVER
Q -->|p1| SERVER
SERVER--> |m2|R(db/reply)
SERVER--> |p2|R
  

アプリケーションからMQTTでMachbase Neoにクエリを実行するには、まずdb/replyを購読する必要があります。 以下のシーケンス図は、CLIENTがQoS 1を使用する例です。 Machbase Neoは、MQTT v3.1.1のQoS 0と1に対応しています。

CONNECTCONNACKでMQTTセッションを確立した後、db/queryにクエリメッセージを送信する前に、必ずdb/replyを購読してください。購読していない場合は、クエリ結果を受信できません。

    sequenceDiagram
    CLIENT->> SERVER: CONNECT
    activate SERVER
    SERVER -->> CLIENT: CONNACK
    deactivate SERVER

    CLIENT ->> SERVER: SUBSCRIBE 'db/reply'
    activate SERVER
    SERVER -->> CLIENT: SUBACK
    deactivate SERVER

    loop async
        CLIENT ->> SERVER: PUBLISH 'db/query'
        activate SERVER
        SERVER -->> CLIENT: PUBACK
        deactivate SERVER

        SERVER ->> CLIENT: PUBLISH 'db/reply'
        activate CLIENT
        CLIENT -->> SERVER: PUBACK
        deactivate CLIENT
    end

    CLIENT->> SERVER: DISCONNECT
  

メッセージ➍、➎は、MQTTプロトコルの特性によりサーバーから非同期に送信されます。そのため、クライアントアプリケーションでは、この2つのメッセージが特定の順序で届くことを前提にしないでください。

📌
クライアントがデータの書き込みのためにdb/appendにのみ発行する場合は、db/replyの購読は不要です。このトピックはクエリ結果を受信する場合にのみ必要です。

この章の内容

最終更新日