پروژه با رزبری پای, طراحی خانه هوشمند

خانه هوشمند 2 سرور رسپبری پای broker mqtt mosquitto


مقدمه

در دنیای هوشمندسازی منازل، ارتباط پایدار، ساده و کم‌مصرف بین دستگاه‌ها حیاتی است. وقتی تعداد حسگرها، کلیدها، لامپ‌ها یا دستگاه‌های الکترونیکی متعدد می‌شود، ارسال درخواست‌های HTTP سنگین و ناپایا ممکن است باعث افزایش تأخیر و مصرف انرژی شود. اینجاست که MQTT وارد میدان می‌شود: پروتکلی سبک و کارآمد با الگوی انتشار/اشتراک (Publish/Subscribe) که بسیار مناسب برای اینترنت اشیاء و خانه هوشمند است.

در این مقاله، قدم به قدم با هم می‌آموزیم چگونه یک broker mqtt mosquitto را بر روی رسپبری پای (Raspberry Pi) راه‌اندازی کنیم و آن را به قلب سامانه خانه هوشمند خود تبدیل کنیم. از نصب و پیکربندی پایه تا امنیت، تست محلی، راه دور، اتصال سنسورها و بهینه‌سازی عملکرد — همه را به زبانی ساده و عملی توضیح خواهیم داد. اگر قصد دارید کنترل دستگاه‌ها را به شکلی مطمئن و بهینه مدیریت کنید، این راهنما نقطه شروع به شما خواهد بود.

در ادامه، ابتدا با مفهوم MQTT و مزایای آن آشنا می‌شویم و سپس وارد جزئیات نصب، پیکربندی، امنیت و آزمایش می‌شویم.


MQTT چیست؟

MQTT مخفف «Message Queuing Telemetry Transport» است. این پروتکل ارتباطی سبک برای انتقال پیام بین دستگاه‌ها طراحی شده است. در مقابل پروتکل‌های HTTP که مدل درخواست/پاسخ دارند، MQTT از مدل انتشار/اشتراک بهره می‌برد: دستگاهی پیام را منتشر (publish) می‌کند و دستگاه‌های دیگری که به همان موضوع (topic) مشترک هستند آن را دریافت (subscribe) می‌کنند.

اصول اصلی مدل Publish/Subscribe

در MQTT، اجزای اصلی عبارتند از:

  • Publisher: دستگاهی که پیام منتشر می‌کند

  • Broker: مرکزی که پیام‌ها را دریافت و توزیع می‌کند

  • Subscriber: دستگاهی که پیام‌هایی را که به موضوع مشخص اشتراک کرده، دریافت می‌کند

وقتی یک Publisher پیامی به یک موضوع می‌فرستد، Broker آن را به همه Subscriberهایی که به آن موضوع مشترک هستند تحویل می‌دهد. این مدل، دستگاه‌ها را از دانستن مستقیم آدرس یکدیگر بی‌نیاز می‌کند.

مقایسه با HTTP

مزایای MQTT نسبت به HTTP در سناریوهای اینترنت اشیاء و خانه هوشمند:

  • مصرف پهنای باند کمتر: پیام‌ها سبک‌تر هستند.

  • تاخیر کمتر: ارتباط دائمی و بیدار بودن اتصال.

  • کارایی در شبکه‌های نامطمئن: MQTT می‌تواند مجدداً تلاش کند یا پیام را نگه دارد.

  • ارسال دوطرفه آسان: امکان کنترل فرمان‌ها از سرور به دستگاه‌ها به سادگی.

به همین دلایل، MQTT یکی از محبوب‌ترین گزینه‌ها برای ساخت خانه هوشمند است.


ضرورت استفاده از Broker در MQTT

در هر سیستم MQTT، وجود Broker ضروری است. تمامی پیام‌ها از طریق این واسطه عبور می‌کنند. Broker وظایف عمده زیر را بر عهده دارد:

  • دریافت پیام از publish

  • بررسی سیاست‌های دسترسی

  • توزیع پیام به subscriberهای مجاز

  • ذخیره پیام اگر گزینه retain فعال باشد

  • مدیریت وضعیت اتصال دستگاه‌ها

یک Broker خوب باید سبک، امن، پایدار و قابل توسعه باشد — که یکی از بهترین گزینه‌ها Mosquitto است.


