背景
ラズパイで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へメッセージ送信。
成功!
[…] Raspberry PI 4 Model B(ラズパイ)でMQTT通信してみる(python) Raspberry PI 4 Model B(ラズパイ)で温度を計測してみる(python) […]