はじめに
最近たまに聞くMQTTとは何かを調べる。そして折角なので、最近勉強したgo言語でいじってみる。
MQTTとは
MQ Telemetry Transportの略。
Pub/Sub型モデルを採用したシンプルかつ軽量なプロトコル。TCP/IP上で動く。
特徴の詳細は以下。
Pub/Sub型モデルのため、1対多でメッセージのやりとりが可能
Publisher
メッセージを発行する役
Subscriber
メッセージを購読する役
Broker
PubとSubの仲介役
基本的にはPublisherとSubscriberがクライアント、Brokerがサーバーと考えて差し支えないはず。
Pub =(topic A)=>| Broker |<=(topic A,B)= Sub
topic
メッセージ毎に設定する。Sub側は予め自分が購読したいtopicを指定しておく。Pubが該当のtopicのメッセージを発行した場合、Subはそれを購読する事ができる。
topicは/区切りで表現される。hoge/fuga/barみたいな感じ。topicの指定には下記の2種類のワイルドカードを使うことができる。
+: 該当の階層のみすべて。例 hoge/+/bar (hoge/fuga/bar、hoge/FUGA/buzz)
# : 該当の階層以下すべて。例 hoge/# (hoge/fuga/bar、hoge/fuga/buzz、hoge/FUGA/bar)
プロトコル仕様が簡易・軽量
固定長ヘッダーは最小で2バイト。
Willによる不意のコネクション切断時の制御
意図せずサーバーとクライアントの接続が切れた場合に、サーバーはそれを検知してクライアントが予め設定してあったtopicとメッセージを流すことができる。これをWill(遺言)という。
QoSによるメッセージ到達可能性の制御
メッセージの到達可能性を複数段階設定できる
「At most once (最高 1 回)」: メッセージは基礎となる TCP/IP ネットワークのベストエフォートに従って送達されます。メッセージの消失や重複が起こる可能性があります。このレベルはアンビエント・センサーのデータなどに利用することができます (アンビエント・センサーでは、あるデータが失われても、すぐに次のデータが公開されます)。
「At least once (最低 1 回)」: メッセージは必ず到着することが保証されますが、メッセージが重複して到着する可能性があります。
「Exactly once (正確に 1 回)」: メッセージは必ず 1 回のみ到着することが保証されます。このレベルは課金システムなどに利用することができます (課金システムではメッセージの重複や消失は誤課金につながります)。
(引用 MQ Telemetry Transport (MQTT) V3.1 プロトコル仕様)
上から順にQoS0,1,2。書いてあるように、通常はQoS0で課金だけQoS2とかにすればよい。
その他
RetainやPersistent Sessionなど。今回は割愛。
MQTTサーバーを使って見る
今回はsangoというMQTTブローカーサービスを使って、少しだけクライアント実装してみた。
といってもライブラリに使ったpahoのほぼサンプルコードをコピーしただけ。
参考文献
日本語の仕様書
WEB+DB PRESS Vol.88 IoT時代のプロトコル [速習]MQTT
akane
http://tdoc.info/blog/2014/01/27/mqtt.html
MQTTとはなんだったのか