معرفی Mosquitto به‌عنوان Broker MQTT

Mosquitto یک پیاده‌سازی متن‌باز (Open Source) از بروکر MQTT است که تحت مجوز Eclipse فعالیت می‌کند. این پروژه به‌صورت گسترده‌ای پذیرفته شده و در پروژه‌های خانگی و صنعتی کاربرد دارد.

ویژگی‌های شاخص Mosquitto:

  • سبک بودن و مناسب برای سخت‌افزارهای کم‌مصرف

  • پشتیبانی از MQTT نسخه 3.1، 3.1.1 و نسخه 5

  • پشتیبانی از TLS/SSL، احراز هویت، ACL

  • امکان اجرای به‌صورت سرویس (daemon)

  • پشتیبانی از bridging بین brokerهای مختلف

به دلیل ساده بودن و جامعه کاربری فعال، Mosquitto انتخابی عالی برای پروژه‌های خانه هوشمند است.


چرا Raspberry Pi برای خانه هوشمند؟

استفاده از Raspberry Pi به عنوان سرور مرکزی خانه هوشمند مزایای زیادی دارد:

  • مصرف انرژی پایین

  • ابعاد کوچک و امکان قرارگیری در هر فضا

  • پشتیبانی از سیستم‌عامل‌های لینوکسی و بسته‌ها

  • پورت‌های GPIO برای اتصال مستقیم سنسورها

  • هزینه مناسب نسبت به سرورهای گران‌تر

با این حال، محدودیت در منابع (RAM، CPU) باید در طراحی سیستم لحاظ شود. مدل‌هایی مانند Raspberry Pi 4 با حداقل ۲ یا ۴ گیگابایت RAM برای کار متوسط مناسب‌اند.


آماده‌سازی سیستم عامل بر روی Raspberry Pi

ابتدا سیستم‌عامل مناسب را نصب کنید؛ معمولاً از Raspberry Pi OS (قبلاً Raspbian) استفاده می‌شود. سپس:

  • سیستم را به‌روز کنید:

				
					sudo apt update
sudo apt upgrade

				
			
  • مطمئن شوید که SSH فعال است تا بتوان از راه دور مدیریت کنید.

  • تنظیمات شبکه: آدرس IP ثابت یا رزرو DHCP تعبیه شود تا اتصال به بروکر در شبکه داخلی پایدار بماند.


نصب Mosquitto بر روی Raspberry Pi

برای نصب Mosquitto از مخازن رسمی می‌توانید از این دستورات استفاده کنید:

				
					sudo apt install mosquitto mosquitto-clients

				
			

این روش سریع و ساده است.
در صورتی که بخواهید نسخه جدیدتر یا تنظیمات سفارشی‌تر داشته باشید، می‌توانید Mosquitto را از سورس کامپایل کنید، اما برای بیشتر پروژه‌های خانه هوشمند نصب از مخازن کافی خواهد بود.


پیکربندی پایه Mosquitto

فایل اصلی پیکربندی Mosquitto معمولاً در مسیر /etc/mosquitto/mosquitto.conf قرار دارد. در آنجا می‌توانید:

  • تعیین listener برای پورت پیش‌فرض (مثل ۱۸۸۳):

				
					listener 1883

				
			

فعال یا غیرفعال کردن دسترسی ناشناس (anonymous):

				
					allow_anonymous false

				
			

تعریف مسیر فایل کاربری (password file) و دسترسی‌ها:

				
					password_file /etc/mosquitto/passwd
include_dir /etc/mosquitto/conf.d

				
			

با همین تنظیمات ابتدایی، Mosquitto قادر است پیام‌ها را بپذیرد و توزیع کند، اما تا زمانی که امنیت فعال نشود، دسترسی همه آزاد است.


امنیت در Mosquitto: احراز هویت و TLS

امنیت در سیستم خانه هوشمند حیاتی است. اگر کسی بتواند به broker دسترسی یابد، کنترل دستگاه‌ها را به دست خواهد گرفت. برای ایمن‌سازی:

احراز هویت (Username / Password)

با ابزار mosquitto_passwd می‌توانید فایل حاوی نام کاربری و رمز عبور بسازید:

				
					sudo mosquitto_passwd -c /etc/mosquitto/passwd user1

				
			

سپس در mosquitto.conf آن را اضافه کنید:

				
					password_file /etc/mosquitto/passwd
