اتصال رزبریپای به بروکر MQTT با پایتون
رزبریپای را به بروکر MQTT وصل کنید: آزمایش سریع با mosquitto-clients، اسکریپت پایتون برای ارسال دمای پردازنده و اجرای خودکار آن با systemd.
پیشنیازها#
- رزبریپای با Raspberry Pi OS و اتصال اینترنت
- یک اکانت MQTT و یک دستگاه ثبتشده در داشبورد، مثلاً با شناسه
rpi-01(اگر هنوز ندارید، این راهنما را ببینید)
آزمایش سریع با mosquitto-clients#
ابزارهای خط فرمان MQTT را نصب کنید:
sudo apt update && sudo apt install -y mosquitto-clientsبعد یک پیام آزمایشی بفرستید (بهجای alice نام کاربری خودتان را بگذارید):
mosquitto_pub -h mqtt.mqttcloud.ir -p 8883 --capath /etc/ssl/certs \
-i rpi-01 -u alice -P 'YOUR_PASSWORD' -t 'alice/rpi/hello' -m 'hi'گواهی بروکر از Let's Encrypt است و Raspberry Pi OS گواهیهای ریشه آن را دارد، پس --capath /etc/ssl/certs کافی است. پیام را در صفحه «پیامها» داشبورد خواهید دید.
اسکریپت پایتون: ارسال دمای پردازنده#
در نسخههای جدید Raspberry Pi OS نصب بسته با pip در محیط سیستم مجاز نیست، پس یک محیط مجازی بسازید:
python3 -m venv ~/mqtt-env
~/mqtt-env/bin/pip install paho-mqttاسکریپت زیر هر ۳۰ ثانیه دمای پردازنده را منتشر میکند و پیام وصیت offline را تنظیم میکند تا اگر برق رفت، داشبورد شما بفهمد:
import json, time
import paho.mqtt.client as mqtt
USER = "alice"
STATUS = f"{USER}/rpi-01/status"
def cpu_temp():
with open("/sys/class/thermal/thermal_zone0/temp") as f:
return int(f.read()) / 1000
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="rpi-01")
client.username_pw_set(USER, "YOUR_PASSWORD")
client.tls_set()
client.will_set(STATUS, "offline", qos=1, retain=True)
client.connect("mqtt.mqttcloud.ir", 8883, keepalive=60)
client.loop_start()
client.publish(STATUS, "online", qos=1, retain=True)
while True:
client.publish(f"{USER}/rpi-01/cpu", json.dumps({"temp": cpu_temp()}), qos=1)
time.sleep(30)اجرای خودکار با systemd#
برای اینکه اسکریپت بعد از هر راهاندازی مجدد خودش اجرا شود، فایل /etc/systemd/system/mqtt-rpi.service را بسازید (مسیر و نام کاربری را با سیستم خودتان تطبیق دهید):
[Unit]
Description=MQTT publisher
After=network-online.target
Wants=network-online.target
[Service]
User=pi
ExecStart=/home/pi/mqtt-env/bin/python /home/pi/publisher.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.targetسپس:
sudo systemctl daemon-reload && sudo systemctl enable --now mqtt-rpiRestart=always باعث میشود اگر اسکریپت به هر دلیلی متوقف شد، دوباره اجرا شود. اگر دستگاه وصل نشد، عیبیابی اتصال MQTT را ببینید.
