0
2

More than 1 year has passed since last update.

MQTT通信テストツールの便利な使い方

Last updated at Posted at 2022-12-23

はじめに

本記事ではMQTT関連で以下のツールのちょっとした便利な使い方を紹介します。
(Wiresharkはパケットキャプチャツールですが)

  • MQTTX(MQTTクライアント)
    • 連続Publish、Publish/Subscribe時にメッセージにタイムスタンプなどを追加方法
  • Wireshark(パケットキャプチャ)
    • MQTT関連の情報(メッセージなど)の表示方法

Publisher - Subscriber間通信のテストやトラブルシューティング時に利用できるかなと思います。
なお、MQTT Brokerは構築済みであることを前提としています。MQTT Brokerの構築手順などには触れません。

MQTTX

以下のようなことをやりたいときに使えるMQTTXの機能について紹介していきます。

  • Publishをx秒ごとにしたい
  • Publish/Subscribe時にタイムスタンプをメッセージに追加したい
  • Publishをx秒ごとにする際に何回目の送信なのかをメッセージに追加したい

インストール方法やBrokerへの接続方法、基本的なPublish/Subscribe使い方は以下のリファレンスを参照してください。
MQTTX/manual-jp.md at main · emqx/MQTTX

Publishをx秒ごとにしたい

Timed Message機能でx秒ごとにPublishすることができます。
Broker接続後、「・・・」をクリックしTimed Messageをクリックします。
image.png

すると以下のようにMessage frequency(s)を設定できますので、送信したい間隔(秒)を入力しConfirmをクリックします。
image.png

Timed Message設定後、通常と同じようにPublishを行うと設定した間隔でPublishをしてくれます。
以下はMessage frequencyに1秒を指定した場合の例です。
image.png

停止する際には右上のClear timerアイコンをクリックします。

Publish/Subscribe時にタイムスタンプをメッセージに追加したい

Script機能でメッセージに追加することができます。
左のメニューから下図の赤枠アイコンをクリックすると、Script(Javascript)を記載できる画面に移動できます。
Scriptに書いたコードに対してInputにメッセージを指定してTestすることができます。
image.png

こちらはメッセージにタイムスタンプを追加するサンプルです。

function handlePayload(value) {
  let _value = value;
  if (typeof value == 'string') {
    _value = JSON.parse(value)
  }
  _value.ts = new Date().toISOString();
  return JSON.stringify(_value);
}

execute(handlePayload)

引数valueでメッセージが渡されてきます。Scriptを保存し、Brokerに接続します。
接続後、下図のように「・・・」をクリックしRun Scriptをクリックします。
image.png

以下のようなScript設定が表示されるため、Script nameに先ほど保存したScriptを設定します。
mqttx_6.png

Applied toには以下のようにいつScriptを反映させるかを指定します。

  • All: Publish/Subscribe両方
  • Received: Subscribe時
  • Published: Publish時

以下はPublish時にScriptを反映した際のPublishです。元のメッセージにタイムスタンプがtsフィールドとして追加されています。
image.png

Scriptの反映を取り消す場合には右上のStop scriptアイコンをクリックします。

Publishをx秒ごとにする際に何回目の送信なのかをメッセージに追加したい

※2022/11にリリースされたv1.9.0で追加されたようです。
紹介したTimed MessageScript機能を組み合わせて以下のようにタイムスタンプ以外にもcount(連続送信の何回目なのか)フィールドも追加して連続Publishすることができます。

{"val":"hello","client_ts":"2022-12-22T02:28:35.054Z","count":1}
{"val":"hello","client_ts":"2022-12-22T02:28:36.121Z","count":2}
{"val":"hello","client_ts":"2022-12-22T02:28:37.115Z","count":3}
{"val":"hello","client_ts":"2022-12-22T02:28:38.088Z","count":4}

以下のようなScriptを作成します。

function handlePayload(value, msgType, index) {
  let _value = value;
  if (typeof value == 'string') {
    _value = JSON.parse(value)
  }
  _value.client_ts = new Date().toISOString();
  _value.count = index;
  return JSON.stringify(_value);
}

execute(handlePayload)

PublishedにScriptを反映しTimed Messageを利用した場合に渡される引数の値は以下のようになっています。

引数 渡される値
value メッセージ
msgType 固定値"Publish"
index Timed Messageでの送信回数

なので引数indexをcountフィールドとしてメッセージに追加しています。

Script保存後、先ほど紹介したように各機能以下のように設定します。

  • Run Script: Publish時に反映
  • Timed Message: x秒ごと

設定後、Publishすると以下のようにx秒ごとにタイムスタンプと送信回数がメッセージに追加されてPublishされます。
image.png

※公式のScriptのサンプルを参考にしました。以下に数種類あります。
MQTTX/docs/script-example at main · emqx/MQTTX

Wireshark

今回はキャプチャしたMQTTパケットの中からMQTTに関する情報を表示する方法を紹介します。
Wiresharkのインストール方法、使い方、キャプチャの方法については触れません。

取得したパケットキャプチャファイルをWiresharkで開きます。
編集 > 設定から設定画面を開きます。
外観 > メニューを開きます。
ここから表示する列を追加することができます。以下のようにMQTTのメッセージ、QoS、バージョンの列を追加します。

題名 種別 フィールド
mqtt_msg Custom mqtt.msg_text
mqtt_qos Custom mqtt.qos
mqtt_ver Custom mqtt.ver

image.png

追加後、OKを押しパケット一覧表示画面に戻ると以下のように追加したMQTTの情報が表示されます。
image.png

他のMQTTに関する表示を追加したい場合は以下のリファレンスなどを参考にしてみてください。
Wireshark · Display Filter Reference: MQ Telemetry Transport Protocol

おわりに

本記事ではMQTT関連でMQTTXとWiresharkのちょっとした便利な使い方を紹介しました。
これで少しでも作業が楽になったらなと思います!

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2