mqtt を使ってみたので、その時のメモをここに残します。
mqtt とは
mqtt(Message Queuing Telemetry Transport)は、マシン間の通信に使用される標準ベースのパブリッシュ/サブスクライブ型のメッセージングプロトコル、または一連のルールです。
IoT と相性が良さそうなので勉強してみました。
メリット
- 疎結合:パブリッシャーはサブスクライバーのアドレスやIDを認識せず、またメッセージタイプを意識せずに送信可能
- セキュリティの向上:ブローカーは、サブスクライブされたトピックのメッセージのみを送信
- テスト容易性の向上:トピックにより、テストに必要なメッセージの数が削減
準備
Mosquitto インストール
Broker
$ sudo apt-get install mosquitto
client
$ sudo apt-get install mosquitto-clients
python
paho-mqtt インストール
paho-mqtt をインストールします。
$ pip install paho-mqtt
動作検証
broker(mosquitto)
起動
$ sudo systemctl start mosquitto
状態確認
$ sudo systemctl status mosquitto ● mosquitto.service - Mosquitto MQTT Broker Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2024-02-08 19:31:39 JST; 17h ago Docs: man:mosquitto.conf(5) man:mosquitto(8) Process: 2362 ExecStartPre=/bin/mkdir -m 740 -p /var/log/mosquitto (code=exited, status=0/SUCCESS) Process: 2363 ExecStartPre=/bin/chown mosquitto /var/log/mosquitto (code=exited, status=0/SUCCESS) Process: 2364 ExecStartPre=/bin/mkdir -m 740 -p /run/mosquitto (code=exited, status=0/SUCCESS) Process: 2365 ExecStartPre=/bin/chown mosquitto /run/mosquitto (code=exited, status=0/SUCCESS) Main PID: 2366 (mosquitto) Tasks: 1 (limit: 38464) Memory: 1.4M CPU: 8.232s CGroup: /system.slice/mosquitto.service └─2366 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
Publisher / Subscriber 動作確認
以下の条件で送受信のテストを行います。
ホスト名 | localhost |
トピック名 | test |
Subscriber 実行
$ mosquitto_sub -h localhost -t test
Publisher 実行
$ mosquitto_pub -h localhost -t test -m "test1 message" $ mosquitto_pub -h localhost -t test -m "test2 message" $ mosquitto_pub -h localhost -t test -m "test3 message"
実行結果
Subsciber 側で Publisher が送信したメッセージの受信が確認できました。
$ mosquitto_sub -h localhost -t test test1 message test2 message test3 message
python から
Subscriber
import paho.mqtt.subscribe as subscribe def print_msg(client, userdata, message): print("%s : %s" % (message.topic, message.payload)) subscribe.callback(print_msg, "#", hostname="localhost")
Publisher
import paho.mqtt.publish as publish publish.single("test", "message", hostname="localhost")