کنترل سختافزار ESP32 از راه دور با وب: الگوی Polling ساده و مطمئن
معماری ساده برای کنترل یک دستگاه ESP32 (مثل پمپ دوزینگ) از طریق پنل وب، بدون نیاز به IP ثابت یا باز کردن پورت روی مودم؛ با الگوی Polling و وضعیت مطلوب.
دستگاهی که پشت مودم خانگی است IP عمومی ندارد و نمیشود مستقیم به آن وصل شد. به جای پیچیدگیهایی مثل باز کردن پورت، خود دستگاه هر چند ثانیه از سرور میپرسد «وضعیت مطلوب چیست؟» و خودش را با آن هماهنگ میکند.
وضعیت مطلوب به جای فرمان
سرور فرمان «روشن کن» نمیفرستد؛ وضعیت مطلوب را نگه میدارد (مثلاً پمپ ۱ روشن، دبی ۲۰). دستگاه در هر Poll وضعیت واقعی خودش را گزارش میدهد و وضعیت مطلوب را میگیرد. اگر یک درخواست گم شود، Poll بعدی همه چیز را درست میکند؛ هیچ فرمانی دوبار اجرا نمیشود.
// سرور (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 میفرستد. اگر شبکه قطع شد، دستگاه آخرین وضعیت امن را حفظ میکند و بعد از برگشت اتصال، دوباره همگام میشود.
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 سادهترین و مقاومترین راه است. با الگوی وضعیت مطلوب، گم شدن پیامها دیگر خطرناک نیست.