この記事の要点
- MQTTは、サーバ(ブローカー)を介してメッセージを配る、軽量なpublish/subscribe型のプロトコル。送る側と受ける側が互いを知らなくてよい。
- 最新の版はOASIS標準のMQTT 5.0(2019年3月7日)。前の版の3.1.1はISO/IEC 20922:2016にもなっている。
- QoSは0(最大1回)・1(最低1回、重複ありうる)・2(ちょうど1回)の3段階。確実さが上がるほど、やり取りの回数が増える。
- TCPなど順序どおり欠けずに届く通信の上で動く。IANA登録ポートは1883(TLSなし)と8883(TLS)。
MQTTとは?一言でいうと?
MQTTは、ブローカーと呼ばれるサーバを介して、センサなどからのメッセージを必要な相手に配る軽量なプロトコルです。OASISの仕様書は、MQTTを「クライアント・サーバ型のpublish/subscribeメッセージング転送プロトコル」で、軽量・オープン・簡単で実装しやすく、M2MやIoTのような制約のある環境に向くと説明しています(2026年9月27日確認)。
現在の版は、2019年3月7日にOASIS標準となったMQTT 5.0です。その前のMQTT 3.1.1は2014年10月29日にOASIS標準となり、ISO/IEC 20922:2016として国際標準にもなっています。
データを送る側(パブリッシャ)と受け取る側(サブスクライバ)が直接つながらず、ブローカーだけと接続するのが最大の特徴です。センサはブローカーの宛先さえ知っていればよく、受け手が何台いるか、今つながっているかを気にする必要がありません。
ブローカー・トピック・publish/subscribeはどう動く?
工場の温度センサの値を、監視画面と記録用サーバの2か所で受け取る例で、流れを順に追います。
- 購読(subscribe):監視画面と記録用サーバが、ブローカーに「factory/line1/temp というトピックを受け取りたい」と登録する
- 発行(publish):温度センサが、トピック factory/line1/temp を付けて測定値をブローカーへ送る
- 配信:ブローカーは、そのトピックを購読しているすべてのクライアント(監視画面と記録用サーバ)へ同じメッセージを届ける
- 追加・削除:受け手が増えても減っても、センサ側の設定は変わらない
トピックは / で区切った階層で表します。購読するときはワイルドカードが使えます。+ は1階層だけに一致し(factory/+/temp は factory/line1/temp に一致するが factory/line1/zone2/temp には一致しない)、# は下のすべての階層に一致します(factory/# は factory 以下すべて)。# は最後にしか置けず、発行するメッセージのトピック名にワイルドカードは使えません。
MQTTはTCP/IPのように順序どおりに欠けずに届く双方向の通信の上で動きます。仕様書は、TLSやWebSocketも使えるとし、TCPの1883番(TLSなし)と8883番(TLS)がIANAに登録されていると記しています。一方、UDPのように欠けたり順序が入れ替わったりする通信は、それだけでは適さないとしています。
QoS 0・1・2は何が違う?保持メッセージとWillの働きは?
QoS(Quality of Service)は、メッセージをどの程度確実に届けるかの段階です。仕様書が定める3段階を比べます。
| QoS | 届き方の保証 | 起こりうること | やり取りするパケット | 向く用途の例 |
|---|---|---|---|---|
| 0 | 最大1回(at most once) | 欠けることがある | PUBLISHのみ | 数秒ごとに上書きされる温度の値 |
| 1 | 最低1回(at least once) | 重複して届くことがある | PUBLISH → PUBACK | 警報の通知(重複は受け手で除く) |
| 2 | ちょうど1回(exactly once) | 欠けも重複もない | PUBLISH → PUBREC → PUBREL → PUBCOMP | 課金や在庫など重複が困る記録 |
← 表は横にスクロールできます →
確実さが上がるほどやり取りの回数が増え、通信量と遅れが増えます。「QoS 2が常に最良」ではなく、データの性質に合わせて選ぶのが設計の考え方です。
保持メッセージ(retained message)は、RETAINフラグを1にして発行すると、ブローカーがそのトピックの最新の1通を保存し、後から購読したクライアントにもすぐ届ける仕組みです。空のメッセージを保持付きで送ると、保存が消えます。機器の現在の状態(電源のオン・オフなど)を、つないだ直後に知りたいときに使います。
Willメッセージ(遺言)は、クライアントが接続時にあらかじめ預けておき、正常な切断の手順を踏まずに接続が切れたときにブローカーが代わりに発行するメッセージです。電池切れや故障による突然の切断を、ほかの機器に知らせられます。
Keep Aliveは、クライアントが通信の間隔の上限を秒で宣言するものです。ブローカーはその1.5倍の時間に何も届かなければ、接続が切れたものとして扱います。
MQTT 5.0では、すべての応答に結果を示す理由コードが付き、セッションの有効期限、メッセージの有効期限、要求・応答のパターンなどが加わりました(仕様書の付録「MQTT v5.0の新機能」より)。
IoT中級ではどこで、どう問われる?
MQTTは、IoTシステム技術検定 中級の出題カテゴリ「センサ/アクチュエータ技術と通信方式(デバイス、ネットワーク、LPWA、プロトコル)」の「プロトコル」に当たります。公式ページの図では比率が25〜30%です(MCPC公式ページ、2026年9月27日確認)。公式テキスト『IoT技術テキスト 第4版』では第4章「IoT通信方式」に当たる範囲です(章とカテゴリの対応は当サイトの推定)。
MQTTの出題数は公表されていません。4択の問われ方としては、次のような観点が考えられます(当サイトの予想で、出題の再現ではありません)。
- QoS 0・1・2と「最大1回・最低1回・ちょうど1回」の対応
- ブローカー・パブリッシャ・サブスクライバの役割の組合せ
- 保持メッセージとWillメッセージの説明の入れ替え
- HTTPやCoAPと比べたときの通信モデル(publish/subscribeか、要求・応答か)と下位のプロトコル(TCPかUDPか)
HTTPとの使い分けは HTTPとMQTTの使い分け、UDPで動くCoAPとの違いは CoAPとは にまとめています。現場の機器とクラウドの間でブローカーへの中継を担う装置は IoTゲートウェイとは で扱います。
どこで取り違えやすい?つまずき別の見直し表
| 取り違え | 正しい整理 | 見直す手がかり |
|---|---|---|
| QoS 1は重複しないと思う | QoS 1は最低1回。重複して届くことがある | 重複なしはQoS 2だけ |
| パブリッシャとサブスクライバが直接つながると思う | どちらもブローカーとだけ接続する | 中継役=ブローカー(サーバ) |
| MQTTはUDPで動くと思う | TCP/IPなど順序どおりに欠けずに届く通信の上で動く。UDP単体は適さない | UDPで動くのはCoAP |
| 保持メッセージは全履歴を保存すると思う | 保存されるのはトピックごとの最新の1通 | 後から来た購読者への「最新値」 |
| Willは正常に切断したときに送られると思う | 正常な切断の手順を踏まずに切れたときにブローカーが発行する | 突然の切断を知らせる仕組み |
| ワイルドカードの+と#を逆に覚える | +は1階層、#は下の全階層(最後にだけ置ける) | #は「全部」 |
← 表は横にスクロールできます →
確認問題1:QoS 1の説明として正しいのは?
MQTTのQoS 1の説明として、最も適切なものはどれか。
- 最大1回の配信で、欠けることがあるが確認応答は送らない
- 最低1回の配信で、欠けはないが重複して届くことがある
- ちょうど1回の配信で、4回のやり取りで欠けと重複を防ぐ
- 配信の保証はなく、ブローカーが届け先を選んで間引く
正解:2。QoS 1は「最低1回(at least once)」で、PUBLISHに対してPUBACKで受領を確認します。確認が届かないと再送するため、受け手には同じメッセージが重複して届くことがあります。
1はQoS 0の説明です。3はQoS 2の説明で、PUBLISH・PUBREC・PUBREL・PUBCOMPの4つのパケットでやり取りします。4のような「ブローカーが間引く」段階はQoSに定義されていません。
確認問題2:あとから購読した画面に最新値を出すには?
照明のオン・オフの状態をトピックで発行している。あとから起動した操作画面が購読した直後に、現在の状態をすぐ表示できるようにしたい。最も適切な方法はどれか。
- 発行するときのQoSを0から2に引き上げる
- Willメッセージに現在の状態を書いておく
- Keep Aliveの間隔を短くして通信を増やす
- RETAINフラグを付けて状態を発行する
正解:4。RETAINフラグを付けて発行すると、ブローカーがトピックごとの最新の1通を保存し、あとから購読したクライアントにもすぐ届けます。
1のQoSは届け方の確実さを決めるもので、購読前に発行されたメッセージを後から届ける仕組みではありません。2のWillは、接続が異常に切れたときにブローカーが発行するメッセージで、状態の保存には使いません。3のKeep Aliveは接続が生きているかを確かめる間隔で、最新値の配信とは関係しません。
確認問題3:トピックフィルタが一致するのはどれ?
MQTTで、トピックフィルタ factory/+/temp を購読したとき、配信の対象になるトピック名はどれか。
- factory/temp
- factory/line1/zone2/temp
- factory/line1/temp
- office/line1/temp
正解:3。+ はちょうど1階層に一致するワイルドカードなので、factory と temp の間に1階層だけある factory/line1/temp が一致します。
1は間の階層がないため一致しません。2は間に2階層あるため、+ 1つでは一致しません(下の全階層に一致させるには # を使います)。4は先頭の階層が factory ではないため一致しません。
同じ形式の4択を、ほかの分野と混ぜて解いてみるなら IoT中級の無料お試し20問 へ。登録なしで全問の解説を読めます。
よくある質問
MQTTのブローカーには何を使えばいいですか?
オープンソースのブローカーソフトウェアや、クラウド事業者のIoTサービスに含まれるブローカーなど、選択肢は複数あります。検定の学習では製品名より、ブローカーが購読の管理と配信を担うという役割を押さえてください。
MQTT 3.1.1と5.0はどちらを覚えればいいですか?
publish/subscribe・トピック・QoS・保持メッセージ・Willといった基本の仕組みは両方に共通です。5.0で加わったのは、すべての応答に付く理由コードや、セッション・メッセージの有効期限などです。まず共通部分を確実にし、5.0の追加点は名前と目的を確認する程度で十分です。
MQTTの通信は暗号化されていますか?
MQTTの仕様書は、通信内容の秘匿や改ざん検知の手段としてTLSを挙げ、TLSを提供するサーバは8883番ポートを使うよう強く推奨しています。TLSを使わない1883番の通信では、ユーザー名・パスワードを含めて経路上で読まれるおそれがあります。
出典・参考
本番と同じペースで腕試し
記事の次は、本番形式の問題で。
公式の出題カテゴリの比率どおりに組んだ無料お試しを、登録不要・カード不要で解けます。続きの模試と章別ドリルは買い切りで、月額はかかりません。
あわせて読みたい
当サイトは、モバイルコンピューティング推進コンソーシアム(MCPC)とは関係のない個人が運営する非公式の学習教材です。掲載している問題はすべて当サイトのオリジナルで、実際の試験問題・過去問題・再現問題ではありません。試験の日程・受検料・出題範囲は公式サイト(https://www.mcpc-jp.org/license/ )で必ず確認してください。合格を保証するものではありません。合格の目安は当サイトの推定です。技術・制度の記述は「最終確認日」時点のものです。