راهنمای کامل استفاده از سرور MQTT رایگان mqtt.giot.ir

مقدمه

این سرور یک سرویس رایگان MQTT Broker است که برای توسعه‌دهندگان اینترنت اشیاء (IoT) جهت تست و توسعه پروژه‌های خود فراهم شده است. استفاده از این سرور به شما امکان می‌دهد پیام‌ها را بین دستگاه‌های مختلف (مانند میکروکنترلرها، اپلیکیشن‌های موبایل، وب‌سایت‌ها) از طریق پروتکل MQTT تبادل کنید.

۱. مشخصات اتصال

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

نکات مهم در مورد اتصال:

۲. ساختار تاپیک (Topic Structure)

سرور به گونه‌ای تنظیم شده که کاربران با استفاده از نام کاربری giot می‌توانند به تاپیک‌های زیرمجموعه demo/giot/# دسترسی داشته باشند.

demo/
└── giot/
    ├── #  (wildcard)
    │
    ├── YOUR_UNIQUE_ID_1/
    │   ├── temperature
    │   ├── status
    │   └── command
    │
    └── YOUR_UNIQUE_ID_2/
        ├── humidity
        └── control

۳. پنل تحت وب (Web Panel)

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

https://cloud.giot.ir

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

۴. ملاحظات امنیتی

۵. نمونه کد آردوینو برای ESP32/ESP8266 با اتصال TLS

پیش‌نیازها:

  1. نصب برد ESP32/ESP8266 در Arduino IDE.
  2. نصب کتابخانه PubSubClient (نوشته Nick O'Leary) از طریق Library Manager.

کد نمونه:


#include <WiFi.h> // برای ESP32
// #include <ESP8266WiFi.h> // برای ESP8266 (یکی از این دو خط را فعال کنید)
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

// --- تنظیمات WiFi ---
const char* ssid = "YOUR_WIFI_SSID"; // نام شبکه WiFi خود را وارد کنید
const char* password = "YOUR_WIFI_PASSWORD"; // رمز عبور شبکه WiFi خود را وارد کنید

// --- تنظیمات MQTT Broker ---
const char* mqttServer = "mqtt.giot.ir";
const int mqttPort = 8883; // پورت TLS
const char* mqttUser = "giot";
const char* mqttPassword = "giot";

// --- شناسه منحصر به فرد دستگاه ---
// !!! این بخش را حتما با یک شناسه یکتا برای دستگاه خود جایگزین کنید !!!
const char* uniqueDeviceId = "YOUR_UNIQUE_DEVICE_ID"; // مثلا "my_esp32_livingroom"

// --- تاپیک‌های MQTT ---
char statusTopic[100]; // تاپیک برای ارسال وضعیت
char commandTopic[100]; // تاپیک برای دریافت دستور

// --- اشیاء کلاینت‌ها ---
WiFiClientSecure wifiClientSecure; // کلاینت امن برای TLS
PubSubClient client(wifiClientSecure);

unsigned long lastMsg = 0;
const long interval = 5000; // ارسال پیام هر 5 ثانیه

// --- تابع callback برای دریافت پیام‌های MQTT ---
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  String message;
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }
  Serial.println(message);

  // اینجا می‌توانید بر اساس پیام دریافتی کاری انجام دهید
  if (message == "ON") {
    Serial.println("Received ON command!");
    // کد روشن کردن LED یا رله
  } else if (message == "OFF") {
    Serial.println("Received OFF command!");
    // کد خاموش کردن LED یا رله
  }
}

// --- تابع اتصال مجدد به MQTT ---
void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    String clientId = "ESP_";
    #ifdef ESP32
      clientId += String(WiFi.macAddress());
    #else // ESP8266
      clientId += String(WiFi.macAddress());
    #endif
    clientId.replace(":", "");

    if (client.connect(clientId.c_str(), mqttUser, mqttPassword)) {
      Serial.println("connected");
      snprintf(statusTopic, sizeof(statusTopic), "demo/giot/%s/status", uniqueDeviceId);
      snprintf(commandTopic, sizeof(commandTopic), "demo/giot/%s/command", uniqueDeviceId);
      Serial.print("Status Topic: "); Serial.println(statusTopic);
      Serial.print("Command Topic: "); Serial.println(commandTopic);

      if (client.subscribe(commandTopic)) {
         Serial.print("Subscribed to: "); Serial.println(commandTopic);
      } else {
         Serial.println("Subscription failed!");
      }
       client.publish(statusTopic, "Device Connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

// --- تابع Setup ---
void setup() {
  Serial.begin(115200);
  Serial.println("\nStarting setup...");
  Serial.print("Connecting to "); Serial.println(ssid);
  #ifdef ESP32
    WiFi.begin(ssid, password);
  #else // ESP8266
    WiFi.begin(ssid, password);
  #endif

  while (WiFi.status() != WL_CONNECTED) {
    delay(500); Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.print("IP address: "); Serial.println(WiFi.localIP());

  // --- تنظیمات TLS ---
  // مهم: این خط اعتبارسنجی گواهی سرور را غیرفعال می‌کند (کمتر امن اما ساده‌تر).
  wifiClientSecure.setInsecure();
  // برای امنیت بیشتر، گواهی CA سرور را با setCACert() تنظیم کنید.

  client.setServer(mqttServer, mqttPort);
  client.setCallback(callback);
  Serial.println("MQTT setup done.");
}

// --- تابع Loop ---
void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop(); // حفظ ارتباط MQTT

  unsigned long now = millis();
  if (now - lastMsg > interval) {
    lastMsg = now;
    char msg[50];
    snprintf(msg, sizeof(msg), "Uptime: %lu sec", millis() / 1000);
    Serial.print("Publishing message: "); Serial.println(msg);
    client.publish(statusTopic, msg);
  }
}
            

۶. نحوه استفاده از کد آردوینو

  1. کد بالا را کپی کرده و در Arduino IDE پیست کنید.
  2. مقادیر YOUR_WIFI_SSID و YOUR_WIFI_PASSWORD را با اطلاعات شبکه WiFi خود جایگزین کنید.
  3. مقدار YOUR_UNIQUE_DEVICE_ID را با یک شناسه منحصر به فرد برای دستگاه خود عوض کنید (مثلاً esp_office_1).
  4. برد و پورت سریال صحیح ESP خود را در منوی Tools انتخاب کنید.
  5. کد را کامپایل و روی برد آپلود کنید.
  6. پنجره Serial Monitor را با بادریت 115200 باز کنید تا لاگ اتصال و پیام‌ها را ببینید.
  7. با استفاده از پنل وب cloud.giot.ir یا کلاینت MQTT دیگر، به تاپیک‌های وضعیت (برای مشاهده) و دستورات (برای ارسال ON/OFF) دستگاه خود متصل شوید و عملکرد را تست کنید.