MQTT یک پروتکل سبک پیامرسانی است که برای ارتباط بین دستگاههای IoT و سرور طراحی شده. دستگاهها پیام را روی یک «موضوع» (Topic) منتشر (Publish) میکنند و دستگاههای دیگر میتوانند روی همان موضوع مشترک (Subscribe) شوند. در Arduino، کتابخانهٔ محبوب PubSubClient این پروتکل را پیادهسازی میکند.
اجزای اصلی MQTT
- Broker: سروری که پیامها را مسیریابی میکند (مثل HiveMQ یا Mosquitto)
- Publisher: دستگاهی که پیام میفرستد (مثلاً ESP32 با داده دما)
- Subscriber: دستگاه یا داشبوردی که پیام را دریافت میکند
- Topic: مسیر رشتهای مثل
home/livingroom/temperature
#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، میتوانید دما و رطوبت را هر چند ثانیه یکبار به یک داشبورد آنلاین ارسال کنید.
#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);
}کارگاه عملی: شبیهسازی بالا را اجرا کنید، به آدرس hivemq.com/demos/websocket-client بروید، به موضوع wokwi-weather سابسکرایب شوید و مقدار سنسور DHT22 را در شبیهساز تغییر دهید تا پیامهای زنده را ببینید.