MQTTについて
On this page
MQTTの仕組み
MQTTでは図1のように情報をSubscribe/Publishという2つのメッセージの送受信でやり取りする。
具体的に言うとPublish(pub)はMQTTブローカーに情報(メッセージ)を送る。
Subscribe(sub)はMQTTブローカーに問い合わせてMQTTにある情報(メッセージ)を貰うという流れになっている。
しかしただsub/pubでメッセージをやり取りしようとするとメッセージが複数ある場合混線するので、 "トピック"というものが用意されていてメッセージの所属(ラベル付け)することができる(図2, 3)。 さらにトピックはディレクトリのように"/"で階層構造にすることができ、メッセージの属性をわかりやすくできる。 MQTTブローカーには様々なものがあるが、世の中ではmosquittoまたはEMQがよく使われているらしい。
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)認証設定