پرش به محتوای اصلی
سخت‌افزار و IoT
۱ دقیقه مطالعه

کنترل سخت‌افزار ESP32 از راه دور با وب: الگوی Polling ساده و مطمئن

معماری ساده برای کنترل یک دستگاه ESP32 (مثل پمپ دوزینگ) از طریق پنل وب، بدون نیاز به IP ثابت یا باز کردن پورت روی مودم؛ با الگوی Polling و وضعیت مطلوب.

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

دستگاهی که پشت مودم خانگی است IP عمومی ندارد و نمی‌شود مستقیم به آن وصل شد. به جای پیچیدگی‌هایی مثل باز کردن پورت، خود دستگاه هر چند ثانیه از سرور می‌پرسد «وضعیت مطلوب چیست؟» و خودش را با آن هماهنگ می‌کند.

وضعیت مطلوب به جای فرمان

سرور فرمان «روشن کن» نمی‌فرستد؛ وضعیت مطلوب را نگه می‌دارد (مثلاً پمپ ۱ روشن، دبی ۲۰). دستگاه در هر Poll وضعیت واقعی خودش را گزارش می‌دهد و وضعیت مطلوب را می‌گیرد. اگر یک درخواست گم شود، Poll بعدی همه چیز را درست می‌کند؛ هیچ فرمانی دوبار اجرا نمی‌شود.

typescript
// سرور (Node.js)
app.post('/api/device/sync', auth, (req, res) => {
  const { deviceId, actual } = req.body;
  devices.set(deviceId, { actual, lastSeen: Date.now() });
  res.json({ desired: desiredState.get(deviceId) ?? {} });
});

سمت ESP32

حلقه اصلی هر چند ثانیه یک درخواست HTTPS می‌فرستد. اگر شبکه قطع شد، دستگاه آخرین وضعیت امن را حفظ می‌کند و بعد از برگشت اتصال، دوباره همگام می‌شود.

cpp
void loop() {
  if (millis() - lastSync > SYNC_INTERVAL_MS) {
    lastSync = millis();
    StaticJsonDocument<256> body;
    body["deviceId"] = DEVICE_ID;
    body["actual"]["pump1"] = digitalRead(PUMP1_PIN);

    String desired;
    if (postJson("/api/device/sync", body, desired)) {
      applyDesiredState(desired);   // فقط تفاوت‌ها را اعمال کن
    }
  }
}

نکات کلیدی

  • توکن اختصاصی برای هر دستگاه؛ هیچ endpoint بدون احراز هویت.
  • نمایش «آخرین ارتباط» در پنل برای تشخیص آفلاین بودن دستگاه.
  • در صورت قطع طولانی، دستگاه به وضعیت امن (مثلاً خاموش) برگردد.

جمع‌بندی

Polling شاید قدیمی به نظر برسد، اما برای دستگاه‌های پشت NAT ساده‌ترین و مقاوم‌ترین راه است. با الگوی وضعیت مطلوب، گم شدن پیام‌ها دیگر خطرناک نیست.