MQTTは、「Message Queuing Telemetry Transport」の略で、専門用語に聞こえるかもしれませんが、簡単に言えば「機器同士が軽量なメッセージを交換するためのルール」です。
今回の記事では、ITの知識があまりない一般の方でも理解できるように、MQTTの基本概念や仕組み、そして実際のLED点灯デモを通してその動作を解説していきます。
MQTTとは?
MQTTは、IoT(モノのインターネット)の世界で広く利用されている通信プロトコルです。
- Publisher(パブリッシャー):データ(メッセージ)を発信する側。新聞社がニュースを発信するようなイメージです。
- Subscriber(サブスクライバー):発信されたメッセージを受信する側。新聞を購読する読者に例えられます。
- Broker(ブローカー):発信されたメッセージを一旦集め、必要な購読者へ配信する仲介役。郵便局のような存在です。
- Topic(トピック):メッセージの宛先やカテゴリ。新聞の見出しのように、どの情報がどこへ届くかを決めます。
このようにMQTTは、各役割ごとに分かれてシンプルな通信モデルを採用しています。
MQTTの仕組み
MQTTの通信モデルは「Publish/Subscribe」方式です。
具体的な流れは以下の通りです。
-
Publisherの動作
発信側のデバイス(例えば、温度センサーやボタンを搭載した機器)は、取得したデータに「home/temperature」や「home/led」などのトピックを付け、MQTTブローカーへメッセージを送ります。 -
Brokerの役割
ブローカーは受け取ったメッセージのトピックを確認し、同じトピックを購読しているすべてのデバイスへ、そのメッセージを転送します。MQTT通信の流れ- Publisherがメッセージを送信
- Brokerがメッセージを受信・分類
- Subscriberにメッセージを配信
-
Subscriberの動作
受信側のデバイスは、あらかじめ興味のあるトピックをブローカーに登録しておき、そこに届いたメッセージに応じた動作(例えばLEDを点灯させる)を実行します。
この仕組みにより、1対1の直接通信ではなく、一括して多数のデバイスにデータを配信することが可能となり、特にIoT環境においてその効率性が大いに発揮されます。
なぜMQTTがIoTに使われるのか?
主な理由は以下の通りです。
-
軽量で省電力
余分な情報を省いたシンプルなパケット構造により、通信に必要なデータ量が非常に少なく、電力消費を低減します。 -
一斉配信が容易
1つのメッセージを複数のデバイスに同時に配信できるため、例えば家庭内の複数のスマートライトを同時制御するのにも適しています。
LED点灯デモで理解するMQTT
ここでは、実際にMQTTを用いた簡単なLED点灯デモを紹介します。たとえば、Raspberry Piを使って、1台目のPiにボタン、2台目のPiにLEDを接続し、MQTT経由でLEDのON/OFFを行います。
デモの流れ
-
LED側の準備(Subscriber)
2台目のRaspberry Piでは、MQTTクライアントを起動し、ブローカーに接続します。ここでは「home/led」というトピックを購読する設定を行い、メッセージが届いたらLEDを点灯・消灯するようにプログラムします。 -
ボタン操作によるメッセージ送信(Publisher)
1台目のRaspberry Piに接続したボタンを押すと、MQTTクライアントが「home/led」トピックに「ON」または「OFF」のメッセージを送信します。ボタン操作の流れ- ボタンが押されたら「ON」メッセージを生成
- MQTTブローカーへメッセージを送信
-
メッセージの受信とLEDの反応
ブローカーは、受信した「home/led」トピックのメッセージを購読中の2台目に転送します。
2台目のRaspberry Piはメッセージを受け取り、内容に応じてLEDを点灯または消灯します。まるで郵便局が新聞を配達するかのように、各デバイスに情報が届きます!
このように、MQTTを利用すれば、離れた場所にあるデバイス同士でも簡単に通信が行え、複数の機器を一斉に制御することが可能です。
コーディング
コードと必要な事前準備は下記に記載してあります。
https://github.com/buono/mqtt_demo
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
# ------------------------------
# GPIOの設定
# ------------------------------
LED_PIN = 18 # 使用するGPIOピン番号(必要に応じて変更)
GPIO.setmode(GPIO.BCM) # BCM番号でピンを指定する
GPIO.setup(LED_PIN, GPIO.OUT) # LED_PINを出力モードに設定
# ------------------------------
# MQTTブローカー情報
# ------------------------------
# HiveMQのパブリックブローカーではなく、ローカルのMosquittoを利用
broker = "localhost" # Mosquittoが同一Raspberry Pi上で動いている場合は"localhost"
port = 1883
topic = "home/led"
# ------------------------------
# コールバック関数
# ------------------------------
def on_connect(client, userdata, flags, rc):
"""
MQTTブローカーに接続した際に呼び出されるコールバック関数。
接続結果を表示し、指定したトピックをサブスクライブする。
"""
print("Connected with result code " + str(rc))
client.subscribe(topic)
def on_message(client, userdata, msg):
"""
サブスクライブしているトピックにメッセージが届いた際に呼び出されるコールバック関数。
メッセージが"ON"ならLEDを点灯、"OFF"ならLEDを消灯する。
"""
message = msg.payload.decode() # バイナリデータを文字列に変換
print(f"Received message: {message} on topic: {msg.topic}")
if message == "ON":
GPIO.output(LED_PIN, GPIO.HIGH) # LEDを点灯
print("LED ON")
elif message == "OFF":
GPIO.output(LED_PIN, GPIO.LOW) # LEDを消灯
print("LED OFF")
# ------------------------------
# MQTTクライアントの設定と接続開始
# ------------------------------
client = mqtt.Client("RaspberryPiClient") # 任意のクライアントID
client.on_connect = on_connect
client.on_message = on_message
# ローカルのMosquittoブローカーに接続
client.connect(broker, port, 60)
client.loop_forever()
まとめ
今回は、MQTTの基本概念からその仕組み、そして実際のLED点灯デモによる動作例まで、初心者にも分かりやすい形で解説しました。
また、MQTTは軽量で省電力なため、IoT機器に最適な通信手法として急速に普及しています。今回のLED点灯デモのように、実際の機器で動作させることで、そのメリットや実用性を実感していただけると思います。
MQTTの仕組みを理解しておくことで、今後新しいIoT製品やサービスに出会ったときも「これはMQTTを利用しているんだな」と納得できるはずです。ぜひ今回の内容を参考に、MQTTの世界に一歩踏み出してみてください!