MQTT-SN
IoTで用いられる通信プロトコルとしてMQTTがある。TCP上で動作するアプリケーション層プロトコルである。
MQTT-SNは、そのUDP版。
以下、UbuntuでMQTT-SNのクライアントとブローカを動かし、通信パケットをWiresharkでキャプチャして観察する方法を記載する。
MQTT-SNブローカのインストール&使い方
事前準備としてbuild-essential(Cプログラムのコンパイル&実行に必要なツール群)がUbuntuにインストール済みかどうかを確認する。
$ apt list build-essential --installed
何も表示されない場合は、未インストールなので、以下コマンドを実行する。
$ sudo apt update
$ sudo apt install build-essential
$ unzip master.zip
$ cd mosquitto.rsmb-master/rsmb/src
$ make
すると、mosquitto.rsmb-master/rsmb/srcディレクトリ内に実行可能ファイルがいくつか生成される。
broker_mqttsがMQTT-SNブローカである。(brokerはMQTTブローカ)
ブローカを動かす前に、設定ファイルを作る。
$ nano myrsmb.conf
ファイル名は何でも良いが、ここではmyrsmb.confとしている。以下のように記述する。
listener 1883 INADDR_ANY mqtts
ここではポート番号として1883を指定している。他のポート番号でも良い。
ブローカを動かすときは、以下のように設定ファイルを指定して実行ファイルを実行する。
$ ./broker_mqtts myrsmb.conf
MQTT-SNクライアントのインストール&使い方
$ unzip main.zip
$ cd mqtt-sn-tools-main
$ make
すると、mqtt-sn-tools-mainディレクトリ内に実行可能ファイルがいくつか生成される。
mqtt-sn-pubがPublisherプログラム、mqtt-sn-subがSubscriberプログラムである。
仮に、ブローカがIPアドレス192.168.30.100、ポート番号1883で動いているとすると、Subscriberを動かすには以下のようにコマンドを打つ。
$ ./mqtt-sn-sub -h 192.168.30.100 -p 1883 -t foo
これで、トピック「foo」をサブスクライブできる。
Publisherを動かすには、
$ ./mqtt-sn-pub -h 192.168.30.100 -p 1883 -t foo -m "hello"
これで、トピック「foo」にメッセージ「hello」が送られる。
なお、PublisherもSubscriberも、デフォルトの宛先IPは127.0.0.1(ローカルホスト)、ポート番号は1883となっている。
したがって、ローカルホストでブローカを動かしており、ブローカの待受ポートが1883である場合は、 -hおよび-pオプションは不要。
Publisherを上記のように動かすと、メッセージをひとつ送るためだけにConnect/Disconnectをおこなうので、通信効率が悪い。
CONNECT → PUBLISH → DISCONNECT → CONNECT → PUBLISH → DISCONNECT → ・・・
そこで、以下のように打つと、Publishを連続して送ることができる。
$ ./mqtt-sn-pub -h 192.168.30.100 -p -t foo -l
-lオプションは、標準入力からメッセージを入力する、というオプションである。
1行が1メッセージとなる。
標準入力からの入力をおこなっている間は、ひとつのMQTT-SNセッションが使われる。
Ctrl-Dを押すと(EoFが入力されることで)MQTT-SNセッションが閉じる。
CONNECT → PUBLISH → PUBLISH → PUBLISH → ・・・DISCONNECT
Wiresharkのインストール&使い方
$ sudo apt update
$ sudo apt install wireshark
途中、権限について聞かれるので、Yesを選択する。
以下のようにsudo権限で起動する。
$ sudo wireshark
sudoで起動しないと、一部ネットワークインタフェースにアクセスすることができない。
GUIが出てくるので、ネットワークインタフェース一覧からパケットをキャプチャしたいインタフェースを選択する。
ローカルホスト上での通信をキャプチャするならloを選ぶ。
外部との通信をキャプチャするなら、eth0等、該当するインタフェースを選ぶ。
WiresharkによるMQTT-SNパケットの観察
ここでは、ブローカを通るパケットを観察する。
Wiresharkとブローカを起動した状態で、クライアントプログラムを実行すれば、Wireshark上にパケットが表示される。
デフォルトではMQTT-SNパケットと判別してくれない場合があるので、その場合は上部メニューからAnalyze > Decode As...を選び、FieldにはUDP portを、Valueにはブローカのポート番号(1883等)を、CurrentにはMQTT-SNを入力する。
これで、MQTT-SNパケットを自動判別して、内容(Connect, Publish等)を表示してくれるはずである。
なお、上部メニューからEdit > Preferences > Protocols > MQTT-SNを選び、MQTT-SN UDP portにブローカのポート番号を入れることでも、このポート番号における通信がMQTT-SNプロトコルと判断されるようになる。
ただし、複数ポート指定はできないようである(カンマ区切りで入れてみたが、だめだった)。
Display filterにmqttsnと入れておくと、MQTT-SN以外のパケットが表示されなくなり、見やすい。
上部メニューからFile > Saveを選択すると、pcapngファイルとして保存できる。
保存したファイルは、あとで開いて見直すことができる。