allow_anonymous false

				
			

رمزنگاری TLS / SSL

برای رمزگذاری ارتباطات، باید فایل‌های کلید خصوصی و گواهی‌نامه (certificate) ایجاد کنید یا از CA معتبر استفاده کنید. در mosquitto.conf تنظیمات مشابه زیر را اضافه کنید:

				
					listener 8883
cafile /etc/mosquitto/ca.crt
certfile /etc/mosquitto/server.crt
keyfile /etc/mosquitto/server.key

				
			

با این کار، ارتباط روی پورت ۸۸۸۳ امن خواهد بود.

مدیریت دسترسی (ACL)

با فایل دسترسی (ACL) می‌توانید تعیین کنید کاربر خاصی به کدام موضوعات publish یا subscribe دسترسی دارد.
مثال فایل acl:

				
					user user1
topic readwrite sensor/#
topic read sensor/temperature

				
			

در فایل پیکربندی:

				
					acl_file /etc/mosquitto/acl

				
			

با این لایه‌ها، امنیت بروکر شما تا حد زیادی تأمین می‌شود.


راه‌اندازی سرویس و خودکارسازی

برای اینکه Mosquitto هنگام راه‌اندازی Raspberry Pi به‌صورت خودکار اجرا شود، از سرویس systemd استفاده می‌کنیم. معمولاً با نصب پیش‌فرض این خدمت فعال است:

				
					sudo systemctl enable mosquitto
sudo systemctl start mosquitto
sudo systemctl status mosquitto

				
			

اگر بخواهید تغییرات در پیکربندی را اعمال کنید، می‌توانید سرویس را ری‌استارت کنید:

				
					sudo systemctl restart mosquitto

				
			

تست محلی در شبکه داخلی

ابتدا در دستگاهی (کامپیوتر یا لپ‌تاپ داخل شبکه) از دستور زیر برای اشتراک پیام استفاده کنید:

				
					mosquitto_sub -h <IP_of_RPi> -t "test/topic"

				
			

در دستگاه دیگری یا همان دستگاه، دستور انتشار را اجرا کنید:

				
					mosquitto_pub -h <IP_of_RPi> -t "test/topic" -m "سلام خانه هوشمند!"

				
			

اگر در سمت subscriber پیام دریافت شد، یعنی راه‌اندازی موفق بود.


راه‌اندازی Mosquitto در ویندوز

در سیستم ویندوز نیز می‌توانید Mosquitto را نصب کرده و به عنوان سرویس اجرا کنید. بر اساس توضیح شما:

  • پس از نصب، می‌توانید سرویس را اجرا کنید:

				
					net start mosquito

				
			

با دستور زیر در پنجره دیگری، اشتراک را امتحان کنید:

				
					mosquitto_sub -h localhost -t "test/topic"

				
			

در پنجره دوم:

				
					mosquitto_pub -h localhost -t "test/topic" -m "hello bahramkit!"

				
			

با این روش میتوانید به راحتی بین ویندوز و Raspberry Pi تعامل نیز داشته باشید.


تست از طریق وب‌سرویس و راه دور

اگر بخواهید از بیرون شبکه محلی به بروکر دسترسی داشته باشید، می‌توانید از دستورات زیر استفاده کنید:

 
				
					mosquitto_sub -h YOURWEBSITE.COM -p PORT -u USERNAME -P PASSWORD -t test-mosquito-rwh-service
mosquitto_pub -h YOURWEBSITE.COM -p PORT -u USERNAME -P PASSWORD -t test-mosquito-rwh-service -m "hello from bahramkit!"

				
			

در این حالت، لازم است پورت مورد نظر را روی روتر باز کرده و به IP داخلی Raspberry Pi فوروارد کنید (Port Forwarding). همچنین اگر IP اینترنت شما ثابت نیست، می‌توانید از سرویس DNS پویا مانند DuckDNS یا No-IP استفاده کنید.


اتصال دستگاه‌ها به بروکر

برای اینکه سنسورها، آکتاتورها یا سایر دستگاه‌های آشکارساز به بروکر متصل شوند، معمولاً از ماژول‌هایی مانند ESP8266 یا ESP32 استفاده می‌شود که پشتیبانی MQTT دارند.

نمونه کد Arduino/PlatformIO

