見出し画像

#82 MQTT

 Webサイトやアプリなどの開発ばかりしていますが、IoTにも興味があります。農業に携わっていたときは、エッジデバイスを使って画像認識でミニトマトの選別にチャレンジしたこともありました。
 農業も規模が大きくなってくると、手動では間に合いません。ビニールハウスの温度調整や水やりは、センサーを使って自動で行います。無数の機器が協調して動作するシステムにおいては、情報のやりとりやイベントの検知を効率よく行う必要があります。特に、機器の性能が低くネットワークも弱い環境では、データの軽量さが求められます。

そのための仕組みの一つがMQTTです。

MQTTは、軽量でスケーラブルなPublish/Subscribe型のプロトコルです。

Publisherがトピックに対してメッセージを送出すると、そのトピックを購読しているSubscriberにメッセージが受け渡されます。Brokerが中心となって、情報の伝達を行います。

Publisher --> Broker --> Subscriber1
                    |--> Subscriber2

やってみまーす。

環境

Ubuntu 22.04
Python 3.10.6


Brokerのインストール

 Brokerには、Mosquittoを使います。aptで簡単にインストールできます。

sudo apt install mosquitto mosquitto-clients

サービスを起動します。

sudo systemctl start mosquitto


Python仮想環境

 PythonでPublish/Subscribeの実験をしたいので、仮想環境を用意します。

python3 -m venv .venv
source .venv/bin/activate

必要なパッケージをインストールします。

pip3 install paho-mqtt


コード

publisher.py

import paho.mqtt.client as mqtt

class Publisher:

    def __init__(self):
        self.client = mqtt.Client()

    def connect(self, host, port):
        self.client.connect(host, port)

    def publish(self, topic, message):
        self.client.publish(topic, message)


if __name__ == "__main__":
    pub = Publisher()
    pub.connect("localhost", 1883)

    while True:
        msg = input("publish> ")
        pub.publish("test", msg)

subscriber.py

import paho.mqtt.client as mqtt

class Subscriber:

    def __init__(self):
        self.client = mqtt.Client()
        self.client.on_message = self.on_message

    def on_message(self, mqttc, obj, msg):
        print(msg.topic + ': ' + str(msg.payload.decode('utf-8')))

    def connect(self, host, port):
        self.client.connect(host, port)

    def subscribe(self, topic):
        self.client.subscribe(topic)
        self.client.loop_forever()


if __name__ == "__main__":
    sub = Subscriber()
    sub.connect("localhost", 1883)
    sub.subscribe("test")


動作確認

 さあ、実際に動かしてみます。ターミナルを2つ用意し、それぞれpublisher.py、subscriber.pyを起動します。

python3 publisher.py
python3 subscriber.py

Publisher側メッセージを入力すると…

publish> test mqtt

期待通り、Subscriber側でメッセージを受信できました!

test: test mqtt


まとめ

 今回はシンプルな実装でしたが、実際には、セキュリティも考慮してTLSやユーザー認証なども設定する必要があります。大量のセンサーを使ったシステムもやってみたいです。

EOF

この記事が気に入ったらサポートをしてみませんか?