پیشرفته⏱ 22 دقیقه مطالعه

MQTT یک پروتکل سبک پیام‌رسانی است که برای ارتباط بین دستگاه‌های IoT و سرور طراحی شده. دستگاه‌ها پیام را روی یک «موضوع» (Topic) منتشر (Publish) می‌کنند و دستگاه‌های دیگر می‌توانند روی همان موضوع مشترک (Subscribe) شوند. در Arduino، کتابخانهٔ محبوب PubSubClient این پروتکل را پیاده‌سازی می‌کند.

اجزای اصلی MQTT

  • Broker: سروری که پیام‌ها را مسیریابی می‌کند (مثل HiveMQ یا Mosquitto)
  • Publisher: دستگاهی که پیام می‌فرستد (مثلاً ESP32 با داده دما)
  • Subscriber: دستگاه یا داشبوردی که پیام را دریافت می‌کند
  • Topic: مسیر رشته‌ای مثل home/livingroom/temperature
CPP
#include <WiFi.h>
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient);
int counter = 0;

void setup() {
  Serial.begin(115200);
  WiFi.begin("Wokwi-GUEST", "");
  while (WiFi.status() != WL_CONNECTED) delay(500);

  client.setServer("broker.hivemq.com", 1883);
  while (!client.connected()) {
    client.connect("esp32-academy");
    delay(500);
  }
  Serial.println("به بروکر MQTT متصل شد");
}

void loop() {
  client.loop();   // نگه‌داشتن اتصال زنده

  counter++;
  String payload = "سلام شماره " + String(counter);
  client.publish("esp32-academy/demo", payload.c_str());
  Serial.println("ارسال شد: " + payload);
  delay(3000);
}
⚠️ هشدار

بروکرهای عمومی مانند broker.hivemq.com فقط برای آزمایش مناسب هستند؛ برای پروژهٔ واقعی از بروکر اختصاصی یا سرویس‌های ابری امن استفاده کنید. همچنین client.loop() باید مکرراً در loop() اصلی صدا زده شود، وگرنه اتصال MQTT قطع می‌شود.

پروژهٔ نهایی این فصل: ایستگاه هواشناسی بی‌سیم

با ترکیب سنسور DHT22 (درس ۷)، Wi-Fi (درس ۱۱) و MQTT، می‌توانید دما و رطوبت را هر چند ثانیه یک‌بار به یک داشبورد آنلاین ارسال کنید.

CPP
#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>

#define DHT_PIN 15
DHT dht(DHT_PIN, DHT22);
WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(115200);
  dht.begin();
  WiFi.begin("Wokwi-GUEST", "");
  while (WiFi.status() != WL_CONNECTED) delay(500);
  client.setServer("broker.hivemq.com", 1883);
}

void loop() {
  if (!client.connected()) {
    client.connect("esp32-weather");
  }
  client.loop();

  float t = dht.readTemperature();
  float h = dht.readHumidity();
  if (!isnan(t) && !isnan(h)) {
    String payload = String(t) + "," + String(h);
    client.publish("wokwi-weather", payload.c_str());
    Serial.println("ارسال شد: " + payload);
  }
  delay(5000);
}
شبیه‌سازی زندهٔ ایستگاه هواشناسی با MQTT — همان بروکر broker.hivemq.com و کتابخانهٔ PubSubClient که در این درس دیدید باز کردن در Wokwi ↗
در حال بارگذاری شبیه‌ساز… (ممکن است چند ثانیه طول بکشد)

این یک شبیه‌سازی واقعی و قابل اجراست؛ روی دکمه پخش (▶) در Wokwi بزنید تا کد روی برد مجازی ESP32 اجرا شود. اگر جعبهٔ بالا بیش از حد سیاه/خالی ماند، صفحه را رفرش کنید یا از دکمهٔ «باز کردن در Wokwi» بالا استفاده کنید.

🛠️ کارگاه عملی

کارگاه عملی: شبیه‌سازی بالا را اجرا کنید، به آدرس hivemq.com/demos/websocket-client بروید، به موضوع wokwi-weather سابسکرایب شوید و مقدار سنسور DHT22 را در شبیه‌ساز تغییر دهید تا پیام‌های زنده را ببینید.

❓ در الگوی MQTT، دستگاهی که پیام تولید می‌کند چه نامیده می‌شود؟
طراحی و توسعه: امین شیخ نجدیglcd.ir | نسخهٔ افزونه: 1.21.0