ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

【python】mqtt を使ってみる

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

github.com

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")