Compose-5000:Composeを使用したMQTTブローカーへの接続

Tutorial Level: Advanced MQTT(Message Queuing Telemetry Transport)プロトコルを使用して、クライアントからIoTプラットフォーム(外部ブローカー)にパブリッシュおよびサブスクライブします。

重要: Valid only with Altair Communication Extension.

このチュートリアルの前提条件

このチュートリアルには以下のソフトウェアとアカウントが必要です:

概要

Composeの通信プロトコルのオプションの1つは、IoT(モノのインターネット)で使用される有名な通信プロトコルであるMQTTです。ローカル、外部を問わず、あらゆるMQTTブローカーへのパブリッシュとサブスクライブの両方を、迅速かつ軽快に行うことができます。

トピックにメッセージを発行する際、Composeはソフトウェアからブローカーにデータを送信します。トピックにサブスクライブすると、ブローカーからソフトウェアにデータを受信します。

このチュートリアルでは、外部MQTTブローカーは、Altair SmartWorks上にあります。これは、スマート製品やコネクテッド製品の開発に必要な技術をすべて網羅したエンドツーエンド Altair IoTプラットフォームです。SmartWorksでは、実世界でのエンティティを表すThingsを作成することができます。アセット、部屋、建物のような実世界のオブジェクトや、タスクやプロセスのような概念に関する情報を格納します。これらのThingsは、Composeがパブリッシングしている場合はデータを受信し、ComposeがMQTTトピックにサブスクライブしている場合はデータを送信します。IoTプラットフォーム上のデータを使って、ダッシュボードを作成することができます:https://help.altair.com/smartworks/topics/mqtt_dashboard.htm?hl=mqtt

IoT Studio-IoTプラットフォームでの一般的なセットアップ

IoT Studioでアカウントを作成したら、IoTプロジェクトを構築するためのSpaceを1つ作成します。Thingは、Composeからデータを送受信するために作成されます。Spaces、Things、およびMQTT認証情報に関する名前はすべて、ユーザーごとに異なる必要があります。
  1. IoT StudioCreate New Space > AnythingDB > Things > New Thing > Createを選択します。

    Thingが作成されると、Composeからデータを受け取り、IoT Studioに保存されるプロパティが作成されます。

  2. Properties (+) > Createを選択します。
  3. このオブジェクトに帰属するPropertiesを作成します:
  4. IoT StudioでMQTT認証情報を設定するには、Interfaces > MQTT Create Credentials > Set Username and Password > Saveを選択します。

IoT StudioのMQTTトピックへのパブリッシング

このチュートリアルでは、MQTT コマンドを使用してソフトウェアから IoT プラットフォームにデータを送信し、MQTTを使用してデータをブローカーに発行するプロセスを、標準Composeスクリプトを使用して説明します。
  1. セッションに接続している既存のクライアントをクリアします:
    cld_all  = mqttclientinfo('clientids');
    if ~isempty(fieldnames(cld_all))
    	cellfun(@mqttdestroy,{cld_all(:).clientids}, 'uniformoutput', 0);
    end
  2. Composeには、クライアントがサーバーからCONNACK (接続メッセージと応答メッセージ)を受信したときに応答を返す便利な機能があります。そのためには、コールバック関数を記述する必要があります:
    function connect_mqtt_callback(clientid, rc, Mqttmessageinfo)
    if rc == 0;
    	printf('CONNACK return message for clientid %s: %s\n', clientid, Mqttmessageinfo);
    else
    	printf('Failed to connect broker with clientid %s: %s\n', clientid, Mqttmessageinfo);
    end
    end
  3. host、port、credential、topic 属性など、MQTT関数で使用するために必要なすべての引数を宣言します:
    host = 'mqtt.swx.altairone.com';
    port = 1883;
    space = 'demo-models';
    thing_id = '01HE682NDWSZ0F61JSFE0ZB6TE';
    property = 'obj1';
    topic = ['spaces/' space '/things/' thing_id '/properties'];
    user = 'cmodel@demo-models';
    password = 'cmodel';
  4. IDを取得し、そのIDを使ってメッセージを送信するクライアントを設定します。これはMQTT接続を設定する最初のステップです。このチュートリアルでは、以下のコードを使用してクライアントを設定し、コールバック関数を使用して接続が確立されたかどうかを通知します:
    clientid = mqttclient(host, 'port', port, 'username', user, 'password', password ...
    			, 'keepaliveduration', 5, 'on_connect', 'connect_mqtt_callback');
    この場合、単純な正弦波信号が生成され、クライアントに送信されます。
    注: パブリッシュセクションでより効率的に操作するのにセルが使用されます:
    t = [0:0.1:10];
    time = num2cell(t);
    amplitude = num2cell(sin(t));
  5. 正弦波データを個別に送信するループを作成します。IoT Studioは、データにJavaScript Object Notation (JSON)形式を要求します。そのため、正弦波の各セルにアクセスし、データを個別に操作する関数が使用されます。最後に、0.5秒を一時停止条件としてプロットを作成し、送信されたデータを確認します:
    for i = 1:length(t)
    	msg = jsonencode(struct(property, struct('amplitude', num2str(time{i}), 'time', num2str(amplitude{i}))));
    	[mid, rc, msginfo] = mqttpublish(clientid, topic, msg, 2, true);
    	pause(0.5);
    	if rc == 0
    		printf('Publishing to MQTT broker %s\n', host)
    		printf('Send message %s with ID:%s, to topic: %s\n',num2str(amplitude{i}),num2str(mid), topic)
    	end
    	stem(t(i),amplitude{i});
    	hold on;
    end

    MQTTプロトコルを使用して、Composeから送信されたデータがIoT Studioで受信されます。