یک مثال ساده برای ESP8266 به زبان Arduino:

				
					#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "SSID";
const char* password = "WIFI_PASSWORD";
const char* mqtt_server = "YOUR_RPI_IP";
const int mqtt_port = 1883;
const char* mqtt_user = "user1";
const char* mqtt_pass = "password1";

WiFiClient espClient;
PubSubClient client(espClient);

void callback(char* topic, byte* payload, unsigned int length) {
  String msg;
  for (int i=0; i<length; i++) {
    msg += (char)payload[i];
  }
  Serial.print("Received: ");
  Serial.println(msg);
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESPClient", mqtt_user, mqtt_pass)) {
      client.subscribe("control/led");
    } else {
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // مثال انتشار پیام
  client.publish("sensor/temperature", "25.6");
  delay(5000);
}

				
			


با این کد، دستگاه به بروکر وصل می‌شود، پیام دما را ارسال می‌کند و منتظر دستور دریافتی از موضوع control/led می‌ماند.
مدل تعامل دوطرفه و کنترل فرمان

در خانه هوشمند، علاوه بر ارسال سنسورها به سرور، ممکن است بخواهید فرمانی را به دستگاه‌ها بفرستید (مثلاً روشن/خاموش کردن لامپ). برای این کار:

دستگاه به موضوعی مانند control/device1 مشترک شود (subscribe).

سرور یا داشبورد به همان موضوع پیام ارسال کند (publish) مثلاً "ON" یا "OFF".

دستگاه پیام را خوانده و عمل مناسب را انجام دهد.

با این مدل، ارتباط دوطرفه به سادگی برقرار می‌شود.
سطوح کیفیت خدمات (QoS)

MQTT سه سطح QoS دارد:

QoS 0: پیام یک‌باره — بدون تضمین تحویل

QoS 1: تضمین حداقل یک‌بار تحویل

QoS 2: تضمین دقیقاً یک‌بار تحویل (پیچیده‌تر)

بسته به اهمیت پیام (مثلاً فرمان روشنایی یا گزارش دما) می‌توانید سطح مناسبی انتخاب کنید. البته سطوح بالاتر، پهنای باند بیشتر و سربار بیشتر دارند.
گزینه Retain و Last Will

Retain: اگر یک پیام با Retain منتشر شود، Broker آن را ذخیره می‌کند و وقتی subscriber جدید وصل شود، نسخه‌ی ذخیره‌شده را دریافت می‌کند.

Last Will and Testament: اگر کلاینت به صورت نرمال قطع نشود، می‌تواند پیامی بعنوان پیام اختتام (last will) ثبت کند تا Broker در صورت قطع ناگهانی آن را برای دیگران ارسال کند.

این امکانات برای تضمین پایداری و اطلاع‌رسانی وضعیت دستگاه‌ها بسیار مفیدند.
مانیتورینگ و نظارت بر Broker

برای اطمینان از عملکرد صحیح، می‌توانید:

لاگ‌های Mosquitto را بررسی کنید (معمولاً در /var/log/mosquitto/)

از ابزارهای مانیتورینگ MQTT مثل MQTT Explorer یا ابزارهای گرافیکی استفاده کنید

اسکریپت‌هایی بنویسید تا سلامت بروکر را پایش کنند

هشدار ارسال کنید در صورت از کار افتادن سرویس

مقیاس‌پذیری و گسترش سیستم

اگر تعداد دستگاه‌ها زیاد شود، ممکن است بخواهید:

Clustering: اجرای چند broker و توزیع بار

Bridging: ارتباط بین چند بروکر Mosquitto برای همسان‌سازی پیام‌ها

طراحی لایه‌ای که دستگاه‌ها به بروکر محلی متصل شوند و بروکرها پیام‌ها را بین خود رد و بدل کنند

این روش‌ها به شما امکان می‌دهد سیستم خود را به راحتی گسترش دهید.
پشتیبان‌گیری و بازیابی

برای جلوگیری از از دست رفتن تنظیمات، باید:

نسخه پشتیبان از فایل‌های پیکربندی (mosquitto.conf، فایل‌های conf.d)

نسخه پشتیبان از فایل رمز عبور و ACL

اسکریپت‌هایی برای بازیابی سریع در صورت آسیب دیدن SD card یا خرابی سیستم

