#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
この記事が気に入ったらサポートをしてみませんか?