MQTTプロトコルとは何か
MQTT(Message Queuing Telemetry Transport)は、IoTデバイス間の通信に特化した軽量メッセージングプロトコルです。1999年にIBMのAndy Stanford-ClarkとArcom社のArlen Nipperが、石油パイプラインの遠隔監視のために設計しました。限られた帯域幅と不安定なネットワーク環境でも確実にデータを届けることを目的に作られています。
最近では、スマートホームデバイスやロボット掃除機、産業用センサーなど、ありとあらゆるIoTデバイスで使われるようになりました。実は先日話題になったDJI Romoロボット掃除機の脆弱性も、MQTTの認証設計が原因でした。
MQTTの基本的な仕組み:Pub/Subモデル
MQTTの通信モデルは「パブリッシュ/サブスクライブ(Pub/Sub)」方式です。HTTP APIのようなリクエスト/レスポンス型とは根本的に異なります。
登場するのは3つの要素だけです。パブリッシャー(データを発信するデバイス)、サブスクライバー(データを受信するデバイス)、そしてブローカー(メッセージを中継するサーバー)。パブリッシャーは「トピック」と呼ばれるチャンネルにメッセージを送り、そのトピックを購読しているサブスクライバー全員にメッセージが届く仕組みですね。
たとえば温度センサーが「home/living-room/temperature」というトピックに25.3という値をパブリッシュすると、そのトピックをサブスクライブしているスマホアプリやダッシュボードに自動的にデータが届きます。
MQTTが軽量と言われる理由
MQTTのメッセージヘッダーはわずか2バイトからスタートします。HTTPリクエストが数百バイトのヘッダーを必要とするのと比べると、圧倒的に小さいことがわかるかと思います。
この軽量さが重要な理由は、IoTデバイスの多くがバッテリー駆動で、CPUやメモリも限られているからです。また、セルラー回線やLoRaWANなど帯域幅が制限されたネットワークでも効率的に通信できます。
さらに、MQTTは永続的なTCP接続を維持するため、新しいメッセージが発生するたびに接続を確立し直すオーバーヘッドがありません。これもバッテリー消費を抑える大きなポイントです。
QoS(Quality of Service)レベルの使い分け
MQTTには3つのQoSレベルがあり、メッセージの信頼性と効率のバランスを選べます。
QoS 0は「最大1回配信」で、送りっぱなしのファイア・アンド・フォーゲット方式です。温度データのように、多少欠損しても次のデータで補えるケースに向いています。QoS 1は「最低1回配信」で、メッセージが確実に届くことを保証しますが、重複する可能性があります。QoS 2は「正確に1回配信」で、最も信頼性が高い反面、ハンドシェイクが多いため遅延が増えます。
実際のところ、多くのIoTシステムではQoS 0か1で十分です。QoS 2が必要になるのは、課金データや医療データなど、重複や欠損が許されないケースに限られます。
MQTTブローカーの選び方
MQTTを使うにはブローカー(サーバー)が必要です。代表的なオープンソースブローカーをいくつか紹介します。
MosquittoはEclipse財団が開発する最も有名なMQTTブローカーです。軽量で、Raspberry Piでも動作するため、個人プロジェクトや学習に最適でしょう。設定ファイルもシンプルで、数分でセットアップできます。
EMQXは大規模なIoTプラットフォーム向けのブローカーで、1億台以上の同時接続に対応しています。クラスタリングやルールエンジンなどエンタープライズ機能が充実していますね。
HiveMQはクラウドネイティブなブローカーで、AWS IoTやAzure IoT Hubとの統合が容易です。商用ライセンスが必要ですが、無料のコミュニティエディションもあります。
MQTTのセキュリティ対策
DJI Romoの事例が示すように、MQTTのセキュリティ設計は慎重に行う必要があります。最低限やっておくべきことは以下の通りです。
まず、TLS/SSLによる通信の暗号化は必須です。MQTTのデフォルトポート1883は暗号化なしですが、8883ポートでTLS接続を使うようにしてください。次に、クライアントごとに一意の認証情報を発行し、トピックレベルのACL(アクセス制御リスト)を設定することが重要です。
また、ワイルドカードサブスクリプション(#や+)を無制限に許可しないこと。これを許可すると、一つのクライアントが全トピックのメッセージを受信できてしまいます。Bluetoothの個人情報漏洩リスクと同様に、通信プロトコルのセキュリティは設計段階で考慮すべきものです。
MQTTの実用的な活用シーン
MQTTが活躍する場面は多岐にわたります。スマートホームでは、照明・エアコン・センサーの連携に使われています。Home Assistantなどのオープンソースプラットフォームとの相性も抜群です。
産業分野では、工場の設備監視やエネルギー管理で広く採用されています。また、コネクテッドカーのテレマティクスデータの送受信にも使われることがあります。
開発者にとっては、n8nのようなワークフロー自動化ツールと組み合わせることで、IoTデータをトリガーにした自動処理パイプラインを構築できるのも魅力です。
まとめ:MQTTはIoT時代の共通言語
MQTTは誕生から25年以上が経ちますが、IoTの標準プロトコルとしての地位は揺るぎません。軽量さ、信頼性、スケーラビリティを兼ね備えた設計は、現代のIoTニーズにぴったりフィットしています。
ただし、セキュリティ設計を怠ると深刻な問題につながることも忘れないでください。便利な技術だからこそ、正しく使うことが大切ですね。
参考リンク:
