...

テスト仮想化技術検証 ーMQTT- IBM Confidential © 2015 IBM Corporation

by user

on
Category: Documents
69

views

Report

Comments

Transcript

テスト仮想化技術検証 ーMQTT- IBM Confidential © 2015 IBM Corporation
テスト仮想化技術検証
ーMQTT-
IBM Confidential
© 2015 IBM Corporation
目次
はじめに
(参考)MQTTについて
使用環境
確認・検証項目




–
–
–
–
–
2
サービスの論理/物理リソース定義
レコーディング
テストの作成および実行
スタブの作成および実行
その他
© 2015 IBM Corporation
IBM Confidential
はじめに
~MQTTプロトコル仮想化~
 MQTT(MQ Telemetry Transport)プロトコルを使用するサー
ビスに対する通信の記録、テストやスタブの作成および実行につ
いての設定方法の確認や実機検証を行う
 確認・検証項目
–
–
–
–
サービスの論理/物理リソース定義(トポロジー・ディスカバリー含む)
レコーディング
テストの作成および実行
スタブの作成および実行
 基本構成
パブリッシュ/サブスクライブ型
デバイス
(クライアント)
パブリッシュ
Eclipse Paho MQTT
Clients Sample
3
MQTTブローカー
test.mosquitto.org
© 2015 IBM Corporation
サブスクライブ
アプリケーション
(サービス)
Eclipse Paho MQTT
Clients Sample
IBM Confidential
(参考)MQTTについて
パブリッシュ/サブスクライブ型
デバイスA
アプリケーションX
MQTTブローカー
・・・
…
・・・
トピック1
トピック2
デバイスB
MQTTプロトコル
• デバイスとアプリケーションが疎結合であり、通信
相手の存在を意識せずに使用できる。
• パブリッシュ/サブスクライブ型であるため、メッ
セージを仲介するMQTTブローカーが必要となる。
• シンプルで通信オーバーヘッドが小さく、クライア
ント実装のフットプリントも小さい。
• デバイスにMQTTクライアント実装が必要となる
(マイコン機器などでは、実装が難しい場合もあ
る)。
• トランスポート・レベルの暗号化、デバイスの接続
認証、送達保障(QoS)など、IoTにおいて有用な
機能をプロトコル・レベルでサポートしている。
 IoT向けに設計されたプロトコルであるため、有用な機能が多く使いやすい。
パブリッシュ/サブスクライブ型であるため、ブローカーを用意する必要がある。
4
© 2015 IBM Corporation
IBM Confidential
Cons
Pros
MQTTプロトコル
アプリケーションY
使用環境
 MQTTブローカー
–
–
5
Web上で公開されているオープンなMQTTテスト環境であるtest.mosquitto.orgを利用
test.mosquitto.orgはオープンソースのMQTTブローカー実装であるMosquittoがHostingされ
たテスト用環境
© 2015 IBM Corporation
IBM Confidential
使用環境
 MQTTクライアント
–
–
–
6
基本構成におけるデバイスおよびアプリケーションはいずれもMQTTクライアントとしてMQTT
ブローカーを介したMQTT通信を行う
MQTTクライアントを実装するための代表的なMQTTクライアント・ライブラリとして以下のも
のがある
• IBM Mobile Messaging and M2M Client Pack MA9B
– IBM提供のMQTTクライアント・ライブラリ
– Java(Pahoベース)、C、JavaScriptをサポート
• Eclipse Paho MQTT Clients
– オープンソースのMQTTクライアント
– C、C++、Java、JavaScript、Python and Goをサポート
• MQTT.js
– Node.js用MQTTクライアント
上記のMobile Messaging and M2M Client Pack MA9Bに含まれるEclipse Pahoベースの
サンプルアプリケーションをMQTTクライアントとして検証では利用する
© 2015 IBM Corporation
IBM Confidential
確認・検証項目
 サービスの論理/物理リソース定義
–
–
手作業による定義
トポロジー・ディスカバリー
–
–
テストの作成
テストの実行
 レコーディング
 テストの作成および実行
 スタブの作成および実行
–
–
–
スタブの作成
直接モード
プロキシーモード
–
ポート・フォワード・プロキシー設定
 その他
7
© 2015 IBM Corporation
IBM Confidential
サービスの論理/物理リソース定義
 手作業による定義
