MQTTについて


On this page

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

  • Host (-h <アドレス>): MQTTブローカーのアドレスを指定
  • Topic (-t <トピック名>): Topicを指定
  • Message (-m <メッセージ>): Messageを送る
  • QoS (-q <QoS(0,1,2)>): 0,1,2を指定できる。qosは通信の品質で数字が大きいほどよいが、その分重い。
    • 0: MQTTブローカーに対してメッセージを投げっぱなし (最大1回(once at most))
    • 1: MQTTブローカーに対してメッセージを投げて、MQTTブローカーから受け取ったという連絡が来るまで同じメッセージを投げる (最低1回(once at least))
    • 2: MQTTブローカーに対してメッセージを投げて、MQTTブローカーから受け取ったという連絡が来るまで同じメッセージを投げ、重複して投げないように互いに確認し合う (必ず1回(exacly once))
  • retain (-r): 送ったメッセージをMQTTブローカーが保持する。次に同じtopicでメッセージが来ると上書きされる。
  • verbose (-v): Subscribeのみでtopicとメッセージの両方を表示(通常はメッセージのみ)

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

TLS/SSLを使う

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

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

CA認証局の作成

サーバー証明書の作成

Mosquittoの設定