MQTT プロトコル
VuGen の MQTT プロトコルは,マシンツーマシン(M2M)通信とモノのインターネット(IoT)通信を使用したネットワークのテストをサポートしています。
MQTT について
MQTT は,シンプルで軽量なパブリッシュ/サブスクライブ・メッセージング・プロトコルであり,制約の厳しいデバイスや,低帯域幅,高レイテンシ,信頼性の低いネットワーク用に設計されています。
MQTT は,M2M や IoT 通信,そして帯域幅とバッテリ電力が重視されるモバイル・アプリケーションにも最適です。MQTT は,ネットワーク帯域幅とデバイス・リソース要件を最小限に押さえることを重視しています。その一方で,配信の信頼性および一定度の確実性が得られるようにも努めています。
MQTT は,クライアントとサーバ間の通信に発行者とサブスクライバのやり取りを使用します。MQTT サーバは,クライアント間の通信を制御するメッセージ・ブローカです。
クライアント,つまり「モノ」は,発行者にもサブスクライバにもなれます。
- 発行者は,メッセージを送信するクライアントです。メッセージは,トピックを指定して,メッセージブローカに送信されます。
- サブスクライバは,メッセージを受信するクライアントです。トピックに関するメッセージを受信するには,サブスクライバがトピックをサブスクライブする必要があります。
MQTT スクリプトの作成
MQTT スクリプト・ウィザードを使用してスクリプトの属性を生成するか,定義済みの MQTT 関数を使用して手動でスクリプトを作成できます。
スクリプトのクライアント変数は,ソリューション・エクスプローラからアクセスする[追加ファイル]> globals.h ファイルで宣言されます。
MQTT スクリプトを作成するには,次の手順を実行します。
-
[新規スクリプトおよびソリューション]>[MQTT プロトコル]を選択して,新しいスクリプトを作成します。
利用可能なすべての MQTT 関数を使用して,すぐに使用できるスクリプトがエディタで開きます。さらに,[スクリプト ウィザード]が別のダイアログ・ボックスで自動的に開きます。
-
次のいずれかの方法でスクリプトを設計します。
- スクリプト・ウィザードを使用して,スクリプトを生成します。詳細については,「MQTT スクリプト・ウィザード」を参照してください。
- [キャンセル]をクリックしてスクリプト・ウィザードを閉じ,すぐに使用できるスクリプト・テンプレートを必要に応じて変更します。MQTT 関数および関数呼び出しの詳細については,関数リファレンスを参照してください。
注: マルチ・プロトコル・スクリプトを作成する場合は,MQTT ステップを Web - HTTP/HTML 記録スクリプトにまとめることができます。詳細については,「マルチ・プロトコル・スクリプトを使った作業」 を参照してください。
-
実行環境を設定します。これは,仮想ユーザ・スクリプトがどのように実行されるかに影響します。
-
ソリューション・エクスプローラで[実行環境設定]をダブルクリックします。
-
[<テスト名>: 実行環境設定]ビューで,必要に応じて実行環境設定を構成します。個々の実行環境設定の説明を表示するには,実行環境設定のフィールド名の上にカーソルを置きます。
-
MQTT スクリプト・ウィザード
MQTT スクリプト・ウィザードを使用すると,MQTT スクリプトのコードとして生成される設定を定義できます。
新しい MQTT スクリプトを作成すると,スクリプト・ウィザードが自動的に表示されます(標準設定)。ウィザードは,VuGen ツールバーの[スクリプトのデザイン]をクリックして開くこともできます(MQTT スクリプトをエディタで開くと,[スクリプトのデザイン]ボタンが使用可能になります)。
UI 要素
|
説明
|
---|---|
[接続の設定]タブ | |
ブローカ URL |
ブローカ・サーバのアドレスです。tcp://host:port または ssl://host:port という形式で指定します。host には,角括弧に入れたドメイン名,IPv4 アドレス,または IPv6 アドレスが入ります。IPv6 アドレスの例: [2001:0db8:85a3:0000:0000:8a2e:0370:7334]。 ポートを指定しない場合,次の標準設定のポートが使用されます。
|
クライアント ID |
接続に使用するクライアント ID を定義します。この文字列は,ネットワーク内でクライアントを一意に識別する ID です。自動生成された ID を使用するには,フィールドを空白のままにします。 クライアントは次のように識別されます。
|
認証設定 | 必要に応じて,ブローカ・サーバにログオンするユーザ名とパスワードを定義します。 |
TLS を有効にする | TLS(SSL)を介したセキュアな通信が必要かどうかを選択し,ドロップダウン・リストから該当する[TLS バージョン]を選択します。[標準設定]では,実行環境設定で定義されたバージョンが使用されます。 |
クライアント証明書を使用する |
クライアント証明書を使用することを選択し,証明書ファイルと秘密鍵のパス,秘密鍵のパスワードを定義します(鍵が暗号化されていない場合は,[パスワード]フィールドを空のままにします)。 |
接続チェック | クリックすると,定義された資格情報を使用して,VuGen がブローカに正常に接続できることを確認します。接続が成功した場合は緑色のチェックマークが表示され,失敗した場合は赤い十字が表示されます。 |
新規スクリプトの場合にウィザードを表示する |
新しい MQTT スクリプトの作成時にスクリプト・ウィザードを自動的に開かないようにする場合は,チェック・ボックスをオフにします。 ヒント: スクリプト・ウィザードが自動的に開かない場合は,VuGen ツールバーの[スクリプトのデザイン]をクリックして開くことができます。 |
すべてクリア | クリックすると,すべてのタブのすべての設定がクリアされます。 |
コードの生成 | このボタンが有効になっている場合,クリックすると,関連するステップがスクリプトのコードに追加されます。または,次のタブに進んでオプションの設定を定義します。 |
[クライアント設定]タブ | |
発行者/サブスクライバ |
これらのオプションのいずれかの値を定義します。ラジオ・ボタンを使用して,オプションを切り替えます。
|
発行するトピック | メッセージを発行するための宛先トピック。例: myhome/kitchen/temperature/1 |
ペイロード | 発行するメッセージをバイト形式で設定します。 |
メッセージを保持する |
オンにすると,トピック内の最後に保持されたメッセージと QoS を保存するようにブローカに指示します。トピックごとに 1 つのメッセージのみが保存されるため,以前に保存されたメッセージは,常に最後に保存されたメッセージによって置き換えられます。 この設定によって,新しいサブスクライバがトピックをサブスクライブする場合に,最新のステータスを提供することができます。そのため,次のステータス更新を待つ必要がありません。 |
サービス品質 |
必要なサービス品質(QoS)。たとえば,QoS が 0 になって接続が失われた場合は,クライアントは再接続後にパブリッシュを再試行しません。また,スクリプトの出力に警告が表示されます。 値は 0 ~ 2 および標準設定です(実行環境設定で定義)。 |
サブスクライブするトピック |
クライアントがサブスクライブするトピックまたはトピックのセットを指定するために使用します(ワイルドカードを使用します)。ブローカは,これらのトピックについて,発行されたメッセージを自動的に送信します。トピックにはワイルドカードを含めることができます。 例:
実行環境設定で定義されているデフォルトの QoS が使用されます。 |
[Last Will and Testament]タブ | |
トピック | 強制的に切断されたクライアントについて他のクライアントに通知する宛先トピックを定義します。 |
ペイロード | クライアントが予期せず切断したときに,指定されたトピックのサブスクライバにブローカが送信するメッセージを設定します。 |
メッセージを保持する | オンにすると,このトピックの最後に保持されたメッセージを保存するようブローカに指示します。トピックごとに 1 つのメッセージのみが保存されるため,以前に保存されたメッセージは,常に最後に保存されたメッセージによって置き換えられます。 |
MQTT スクリプト・ウィザードを使用して,既存のクライアント(スクリプトにすでに関連付けられているクライアント)の追加属性を定義できます。クライアントは,ウィザードで指定されているクライアント ID によって定義されます。
以下の追加属性を定義できます。
-
発行者: クライアントには複数の発行者を設定できます。既存のクライアントについて発行者を作成すると,新しい発行者は,対応するクライアントの Actions.c ファイルに追加されます。
-
サブスクライバ: クライアントは,一度に 1 つのトピックのみをサブスクライブできます。サブスクライバが既存のクライアント用に作成された場合,コードの生成時に,既存のクライアントにサブスクライバが設定されているかどうかが検証されます。クライアントにサブスクライバが設定されている場合,ウィザードで設定したサブスクライバは無視されます。サブスクライバが設定されていない場合は,vuser_init.c ファイルの
client_settings()
関数にサブスクライバが追加されます。対応するサブスクライブ解除は,対応するクライアントが vuser_end.c ファイルで切断される前に追加されます。 -
Last Will and Testament: 1 つのクライアントに設定できる Last Will and Testament(LWT)メッセージは,1 つだけです。LWT メッセージが既存のクライアント用に作成された場合,コードの生成時に,既存のクライアントに LWT が設定されているかどうかが検証されます。クライアントに LWT メッセージが設定されている場合,ウィザードで設定したメッセージは無視されます。メッセージが設定されていない場合,vuser_init.c ファイルの
client_settings()
関数で,対応するクライアントに新しい LWT 関数が追加されます。
マルチ・プロトコル・スクリプトを使った作業
スクリプトが次の両方を使用するシナリオをテストできます。
-
MQTT(クライアントとブローカ間の通信に使用)
-
Web - HTTP/HTML(ブローカと Web アプリケーション間の通信に使用)
Web アプリケーション上のステップを記録して,スクリプトを準備します。次に,必要に応じて MQTT ステップを手動で追加します。マルチ・プロトコル・スクリプトの作業をするときに,事前入力済みの MQTT スクリプトは含まれていませんが,すぐ使用できる MQTT スクリプト・テンプレートからコピー/貼り付けを行うことができます。
サポートを有効にするには,次の手順を実行します。
-
MQTT と Web - HTTP/HTML を含むマルチ・プロトコル・スクリプトを作成します。詳細については,「[新規スクリプトの作成]ダイアログ・ボックス」 を参照してください。
-
Web スクリプトを記録します。
注: Web スクリプトを記録すると,globals.h が上書きされ MQTT ステップに対する標準設定のサポートが削除されます。
-
MQTT ステップのサポートを復元します。
-
globals.h を開きます(ソリューション・エクスプローラの[追加ファイル]にあります)。
-
#include "MqttApi.h" をインクルード・ファイル・セクションに追加します。
-
-
MQTT ステップをスクリプトに追加します。
マルチ・プロトコル・スクリプトのサンプル
Action() { MQTT client; client = mqtt_create(); mqtt_set_client_id(client, "myclientid"); lr_start_transaction("connect_MQTT"); mqtt_connect(client, "tcp://mymachine:1883"); lr_end_transaction("connect_MQTT", LR_AUTO); lr_start_transaction("navigate_Web"); // 記録した Web コードをここに lr_end_transaction("navigate_Web", LR_AUTO); mqtt_publish(client, "topic/subtopic", "payload", MQTT_AUTO, MQTT_DEFAULT, MQTT_NORETAIN); mqtt_disconnect(client); return 0; }
すぐ使える MQTT スクリプト・テンプレート
標準設定のシングル・プロトコル MQTT スクリプトには,次に示すように,事前入力されたアクション(ステップはコメントアウト)が含まれています。
マルチ・プロトコルのスクリプトで作業する場合は,まず Web アプリケーション上のステップを記録します。次に,必要に応じて MQTT ステップを追加します。下のテンプレートから関連ステップのコピー/貼り付けを行うことができます。
これらの関数の詳細については,関数リファレンスを参照してください。
vuser_init
vuser_init() { /* "globals.h" 内で宣言 */ client = mqtt_create(); /* オプションの接続設定 */ // mqtt_set_client_id(client, "<insert Client ID>"); // mqtt_set_credentials(client, "<username placeholder>", "<password placeholder>"); // mqtt_set_lwt(client, "<topic>", "<sample lwt payload>", MQTT_AUTO, MQTT_DEFAULT, MQTT_RETAIN); /* オプションの SSL/TLS 設定。SSL/TLS にのみ適用 */ // mqtt_set_tls_certificate(client, "<path to a certificate file, e.g. cert.pem>", "<path to a private key file, e.g. key.pem>", "<password for the private key>"); // mqtt_set_tls_parameters(client, MQTT_TLS_DEFAULT, MQTT_DEFAULT_CIPHERS); /* MQTT ブローカに接続 */ mqtt_connect(client, "tcp://<enter an MQTT broker host name>"); /* "subscriber" ロジックを実装する場合は,次の箇所をコメント解除してください。 // mqtt_subscribe(client, "<topic>"); return 0; }
Action
Action() { /* "subscriber" ロジックを実装する場合は,次の箇所をコメント解除してください。vuser_init/end.c 内の subscribe/unsubscribe も忘れずにコメント解除してください */ // /* オプション 1: メッセージを待機し,その内容を処理する */ // size_t messageCount = mqtt_await_messages(client, MQTT_DEFAULT); // size_t i = 0; // for ( ; i < messageCount; i++) // { // MQTT_MESSAGE m = mqtt_read_inbox(client); // const char* p = mqtt_get_payload(m); // const char* t = mqtt_get_topic(m); // size_t l = mqtt_get_length(m); // ... メッセージに関して意味のある操作を実行します。 // ... たとえば,受信メッセージ情報の印刷などを実行します(ペイロードがバイナリ・データではないと仮定) // lr_message("received message with size %d from %s", l, t); // lr_message("payload %.*s", l, p); // // mqtt_free_message(m); // } /* オプション 2: メッセージを待機し,受信トレイをクリアする(処理が不要な場合)*/ // mqtt_await_messages(client, MQTT_DEFAULT); // mqtt_clear_inbox(client); /* "publisher" ロジックを実装する場合は,次の箇所をコメント解除してください。 */ // mqtt_publish(client, "<topic>", "<payload>", MQTT_AUTO, MQTT_DEFAULT, MQTT_RETAIN); return 0; }
vuser_end
vuser_end() { /* "subscriber" ロジックを実装する場合は,次の箇所をコメント解除してください。 // mqtt_unsubscribe(client, "<topic>"); /* MQTT ブローカから切断 */ mqtt_disconnect(client); return 0; }