MQTTの機能概要 
~ 新仕様の紹介も少し ~ 
ツキノワ 株式会社 
若山 史郎 (@r_rudi)
おまえだれよ? 
• 若山史郎 
• Twitter ID: r_rudi 
• 著書 
• Sphinx :「 Sphinxをはじめよう」 
• Ansible: 「入門Ansible」 
• MQTT 歴: 1年ぐらい
MQTTの機能概要
MQTT 
Message Queuing Telemetry Transport (MQTT) 
• MQTT is a machine-to-machine (M2M)/"Internet of Things" 
connectivity protocol. It was designed as an extremely lightweight 
publish/subscribe messaging transport. It is useful for connections 
with remote locations where a small code footprint is required 
and/or network bandwidth is at a premium. (mqtt.org) 
• MQTTは “machine-to-machine (M2M)/Internet of Things” 
の接続に使うプロトコルです。 
軽量なPublish/Subscribe型のメッセージトランスポートとし 
て設計されています。小さいフットプリントが要求されたり、 
ネットワーク帯域が高価な遠隔地との接続に使われます。
MQTTの特徴的な仕様 
• 軽量 
• 双方向 
• QoS 
• Pub/Sub型 
• 階層型Topic 
• Will 
• Retain 
• CleanSession
軽量 
• プロトコルオーバーヘッドが小さい 
• 固定ヘッダーは2バイトのみ 
! 
! 
• 注1: 軽量と言っても1メッセージで256MBまでのデー 
タを扱えます 
• 注2: 小さいのはヘッダのみです。中身は変わりません
双方向 
• 一本のコネクションで双方向通信を行う 
• Push通信 
• NAT配下でも動作する 
• TCPコネクションを維持する 
• 3way handshakeのオーバーヘッドがない 
• コネクションが切れた場合の対応も(will)
QoS 
• 到達可能性を選択できる 
• QoS 0: 最高1回。届くかは保証しない 
• QoS 1: 少なくとも一回。重複する可能性がある 
• QoS 2: 正確に一回 
• QoSはメッセージごとに変更できる 
• 「普段は0だが、重要なデータは2で送信」
Publish/Subscribe型 
Server 
Publisher 
Publisher 
Topic 
Subscriber 
Subscriber 
Topic 
Subscriber 
Publisher
余談: MicroService? 
Server 
ProcessA 
ProcessA 
Topic 
ProcessB 
ProcessB 
Topic 
Filter 
Converter
階層型Topic 
• 階層構造を“/“ 区切りで表現 
r_rudi 
house_1 house_2 
room_1 room_10 
light light 
r_rudi/house_2/room_10/light 
door 
r_rudi/house_2
階層型Topic 
• “#”で以下のすべてのトピックを対象 
r_rudi 
house_1 house_2 
room_1 room_10 
light light 
r_rudi/house_2/# 
door
階層型Topic 
• “+” で一つの階層全部を選択 
r_rudi 
house_1 house_2 
room_1 room_10 
light light 
r_rudi/house_2/+/light 
door
MQTTはM2M/IoT向けプロトコル 
1. ネットワークが切れやすい 
2. 電池が小さいため処理間隔が長い 
MQTTの解法 
• Will 
• Retain 
• CleanSession
Will (遺言) 
• 接続が切れた場合に指定のメッセージを送る 
_人人人人人人_ 
> 突然の死 < 
‾Y^Y^Y^Y^Y^Y^‾ 
A Server B 
CONNECT おれが死んだら 
keep alive 
a/dead にメッセージを 
送ってくれ 
PUBLISH 
SUBSCRIBE 
a/dead 
PUBLISH
Retain 
• 最後に送ったメッセージを保存 
A Server B A Server B 
今30だよSUBSCRIBE 
今31だよ 
この間は 
わからない… 
31だったのか! 
3時間経過 
今30だよ 
SUBSCRIBE 
今31だよ 
わかる! 
今30だよ
CleanSession(durable session) 
• 接続が切れている間のメッセージも保存して 
くれる 
SUBSCRIBE 
A 
B 
C 
D 
A 
SUBSCRIBE 
B C D 
A Server B
デモ 
http://github.com/shirou/mqttcli
MQTTの仕様
MQTTの歴史 
IBMと 
Eurotechが開発 
1999 
ロイヤリティ 
フリー 
OASISに 
寄贈 
(3.1) 
OASIS 
標準に 
(3.1.1) 
2010 2013 2014 
OASIS: 国際的な標準化団体。 
 AMQP、OpenDocumentなどの仕様を策定
MQTT 3.1.1 
• OASIS標準に向けて策定中 
• 現在最終プレビュー中 
• 問題なければ2014/9/27にOASIS標準に 
• 3.1との差はあまりない 
• 仕様の曖昧な部分の明文化がほとんど 
• Serverを書く人が気にする必要がある程度
3.1.1の主な変更点 
• パケット内のプロトコル名が変更 
• “MQIsdp”から“MQTT”に 
• Topic名やClientIDがUTF-8に固定 
• CONACKを受け取る前にパケットを送って良 
くなった 
• 待たなくてすむため、高速化
まとめ 
• MQTTはM2M/IoTに適したプロトコル 
• 最小2バイトの小さいヘッダ 
• 階層型Topic、 Pub/Sub型、QoS 
• Will、Retain、CleanSession 
• OASIS標準として新仕様策定中

MQTT meetup in Tokyo 機能概要