デバイス
(クライアント)
アプリケーション
(サービス)
MQTTブローカー
手作業
RIT
 トポロジー・ディスカバリー
デバイス
(クライアント)
プロキシー
MQTTブローカー
(インターセプト)
ディスカバリー
8
© 2015 IBM Corporation
アプリケーション
(サービス)
RIT
IBM Confidential
サービスの論理/物理リソース定義
 手作業による定義
–
「アーキテクチャー・スクール」パースペクティブ上で論理MQTT接続を作成
(参考)
http://www-01.ibm.com/support/knowledgecenter/SSBLQQ_8.7.0/com.ibm.rational.rit.protocol.doc/topics/
t_ritmqtt_creating_logical_mqtt_connections.html
9
© 2015 IBM Corporation
IBM Confidential
サービスの論理/物理リソース定義
–
接続をバインドする物理MQTTブローカーを作成。MQTTブローカーへの接続情報を設定
MQTTブローカーのホスト
とポートを指定
接続テストを実施し、「MQTTブローカーに正
常に接続しました」と表示されればOK
10
© 2015 IBM Corporation
IBM Confidential
サービスの論理/物理リソース定義
–
–
MQTT接続を開き、「レコーディング・スタジオ」タブに記録対象のトピックを指定
指定したトピック(複数可)に対してパブリッシュされたメッセージのみが記録対象となる
以下のワイルドカードが使用可能
・番号記号 (#) 文字は階層の完全なサブ
ツリーを表すため、サブスクリプション
・トピック・ストリングの最後の文字に
使用
(例:top1/top2/#)
・正符号 (+) 文字は、階層の単一レベル
を表し、区切り文字 (/) 相互の間に使用
(例:top1/+/top3)
11
© 2015 IBM Corporation
IBM Confidential
サービスの論理/物理リソース定義
–
–
12
物理ビュー上では物理MQTTブローカーを確認することができる
スタブ・モードは「直接」(デフォルト)および「プロキシーでのシフトおよびパススルーの
使用」から選択する
© 2015 IBM Corporation
IBM Confidential
サービスの論理/物理リソース定義
 トポロジー・ディスカバリー
–
–
–
–
13
MQTTプロトコルのトポロジー・ディスカバリーにも対応している
この場合、プロトコル監視に使用するインターセプトはTCPインターセプト(実体はHTTP/TCP
プロキシー)となる
MQTT通信をキャプチャーするため、監視対象となるMQTTクライアントまたはアプリケーショ
ンとMQTTブローカーとの間の通信をインターセプト(プロキシー)経由で実行する必要がある
• このため必要なHTTP/TCPプロキシーの設定については次頁を参照
TCPインターセプトを監視ポイントとしてディスカバリーを開始し、MQTT通信を実行すると以
下のようにリソースが検出される。検出対象はパブリッシュのみである
© 2015 IBM Corporation
IBM Confidential
HTTP/TCPプロキシーの設定
–
–
–
MQTTはHTTPと異なるプロトコルのため、HTTPのプロキシー設定ではMQTT通信のプロキシ
ー設定は実現できない。そのためHTTP/TCPプロキシーのTCP転送規則を設定し、リバース・
プロキシーとして構成することによりHTTP/TCPプロキシーを経由したMQTT通信を実現する
プロキシーのTCP転送規則設定はregistration.xml上に転送規則を記述することにより行い、っ
プロキシーに対する通信がMQTTブローカーを宛先として転送されるように設定する。設定変
更した後はプロキシーを再始動する必要がある
• disconnect属性(省略可能)については設定値により挙動に違いは見られず
MQTTクライアント/アプリケーションはMQTTブローカーではなくプロキシーを宛先として
MQTT通信を実行するように構成する
・・・
<!-The following example forwarding rules demonstrate the use of different bind addresses.
IP address - binds to the specified adapter.
0.0.0.0 binds to all addresses/adapters on the machine and is useful if you don‘t kn
the specific hostname/IP that the machine is actually listening on
localhost - only allows connections FROM the local machine and should only be used
-->
<forward bind=“0.0.0.0:1883" destination="test.mosquitto.org:1883" type="mqtt" />
<!-<forward bind="localhost:1883" destination="example.com:1883" type="mqtts" disconnect="live" />
-->
14
© 2015 IBM Corporation
IBM Confidential
サービスの論理/物理リソース定義
–
15
検出されたリソースを選択し、モデル化される対象を確認の上、モデル化を実行する
© 2015 IBM Corporation
IBM Confidential
サービスの論理/物理リソース定義
–
16
以下の論理/物理リソースが生成される
• 論理リソース(論理ビュー)
– MQTT接続
– オペレーション(宛先トピック名と同名)
• 物理リソース(物理ビュー)
– MQTTブローカー
© 2015 IBM Corporation
IBM Confidential
レコーディング
 直接サブスクライブによる記録
–
RITのMQTTサポートでは、使用される MQ TTブローカーに接続し、そのブローカーから伝達
されるトピックに直接サブスクライブすることにより、MQTTトラフィックを記録できる。
• HTTP/TCPプロキシーを介在せず、RITが直接サブスクライバーとしてMQTTブローカー
へ接続してメッセージを取得している
• RITはクライアント/アプリケーションを特に区別せず、指定したトピックにパブリッシ
ュされた全てのメッセージを記録する
• プロキシー方式による記録はサポートされていない
デバイス
(クライアント)
記録
17
アプリケーション
(サービス)
MQTTブローカー
© 2015 IBM Corporation
RIT
IBM Confidential
レコーディング
–
18
パブリッシュされたメッセージがイベント・ビューに記録される
© 2015 IBM Corporation
IBM Confidential
レコーディング
–
記録されるMQTTヘッダーおよびメッセージ本文は以下の通り
• ヘッダーの値はRITがMQTTブローカーから受信する際のメッセージのヘッダー値が入るた
め、QoSヘッダーの値などは常に0になる(デバイス→ブローカーのメッセージにおけるヘ
ッダーは記録できない)
ヘッダー
メッセージ本文
19
© 2015 IBM Corporation
IBM Confidential
レコーディング
–
20
宛先トピックによるフィルタリングが可能。またトピック名のワイルドカード指定(#,+)も
できる
© 2015 IBM Corporation
IBM Confidential
(参考)MQTTのQoS機能
 クライアントの不安定な稼働環境を想定し、クライアント⇔サー
バー間のメッセージ送達保証レベルを3段階で指定可能
–
–
–
21
QoS = 0 :メッセージは1回のみ送信される(送信先に届くかは保証しない)
QoS = 1 :メッセージは最低1回は送信先に送られる(重複の可能性あり)
QoS = 2 :メッセージは必ず正確に1回送信先に送られる
© 2015 IBM Corporation
IBM Confidential
テストの作成および実行
 テスト実行によるパブリッシュ
–
MQTTにおけるテストでは、RIT上に作成したテストからMQTTブローカーに対してテスト・メ
ッセージをパブリッシュすることにより、当該メッセージ(トピック)をサブスクライブして
いるアプリケーションを検証することができる
デバイス
(クライアント)
MQTTブローカー
RIT
テスト
22
アプリケーション
(サービス)
パブリッシュ
© 2015 IBM Corporation
IBM Confidential
テストの作成および実行
 テストの作成
–
–
通常通り作成すると、パブリッシュ・アクションが追加されたテストが作成される
パブリッシュ・アクションのプロパティ画面でMQTTヘッダーやメッセージの設定を実施
• メッセージ本文はバイト配列のため、文字列を設定する場合はスキーマ「バイト」をメッ
セージのdata要素に適用すればよい(記録から作成する場合は適用済みのため不要)
スキーマ・セレクター
23
© 2015 IBM Corporation
IBM Confidential
テストの作成および実行
 テストの実行
–
–
24
テストに設定されたメッセージがMQTTブローカーにパブリッシュされる
アクションを追加することにより、特定トピックのサブスクライブ等を行うことも可能
© 2015 IBM Corporation
IBM Confidential
スタブの作成および実行
 直接モードでのスタブ実行
デバイス
(クライアント)
アプリケーション
(サービス)
MQTTブローカー
RIT
スタブ
サブスクライブ
 プロキシーモードでのスタブ実行
デバイス
(クライアント)
プロキシー
MQTTブローカー
ルーティング
25
© 2015 IBM Corporation
アプリケーション
(サービス)
RIT
スタブ
IBM Confidential
スタブの作成および実行
 スタブの作成
–
–
26
通常通り作成すると、パブリッシュされたメッセージを受信するのみのスタブが作成される
アクティビティーにログやパブリッシュ等のアクションを追加してスタブを構成する
© 2015 IBM Corporation
IBM Confidential
スタブの作成および実行
 スタブの実行(直接モード)
–
–
27
MQTTブローカーに対してサブスクライバーとして稼動するスタブを実行する
直接モードの場合、パススルー(パススルー・アクションのデフォルト)がサポートされない
ため、アクションを破棄に変更する。(パススルーのままだと以下のように実行時にコンパイ
ル・エラーが発生する)
© 2015 IBM Corporation
IBM Confidential
スタブの作成および実行
 スタブの実行(プロキシーモード)
–
–
28
MQTTブローカー自体のスタブとして稼動するスタブを実行する
物理MQTTブローカーを開き、「スタブ」タブでスタブ・モードを以下のように変更する。その
上でスタブを実行するとルーティング規則が設定されスタブが起動する
© 2015 IBM Corporation
IBM Confidential
スタブの作成および実行
–
プロキシーからMQTTブローカーに接続できない状況でスタブを起動した場合、クライアント
に対してエラーが返され、スタブが利用できない
• MQTTクライアントからプロキシーに接続要求する際、プロキシーからMQTTブローカー
に対しても接続要求が必ず行われるためである
クライアントにおけるエラー出力
Connecting to tcp://localhost:1883 with client ID mqtt_client_sample
reason 32109
msg 接続喪失
loc 接続喪失
cause java.io.EOFException
excep 接続喪失 (32109) - java.io.EOFException
接続喪失 (32109) - java.io.EOFException
at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiv
er.java:142)
at java.lang.Thread.run(Thread.java:795)
Caused by: java.io.EOFException
at java.io.DataInputStream.readByte(DataInputStream.java:279)
at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqtt
WireMessage(MqttInputStream.java:56)
at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiv
er.java:103)
... 1 more
29
© 2015 IBM Corporation
IBM Confidential
スタブの作成および実行
–
–
30
パススルー・アクションを破棄に設定しておくことで、スタブのロジックを実行した後、
MQTTブローカーにメッセージを送信せずに処理が終了する。アクションをパススルーにする
とスタブのロジックを実行した上でメッセージをMQTTブローカーへ転送する
いずれの場合もMQTTクライアント側でのパブリッシュ処理が終了せずハング
• MQTT.jsを使用したJavaScriptクライアントでアクセスすると正常に動作するため、おそ
らくPahoライブラリ(Java)の問題であると考えられる
© 2015 IBM Corporation
IBM Confidential
ポート・フォワード・プロキシー設定
–
物理MQTTブローカーのポート・フォワード・プロキシーを設定すると、RITからポート・フォ
ワード・プロキシー経由でブローカーに接続する
• KCにはHTTP/TCPプロキシーを指定すると記載されているが、このプロキシーは
HTTP/TCPプロキシーである必要はない(TCPポート・フォワードが可能であればOK)
• FW越しにRIT-MQTTブローカー接続する場合などに使用すると考えられる
デバイス
(クライアント)
MQTTブローカー
アプリケーション
(サービス)
Port Forward
プロキシー
RIT
31
© 2015 IBM Corporation
IBM Confidential
ポート・フォワード・プロキシー設定
–
物理MQTTブローカーのポート・フォワード・プロキシーを設定すると、プロキシーモードの
スタブにおけるルーティング規則が構成されず、スタブへのルーティングが行われない
• 記録、テスト、直接モードのスタブはプロキシー経由でブローカーに接続して正常に動作
する
• 一旦設定すると設定を外しても該当のMQTTブローカーではプロキシーモードのスタブが
動作しない(MQTTブローカーの再作成が必要)
デバイス
(クライアント)
プロキシー
MQTTブローカー
アプリケーション
(サービス)
Port Forward
プロキシー
ルーティング
32
© 2015 IBM Corporation
RIT
スタブ
IBM Confidential
ポート・フォワード・プロキシー設定
–
前頁の状態で該当のスタブをRTCPへパブリッシュし、RTVS上で起動したところ、ルーティン
グ規則が正常に設定され、スタブが稼動した
• RIT側のスタブ用ルーティング生成部分の問題だと考えられる
デバイス
(クライアント)
プロキシー
MQTTブローカー
アプリケーション
(サービス)
Port Forward
プロキシー
RIT
パブリッシュ
ルーティング
33
© 2015 IBM Corporation
RTVS
スタブ
IBM Confidential
Fly UP