LoginSignup
5
5

More than 5 years have passed since last update.

MQTTブローカーサービスのsangoをgo言語でいじってみる

Posted at

はじめに

最近たまに聞く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とはなんだったのか

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5