Compose-5000:Composeを使用したMQTTブローカーへの接続
Tutorial Level: Advanced MQTT(Message Queuing Telemetry Transport)プロトコルを使用して、クライアントからIoTプラットフォーム(外部ブローカー)にパブリッシュおよびサブスクライブします。
このチュートリアルの前提条件
このチュートリアルには以下のソフトウェアとアカウントが必要です:
- Altair Compose
- Altair SmartWorksプラットフォームの無料アカウント: https://studio.swx.altairone.com/
概要
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で を選択します。
Thingが作成されると、Composeからデータを受け取り、IoT Studioに保存されるプロパティが作成されます。
-
を選択します。
-
このオブジェクトに帰属するPropertiesを作成します:
-
IoT StudioでMQTT認証情報を設定するには、 を選択します。
IoT StudioのMQTTトピックへのパブリッシング
-
セッションに接続している既存のクライアントをクリアします:
cld_all = mqttclientinfo('clientids'); if ~isempty(fieldnames(cld_all)) cellfun(@mqttdestroy,{cld_all(:).clientids}, 'uniformoutput', 0); end
-
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
-
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';
-
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));
-
正弦波データを個別に送信するループを作成します。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トピックへのサブスクライブ
-
セッションに接続している既存のクライアントをクリアします:
cld_all = mqttclientinfo('clientids'); if ~isempty(fieldnames(cld_all)) cellfun(@mqttdestroy,{cld_all(:).clientids}, 'uniformoutput', 0); end
-
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
-
ブローカー(この場合は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関数が使用されます。 -
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]
-
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');
-
すべてのセットアップが完了したら、ブローカーにサブスクライブし、IoTプラットフォームに送信されるすべてのメッセージを受信します:
[mid1, rc1, msginfo1] = mqttsubscribe(clientid, topic, 0);
Composeがトピックにサブスクライブしていることを考慮すると、あるデバイスからそのトピックに何らかのメッセージが送信された場合、Composeはそれを受信します:MQTTプロトコルを使用して、IoT Studioから送信されたデータがComposeで受信されます。