本サイトはアフィリエイト広告を利用しています

Raspberry PI 4 Model B(ラズパイ)でMQTT通信してみる(python)

背景

ラズパイでMQTT通信してみる。前回までの記事はこちら。

MQTT通信準備

サーバー(Broker)のインストール

以下コマンドでサーバーをインストール。

 $ sudo apt install mosquitto

クライアントのインストール

以下コマンドでクライアントをインストール。

 $ sudo apt install mosquitto-clients

送信テスト

サーバーを起動する。

 $ sudo systemctl start mosquitto

次に、別コンソールでクライアントを起動する。

$ mosquitto_sub -d -t orz
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending SUBSCRIBE (Mid: 1, Topic: orz, QoS: 0, Options: 0x00)
Client (null) received SUBACK
Subscribed (mid: 1): 0
Client (null) sending PINGREQ
Client (null) received PINGRESP

サーバーから”hello”を送信してみる。

$ mosquitto_pub -d -t orz -m "hello"
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'orz', ... (5 bytes))
Client (null) sending DISCONNECT

クライアント側で受信を確認。

Client (null) received PUBLISH (d0, q0, r0, m0, 'orz', ... (5 bytes))
hello

“paho-mqtt”をインストール

以下コマンドで”paho-mqtt”をインストール。

$ pip install paho-mqtt
error: externally-managed-environment

This environment is externally managed

To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.

If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.

For more information visit http://rptl.io/venv

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

システム全体に対してインストールする行為は許しません!というエラーらしい。大人しく仮想環境を用意し再度インストールに挑戦。

$ mkdir ~/mqtt_pj
$ cd mqtt_pj
$ python3 -m venv venv
$ source venv/bin/activate
(venv) xxx@yyy:~/mqtt_pj $ pip install paho-mqtt
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting paho-mqtt
  Downloading https://www.piwheels.org/simple/paho-mqtt/paho_mqtt-2.1.0-py3-none-any.whl (67 kB)
     ---------------------------------------- 67.2/67.2 kB 181.2 kB/s eta 0:00:00
Installing collected packages: paho-mqtt
Successfully installed paho-mqtt-2.1.0

無事インストールできた。仮想環境になると(venv)が前につく。

pythonでMQTT操作するGUIを実装

トピックのサブスクとパブリッシュをGUIでしてみる。コードは以下。

import tkinter as tk
from tkinter import scrolledtext, StringVar, OptionMenu
import paho.mqtt.client as mqtt
import subprocess
import time

# MQTT settings
BROKER = 'localhost'
PORT = 1883

# Initialize the text area and other UI components first
root = tk.Tk()
root.title("MQTT GUI")

frame = tk.Frame(root)
frame.pack(padx=10, pady=10)

topic_var = StringVar(root)
topic_var.set("ondo/topic")  # Set default value

# Dropdown for selecting the topic
topic_label = tk.Label(frame, text="Topic:")
topic_label.grid(row=0, column=0)
topic_dropdown = OptionMenu(frame, topic_var, *["ondo/topic", "shitsudo/topic"])
topic_dropdown.grid(row=0, column=1)

message_label = tk.Label(frame, text="Message:")
message_label.grid(row=1, column=0)
message_entry = tk.Entry(frame, width=40)
message_entry.grid(row=1, column=1)

send_button = tk.Button(frame, text="Send", command=lambda: send_message())
send_button.grid(row=1, column=2)

# Initialize text area
text_area = scrolledtext.ScrolledText(root, width=50, height=15, state=tk.DISABLED)
text_area.pack(padx=10, pady=10)

# Function to display received messages
def on_message(client, userdata, message):
    text_area.config(state=tk.NORMAL)
    text_area.insert(tk.END, f"Received: {message.topic}: {message.payload.decode()}\n")
    text_area.config(state=tk.DISABLED)
    text_area.see(tk.END)

# Initialize MQTT client
client = mqtt.Client(protocol=mqtt.MQTTv311)  # Use the latest MQTT version
client.on_message = on_message

# Function to start Mosquitto
def start_mosquitto():
    # Start Mosquitto in the background
    subprocess.Popen(['sudo', 'systemctl', 'start', 'mosquitto'])
    # Wait a moment
    time.sleep(2)

# Start Mosquitto
start_mosquitto()

# Connect to MQTT broker and subscribe to topics
try:
    client.connect(BROKER, PORT, 60)
    
    # Topics to subscribe to
    topics = ["ondo/topic", "shitsudo/topic"]
    
    for topic in topics:
        client.subscribe(topic)
        text_area.config(state=tk.NORMAL)
        text_area.insert(tk.END, f"Subscribed to: {topic}\n")
        text_area.config(state=tk.DISABLED)
    
    client.loop_start()
except Exception as e:
    print(f"MQTT connection error: {e}")

# Function to send messages
def send_message():
    topic = topic_var.get()
    message = message_entry.get()
    print(f"Sending: Topic='{topic}', Message='{message}'")  # Debug output
    client.publish(topic, message)
    message_entry.delete(0, tk.END)

root.protocol("WM_DELETE_WINDOW", lambda: (client.loop_stop(), client.disconnect(), root.destroy()))
root.mainloop()

ラズパイでMQTT通信してみた

アプリケーション起動時に2つトピックをサブスクするようにしている。

ondo/topicへメッセージ送信。

うむ、成功。次はshitsudo/topicへメッセージ送信。

成功!

1 COMMENT

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です