اتصال رزبری‌پای به بروکر MQTT با پایتون
آموزش

اتصال رزبری‌پای به بروکر MQTT با پایتون

۱۰ آبان ۱۴۰۵۷ دقیقه مطالعه

رزبری‌پای را به بروکر MQTT وصل کنید: آزمایش سریع با mosquitto-clients، اسکریپت پایتون برای ارسال دمای پردازنده و اجرای خودکار آن با systemd.

پیش‌نیازها#

  • رزبری‌پای با Raspberry Pi OS و اتصال اینترنت
  • یک اکانت MQTT و یک دستگاه ثبت‌شده در داشبورد، مثلاً با شناسه rpi-01 (اگر هنوز ندارید، این راهنما را ببینید)

آزمایش سریع با mosquitto-clients#

ابزارهای خط فرمان MQTT را نصب کنید:

bash
sudo apt update && sudo apt install -y mosquitto-clients

بعد یک پیام آزمایشی بفرستید (به‌جای alice نام کاربری خودتان را بگذارید):

bash
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 در محیط سیستم مجاز نیست، پس یک محیط مجازی بسازید:

bash
python3 -m venv ~/mqtt-env
~/mqtt-env/bin/pip install paho-mqtt

اسکریپت زیر هر ۳۰ ثانیه دمای پردازنده را منتشر می‌کند و پیام وصیت offline را تنظیم می‌کند تا اگر برق رفت، داشبورد شما بفهمد:

python
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 را بسازید (مسیر و نام کاربری را با سیستم خودتان تطبیق دهید):

ini
[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

سپس:

bash
sudo systemctl daemon-reload && sudo systemctl enable --now mqtt-rpi

Restart=always باعث می‌شود اگر اسکریپت به هر دلیلی متوقف شد، دوباره اجرا شود. اگر دستگاه وصل نشد، عیب‌یابی اتصال MQTT را ببینید.

#رزبری_پای#RaspberryPi#Python#MQTT