بهینه‌سازی عملکرد

برای بهترین عملکرد:

از پیام‌های بسیار بزرگ اجتناب کنید

اگر ممکن است پیام‌ها را فشرده کنید

نگه‌داری یا پاک‌سازی دوره‌ای پیام‌های قدیمی

تنظیم محدودیت در تعداد اتصالات همزمان

مانیتور مصرف حافظه و CPU

ترفندها و موارد خاص

استفاده از WebSockets برای اتصال از مرورگر

افزونه‌ها و پل‌ها (Plugins) برای Mosquitto

ادغام با پلتفرم‌های خانه هوشمند مانند Home Assistant یا OpenHAB

ایجاد داشبورد واکنش‌گرا با Node-RED یا Grafana

عیب‌یابی رایج و راه‌حل‌ها

چند مشکل رایج و راهکار:

اتصال برقرار نمی‌شود → بررسی پورت، فایروال، listener

پیام‌ها دریافت نمی‌شوند → بررسی سطح QoS، موضوع (topic)

خطا در TLS → بررسی گواهی‌نامه‌ها

مصرف زیاد CPU یا رم → تعداد اتصالات زیاد، پیام‌های سنگین

جمع‌بندی و گام بعدی

در این راهنما، شما با:

مفاهیم پایه MQTT

نصب و پیکربندی Mosquitto بر روی Raspberry Pi

امنیت و احراز هویت

تست محلی و راه دور

اتصال دستگاه‌ها

بهینه‌سازی و عیب‌یابی

آشنا شدید. گام بعدی این است که پروژه کوچک خود را اجرا کنید: یک سنسور دما، یک رله کنترل روشنایی، و داشبورد ساده بسازید. سپس به تدریج، امکانات بیشتری اضافه کنید: Auto-Discovery، سینک با Home Assistant، تحلیل داده‌ها و هوش مصنوعی.
پرسش‌های متداول

آیا می‌توان از MQTT بدون بروکر استفاده کرد؟
خیر، مدل انتشار/اشتراک نیازمند یک نهاد میانجی (broker) است که پیام‌ها را مدیریت کند.

آیا Mosquitto مناسب پروژه بزرگ است؟
برای پروژه‌های متوسط و خانگی بسیار مناسب است. اگر خیلی بزرگ شود، ممکن است بخواهید به گزینه‌های تجاری یا clustering فکر کنید.

آیا امکان استفاده از گواهی معتبر SSL وجود دارد؟
بله، شما می‌توانید از Let’s Encrypt یا CA معتبر استفاده کرده و گواهی رایگان دریافت کنید.

اگر IP اینترنت من پویا است، چه کار کنم؟
می‌توانید از سرویس DNS پویا مانند DuckDNS یا No-IP بهره ببرید تا دامنه همواره به IP فعلی شما اشاره کند.

آیا می‌توانم چند بروکر Mosquitto را به هم وصل کنم؟
بله، از قابلیت bridging استفاده می‌شود تا دو یا چند بروکر پیام‌ها را باهم همگام کنند.

آیا می‌شود داشبورد وب برای کنترل دستگاه‌ها ساخت؟
بله، با ابزارهایی مانند Node-RED، Grafana، Home Assistant و رابط‌های MQTT می‌توان کنترل و نمایش وضعیت را به راحتی ایجاد کرد.

روع تست بخش سرور mqtt 

برای اینکار از بروکر eclipse mosquito استفادهه می کنیم که می تونید از لینک زیر نسبت به اپریشن سیستم دانلود کنید 

https://mosquitto.org/download/

بعد از دانلود یا به سیستم path  اضافه کنید یا این که به محل نصب بروید و از اونجا دستور ها رو اجرا کنید

از دستور زیر برای راه اندازی mosquito استفاده کنید  

آموزش نصب mosquito بر روی رسپبری پای

https://randomnerdtutorials.com/how-to-install-mosquitto-broker-on-raspberry-pi/

راه اندازی بروکر ماسکیتو بر روی رسپری پای 

https://randomnerdtutorials.com/testing-mosquitto-broker-and-client-on-raspbbery-pi/

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

برای امنیت، استفاده از سرویس کپتچا گوگل مورد نیاز است که تابع گوگل است سیاست حفظ حریم خصوصی و شرایط استفاده.

Iبا این شرایط موافقید.