MQTTについて

MQTT(Message Queueing Telemetry Transport)はIoTなどで使われる機械と機械(PC等)で情報をやり取りする方法の名前。
MQTTブローカーという仲介するためのコンピューターを用意することで、 シリアルのように1対1だけではなく多対多で通信が可能。




MQTTの仕組み


MQTTでは図1のように情報をSubscribe/Publishという2つのメッセージの送受信でやり取りする。
具体的に言うとPublish(pub)はMQTTブローカーに情報(メッセージ)を送る。 Subscribe(sub)はMQTTブローカーに問い合わせてMQTTにある情報(メッセージ)を貰うという流れになっている。

mqtt_schematic
図1 MQTTの概略図

しかしただsub/pubでメッセージをやり取りしようとするとメッセージが複数ある場合混線するので、 "トピック"というものが用意されていてメッセージの所属(ラベル付け)することができる(図2, 3)。 さらにトピックはディレクトリのように"/"で階層構造にすることができ、メッセージの属性をわかりやすくできる。 MQTTブローカーには様々なものがあるが、世の中ではmosquittoまたはEMQがよく使われているらしい。

mqtt_pub
図2 MQTTでのPublish
mqtt_sub
図3 MQTTでのSubscription

mosquitto

mqttを導入する場合、インターネットで1番良く目にするのが、mosquittoを使った方法である。
mosquittoのライブラリ等を使ってプログラムに書き込むこともできるが、 ここでは簡単にコマンドのみで試しに使ってみる。

インストール(Debian系)

$ sudo apt install -y mosquitto mosquitto-client

自PCにてMQTTブローカーを立ち上げて、pub/subも同じPCから投げてテストする場合。 このときターミナルを2つ立ち上げて、別のターミナルでsubを投げた後にpubを投げると、 pubで投げたメッセージがsub側に表示される。

$ sudo systemctl start mosquitto

Sub側:

$ mosquitto_sub -h localhost -t <トピック>

Pub側:

$ mosquitto_pub -h localhost -t <トピック> -m <メッセージ>

EMQ

インストール(Debian系)

$ curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash
sudo apt install emqx

MQTTのオプションについて


MQTT通信を行う際に、いくつかオプションを付けることができる。

参考: mosquitto_pub man page
参考: mosquitto_sub man page

さらに、mosquitto_subでは'#'を使ったtopicのワイルドカード指定も可能。

TLS/SSLを使う


通常のMQTTでの通信は、 MQTTブローカーにアクセスできるコンピュータからトピック・メッセージの内容を覗けてしまう。
通信にTLS/SSlを使えばそれぞれの内容を秘匿できる。因みにホームページなどのアドレスにあるhttpsでもこれが使われている。

参考: MosquittoブローカのTLS(SSL)認証設定

CA認証局の作成

サーバー証明書の作成

Mosquittoの設定