IoT StudioのMQTTトピックへのサブスクライブ

このチュートリアルでは、MQTTコマンドを使用してIoTプラットフォームからソフトウェア上でデータを受信するプロセスを、標準Composeスクリプトを使用して説明します。
  1. セッションに接続している既存のクライアントをクリアします:
    cld_all  = mqttclientinfo('clientids');
    if ~isempty(fieldnames(cld_all))
    	cellfun(@mqttdestroy,{cld_all(:).clientids}, 'uniformoutput', 0);
    end
  2. Composeには、クライアントがサーバーからCONNACK (接続メッセージと応答メッセージ)を受信したときに応答を返す便利な機能があります。そのためには、コールバック関数を記述する必要があります:
    function connect_callback(clientid, rc, Mqttmessageinfo)
    	if rc == 0;
    		printf('CONNACK return message for clientid %s: %s\n', clientid, Mqttmessageinfo);
    	else
    		printf('Failed to connect broker with clientid %s: %s\n', clientid, Mqttmessageinfo);
    	end
    end
    クライアントがブローカーにサブスクライブしたときにメッセージを受け取るコールバック関数を持つことができます:
    function subscribe_callback(clientid, mid, grand_qos)
    	printf('message id: %s\n', num2str(mid));
    end
  3. ブローカー(この場合はIoT Studio)からメッセージを取得します。これはこのモデルの最後のコールバック関数です:
    function msg_callback(clientid, topic, msg)
    	data = jsondecode(msg);
    	printf('amplitude: %s\ntime: %s', data.obj1.amplitude, data.obj1.time);
    end
    注: データのデコードには、IoT Studioからのメッセージがそのフォーマットを持っているため、JSON関数が使用されます。
  4. host、port、credential、topic 属性など、MQTT関数で使用するために必要なすべての引数を宣言します:
    host = 'mqtt.swx.altairone.com';
    port = 1883;
    space = 'demo-models';
    thing_id = '01HE682NDWSZ0F61JSFE0ZB6TE';
    property = 'obj1';
    topic = ['spaces/' space '/things/' thing_id '/properties/' property]
  5. IDを取得し、そのIDを使ってメッセージを送信するクライアントを設定します。これはMQTT接続を設定する最初のステップです。このチュートリアルでは、以下のコードを使用してクライアントを設定し、コールバック関数を使用して接続が確立されたかどうかを通知します:
    clientid = mqttclient(host, 'port', port, 'username', user ...
    			,'password', password, 'keepaliveduration',5 ...
    			,'on_connect','connect_callback' ...
    			,'on_subscribe','subscribe_callback' ...
    			,'on_message','msg_callback');
  6. すべてのセットアップが完了したら、ブローカーにサブスクライブし、IoTプラットフォームに送信されるすべてのメッセージを受信します:
    [mid1, rc1, msginfo1] = mqttsubscribe(clientid, topic, 0);
    Composeがトピックにサブスクライブしていることを考慮すると、あるデバイスからそのトピックに何らかのメッセージが送信された場合、Composeはそれを受信します:

    MQTTプロトコルを使用して、IoT Studioから送信されたデータがComposeで受信されます。