آموزش ها
خانه هوشمند 4/1 ارسال از esp32 آردوینو به اپلیکیشن فلاتر از طریق اینترنت
طراحی خانه هوشمند قسمت چهارم بخش اول کد نویسی آردوینو برای ارسال و دریافت اطلاعات از طریق اینترنت با پروتوکل mqtt از طریق بروکر رسپبری پای که قبلا نصب کردیم
مقدمه
در عصر حاضر، «خانه هوشمند» دیگر فقط یک عبارت جذاب در مقالات تکنولوژی نیست؛ بلکه یکی از راهکارهای کلیدی برای ارتقای راحتی، امنیت و صرفهجویی انرژی در زندگی روزمره است. وقتی بتوانید از راه دور چراغها را خاموش و روشن کنید، درجه حرارت را تنظیم نمایید، یا سنسورهای مختلف را مانیتور کنید، دیگر خانه شما یک ابزار منفعل نیست، بلکه فعال و هوشمند است.
چالش بزرگ در طراحی خانه هوشمند، ارتباط مطمئن و امن بین بخشهای مختلف است. مخصوصاً وقتی دستگاههای کوچک مثل ESP32 بخواهند از طریق اینترنت با اپلیکیشن موبایل در ارتباط باشند. در این پروژه، قصد داریم از ESP32 با محیط آردوینو برای ارسال پیام به اپلیکیشن فلاتر (Flutter) از طریق اینترنت استفاده کنیم؛ یعنی دستگاه و اپلیکیشن در هر جایی باشند، باز هم بتوانند دادهها را رد و بدل کنند.
کدی که شما فرستادید، نمونهای عالی از اسکلت اولیه این ارتباط است. من آن را بخش به بخش تحلیل میکنم، نقاط قوت و ضعفش را نشان میدهم، و راهحلهایی برای توسعه و بهبود عملکرد پیشنهاد خواهم کرد. پس همراه باشید.
مروری بر اجزاء سیستم
پیش از آنکه به خود پروژه بپردازیم، بیایید هر یک از اجزا را معرفی کنیم:
ESP32: یک میکروکنترلر با وایفای داخلی، بسیار محبوب در پروژههای IoT.
آردوینو (Arduino framework): امکان استفاده از محیط آردوینو برای برنامهنویسی ESP32 را فراهم میکند.
MQTT: پروتکل سبک پیامگزاری (publish/subscribe) که برای IoT طراحی شده است.
Flutter: فریمورک کراسپلتفرم موبایل که با Dart کار میکند و میتوان اپلیکیشنهای اندروید و iOS تولید نمود.
Broker MQTT (سرور میانی): نقطهای که پیامها را میان دستگاه و اپلیکیشن واسطه میشود، مانند Mosquitto یا سرور MQTT ابری.
در این معماری، ESP32 به عنوان یک منتشرکننده (publisher) پیامها را به موضوعی (topic) ارسال میکند، و اپلیکیشن Flutter مشترک (subscriber) آن موضوع است یا برعکس.
انتخاب پروتکل ارتباطی: HTTP، MQTT یا WebSocket؟
یکی از اولین تصمیمات پروژه، انتخاب پروتکل مناسب است. چند گزینه متداول:
HTTP (REST API)
مزایا: ساده، شناخته شده، امکان استفاده از سرویسهای وب معمول
معایب: overhead بیشتر، نیاز به polling یا long-polling برای دریافت دادهWebSocket
مزایا: کانال دائمی دو طرفه، مناسب برای انتقال لحظهای
معایب: پشتیبانی کمتر در کتابخانهها نسبت به MQTT، پیچیدگی بیشتر در مدیریت کانکشنMQTT
مزایا: سبک، طراحی شده برای IoT، publish/subscribe، کارآمد در مصرف داده
معایب: نیاز به broker، ممکن است امنیت ابعاد بیشتری بخواهد
بهطور کلی، برای پروژههای IoT و خانه هوشمند، MQTT انتخاب متداول و منطقی است. بسیاری از راهنماها و مطالب درباره آن موجود است. www.emqx.com+1
در این پروژه، شما از MQTT استفاده کردهاید، که انتخاب خوبی است چون ارسال و دریافت پیام به شکل ناهمگون (asynchronous) و بدون نیاز به درخواست مداوم را ممکن میسازد.
ساختار پروژه پیشنهادی
من ساختار کلی پیشنهادی را به شکل لایهای بیان میکنم:
لایه دستگاه (ESP32)
مسئول خواندن سنسورها، محاسبه، ارسال داده به سرور، پاسخ به دستوراتلایه ارتباطی / سرور میانی (MQTT Broker)
واسطه بین دستگاه و اپلیکیشنلایه اپلیکیشن (Flutter)
دریافت پیام، نمایش وضعیت، ارسال دستورات به دستگاهمدیریت امنیت، احراز هویت و دسترسیها
جلوگیری از دسترسی غیرمجازلایه بهینهسازی (اختیاری)
مدیریت مصرف انرژی، فشردهسازی داده، نظارت بر اتصال
با این ساختار، اپلیکیشن و دستگاه به broker متصلاند و از طریق آن پیام رد و بدل میکنند.
تنظیمات سختافزاری و اتصالات
هر پروژه IoT باید از پایه سختافزاری درست شروع شود:
تأمین تغذیه مناسب برای ESP32 (معمولاً 5 ولت به 3.3 ولت یا تأمین مستقیم 3.3 ولت)
آنتن وایفای یا ماژول داخلی که در معرض تداخل قرار نگیرد
سیمکشی حسگرها و اکچیوترها با رعایت نویزگیرها (کابلهای کوتاه، فیلتراسیون)
تغذیه جداگانه برای بخشهای پر مصرف مانند LEDها یا موتورها
آزمون ابتدایی اتصال ESP32 به شبکه وایفای با یک اسکیچ ساده برای اطمینان
اگر این مقدمات به درستی فراهم نباشند، حتی بهترین کد هم کار نمیکند.
تحلیل و توضیح کد سمت ESP32
بیایید کد شما را خط به خط تحلیل کنیم و ببینیم چه کارهایی انجام داده و کجا امکان بهبود وجود دارد:
#include
#include
#include
#include "secrets.h"
ستفاده از کتابخانههای استاندارد:
WiFi.hبرای اتصال به شبکه،PubSubClient.hبرای MQTTفایل
secrets.hمعمولاً شامل SSID، پسورد و تنظیمات MQTT است (امنیت بهتری ایجاد میکند چون این اطلاعات در سورس اصلی نیستند)
const char* mqtt_server = MQTT_SERVER;
const uint16_t mqtt_port = MQTT_PORT;
WiFiClient espClient;
PubSubClient client(espClient);
تعریف آدرس سرور MQTT و پورت
شی
espClientکه اتصال TCP را میسازدشی
clientاز PubSubClient که از طریقespClientپیامهای MQTT را ارسال و دریافت میکند
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("📩 Message arrived [");
Serial.print(topic);
Serial.print("]: ");
for (int i = 0; i < length; i++) Serial.print((char)payload[i]);
Serial.println();
}
این تابع وقتی پیام جدید از سمت broker به دستگاه میآید اجرا میشود
نمایش موضوع (topic) و محتوای پیام در سریال
در پروژه عملی، این تابع باید پیام را تحلیل کرده و دستورات مربوطه را اجرا کند (مثلاً تغییر وضعیت یک رله)
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32Client", MQTT_USER, MQTT_PASSWORD)) {
Serial.println("Connected!");
client.subscribe("esp32/topic");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5s...");
delay(5000);
}
}
}
اگر اتصال MQTT قطع شده باشد، این تابع تلاش میکند مجدداً متصل شود
در هنگام اتصال موفق، مشترک شدن به یک topic (اینجا
"esp32/topic")در صورت شکست، تاخیر ۵ ثانیه و دوباره تلاش
نکته بهبود: استفاده از شناسه (client ID) منحصربهفرد برای هر دستگاه، و امکان تلاش محدود به تعداد دفعات یا استفاده از backoff افزایشی
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println("WiFi connected");
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
راهاندازی سریال برای دیباگ
اتصال به وایفای (حین برقراری اتصال، منتظر میماند)
پس از اتصال، پیام «WiFi connected» چاپ میشود
تعیین آدرس سرور MQTT و تابع callback
نکته بهبود: میتوان در این بخش وضعیت اتصال وایفای را با تایماوت کنترل کرد تا برنامه قفل نشود اگر شبکه موجود نباشد
void loop() {
if (!client.connected()) reconnect();
client.loop();
// ارسال پیام تست هر ۵ ثانیه
static unsigned long lastMsg = 0;
if (millis() - lastMsg > 5000) {
lastMsg = millis();
String message = "سلام از ESP32! زمان: " + String(millis()/1000) + "s";
client.publish("flutter/topic", message.c_str());
Serial.println("📤 Sent: " + message);
}
}
اگر اتصال MQTT قطع باشد، سعی در وصل مجدد
فراخوانی
client.loop()ضروری است تا پیامها پردازش شوندهر ۵ ثانیه یک پیام ساخته و منتشر میشود به موضوع
"flutter/topic"پیام رشتهای متنی است که زمان سپریشده را نشان میدهد
سپس پیام در سریال چاپ میشود
نکات بهبود/افزونهها:
امکان ارسال دادههای حسگر به جای پیام آزمایشی
بررسی بازگشت موفقیتآمیز انتشار (
client.publishمقدار بازگشتی دارد)افزودن فیلتر زمانی یا شرایط ویژه برای ارسال
در پروژه واقعی، ممکن است ارسال مداوم هر ۵ ثانیه مصرف داده یا پهنای باند را افزایش دهد
تلاش برای اتصال به وایفای: نکات و راهکارها
اتصال مطمئن به وایفای یکی از بخشهای حیاتی است. چند نکته:
بررسی وضعیت به صورت افزایشی و با تایماوت (نه حلقه بینهایت)
استفاده از حالت راهاندازی به صورت Access Point (AP + captive portal) برای پیکربندی اولیه
ذخیره پیکربندی وایفای در حافظه فلش یا EEPROM، تا در هر راهاندازی نیاز به ورود مجدد نباشد
امکان fallback به وضعیت AP در صورت شکست اتصال
این روش معمولاً در پروژههای IoT دیده میشود تا دستگاه وقتی نمیتواند به شبکه متصل شود، خودش یک نقطه دسترسی بسازد تا کاربر بتواند تنظیمات جدید را وارد کند.
راهاندازی و پیکربندی MQTT Broker
برای اینکه ESP32 و اپلیکیشن با هم ارتباط داشته باشند، نیاز به یک MQTT Broker دارید. گزینهها:
بروکر محلی مثل Mosquitto که بر روی رایانه یا سرور خانه اجرا شود
بروکر ابری مانند HiveMQ Cloud، EMQX Cloud، Adafruit IO
امکان استفاده از سرور خصوصی یا VPS
نکاتی که باید در انتخاب broker در نظر بگیرید:
پهنای باند و تأخیر
پشتیبانی از TLS / SSL
امکان وضعیت نگهداری (persistence)
پایداری و اطمینان بالا
پس از انتخاب، باید آدرس، پورت، نام کاربری و پسورد را در
secrets.hتنظیم کنید تا ESP32 بتواند به آن متصل شود.تابع callback و پردازش پیام ورودی
تابع
callbackکه در کد تعریف شده، زمانیکه پیام از بروکر به دستگاه میآید اجرا میشود. اما صرفاً چاپ پیام کافی نیست. باید:موضوع پیام را بررسی کنید
بر اساس موضوع و محتوا، فرمان اجرا نمایید (مثلاً روشن کردن رله، تغییر وضعیت، پاسخ دادن)
اگر پیام حاوی JSON است، میتوانید آن را به ساختار تبدیل و فیلدها را استخراج نمایید
مثال ساده:
void callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (int i = 0; i < length; i++) msg += (char)payload[i];
if (String(topic) == "flutter/cmd") {
if (msg == "TURN_ON") {
digitalWrite(RELAY_PIN, HIGH);
} else if (msg == "TURN_OFF") {
digitalWrite(RELAY_PIN, LOW);
}
}
}
در این مثال، اپلیکیشن فلاتر میتواند در موضوع flutter/cmd فرمانهایی مثل "TURN_ON" یا "TURN_OFF" ارسال کند و ESP32 آن را اجرا کند.
تابع reconnect و مدیریت قطع ارتباط
کد reconnect() شما یک حلقه بینهایت دارد که تا زمانی که اتصال برقرار نشده باشد تلاش میکند. اما در عمل بهتر است:
تعداد دفعات تلاش محدود باشد
استفاده از backoff افزایشی (مثلاً ۵ ثانیه، ۱۰ ثانیه، ۲۰ ثانیه …)
در صورت شکست مکرر، دستگاه به وضعیت safe fallback برود یا ریست شود
بازنشانی یا راهاندازی مجدد دستگاه در مواقعی که اتصال بر قرار نمیشود
به این ترتیب، دستگاه در شرایط نامطلوب نمیماند که به طور کامل از کار بیفتد.
ارسال پیام دورهای
در کد اصلی، شما هر ۵ ثانیه یک پیام ساده منتشر میکنید. این روش خوب برای تست است، اما در پروژه واقعی:
دادههای حسگر (دما، رطوبت، نور، حرکت و غیره) باید ارسال شوند
ممکن است نیاز باشد فقط وقتی تغییر وضعیت صورت گرفت پیام ارسال شود (تغییر محور)
در مواقعی که مصرف را کاهش میدهیم (sleep mode) ممکن است پیامها دیرتر ارسال شوند
افزون بر این، استفاده از QoS در MQTT میتواند سطح اطمینان را افزایش دهد
برای نمونه:
client.publish("flutter/tempsensor", tempStr.c_str(), true);
پارامتر true در انتشار به معنی retained است (پیام نگهداری شود).
پیام به اپلیکیشن فلاتر: ساختار داده و موضوعات
انتخاب موضوع (topic) و قالب پیام (payload) بسیار مهم است. برخی نکات:
ساختار موضوعها به صورت سلسلهمراتبی (مثلاً
home/livingroom/temperature)قالب پیام بهتر است JSON باشد برای انعطاف بیشتر
اگر پیام کمی بزرگ است، بهتر است آن را بخشبندی کنید
استفاده از ویژگی retain در موضوعات حیاتی
مثال پیام JSON:
{
"sensor": "temperature",
"value": 24.7,
"unit": "C",
"timestamp": 1623345678
}
در اپلیکیشن فلاتر، میتوانید این JSON را به ساختار Dart تبدیل کرده و مقادیر را استخراج نمایید.
توسعه اپلیکیشن Flutter
برای ارتباط با MQTT در فلاتر، چند کتابخانه محبوب وجود دارد، مثلا mqtt_client یا flutter_mqtt یا mqtt_client_flutter. در راهنمای EMQX آمده است چگونه در فلاتر MQTT استفاده کنید. www.emqx.com
مراحل کلی:
افزودن پکیج MQTT به
pubspec.yamlایجاد شیء مشتری (client) و اتصال به broker
subscribe به موضوع (topic)
دریافت پیامها و پردازش
نمایش دادهها در UI
ارسال فرمانها (publish)
مثال ساده در Flutter:
final client = MqttClient(brokerUrl, clientId);
client.connect(user, password);
client.subscribe("flutter/topic", MqttQos.atMostOnce);
client.updates.listen((List msgs) {
final recMsg = msgs[0].payload as MqttPublishMessage;
final payload =
MqttPublishPayload.bytesToStringAsString(recMsg.payload.message);
// پردازش payload، احتمالا تبدیل JSON
});
در اپلیکیشن، میتوانید دکمه برای ارسال فرمان هم داشته باشید:
client.publishMessage("flutter/cmd", MqttQos.atMostOnce, utf8.encode("TURN_ON"));
طراحی UI اپلیکیشن
در طراحی UI، باید موارد زیر در نظر گرفته شود:
صفحه اصلی وضعیت حسگرها (دما، روشنایی، حرکت و غیره)
دکمهها یا سوئیچها برای ارسال فرمانها
صفحه تنظیمات برای وارد کردن آدرس broker، کاربری، پسورد
نمایش نشانی اتصال، وضعیت اتصال (Connected / Disconnected)
نمایش خطاهای اتصال
طراحی باید ساده، روان و کاربرپسند باشد و وضعیتها را به کاربر اطلاع دهد.
امنیت ارتباطات
یکی از مهمترین بخشها، اطمینان از امنیت ارتباطات است. چند راهکار:
استفاده از TLS / SSL برای رمزنگاری ارتباط بین ESP32 و broker
استفاده از نام کاربری و رمز عبور برای احراز هویت
محدود کردن دسترسی به موضوعات خاص
بررسی اعتبار پیام در دستگاه (مثلاً امضای پیام یا توکن)
بهروزرسانی امن (OTA) برای رفع ضعفهای امنیتی
اگر از MQTT Broker ابری استفاده میکنید، مطمئن شوید پورت TLS (معمولاً 8883) و گواهی معتبر فعال باشد.
بهینهسازی مصرف انرژی
در پروژه خانه هوشمند، اگر ESP32 با باتری کار کند یا بخواهید مصرف انرژی را کاهش دهید، نکات زیر مهم است:
استفاده از حالت خواب (light sleep، deep sleep) بین ارسال پیامها
کاهش تعداد ارسال پیامها
استفاده از سنسورهای کم مصرف
بیدار شدن دورهای برای ارسال داده و بازگشت به خواب
بررسی اینکه اتصال MQTT پس از بیداری به درستی برقرار شود
به عنوان مثال، اگر دادهها هر یک دقیقه نیاز است، ESP32 میتواند ۵۵ ثانیه در خواب باشد و ۵ ثانیه بیدار شود و پیام ارسال کند.
چالشهای احتمالی و راهکارها
در پیادهسازی چنین سیستمی ممکن است با مشکلات روبهرو شوید:
قطع اتصال مداوم: به دلیل ناپایداری شبکه وایفای یا بروکر
راهکار: تابع reconnect قوی، backoff افزایشی، fallbackتاخیر در ارسال یا دریافت: به خصوص در شبکههای ضعیف
راهکار: کاهش حجم پیام، فشردهسازی، استفاده QoSمشکلات NAT / روتر: اگر بروکر در شبکه خانگی باشد، دسترسی از بیرون مشکل است
راهکار: استفاده از بروکر ابری یا VPNپیامهای از دسترفته: اگر QoS پایین باشد احتمال از دست رفتن پیام هست
راهکار: استفاده از QoS 1 یا 2، یا مکانیسم تأیید دریافتافزایش مقیاس (scalability): اگر دستگاههای متعدد دارید، مدیریت موضوع و نامگذاری آنها
حجم زیاد داده و پهنای باند: اگر دادهها سنگین باشند (مانند تصویر)
راهکار: فشردهسازی، ارسال بخش به بخش
چند پروژه مشابه که ESP32 و Flutter را ترکیب کردند وجود دارد. مثلاً در یک مقاله، از NodeMCU و فلاتر برای ارسال داده دما/رطوبت استفاده شده است. Medium
همچنین راهنمای استفاده از MQTT در Flutter توسط EMQX منتشر شده است. www.emqx.com
تست و اشکالزدایی
برای موفقیت پروژه، تست و دیباگ ضروری است:
ابتدا یک سناریو ساده بدون اپلیکیشن ایجاد کنید (مثلاً صرفاً اتصال MQTT و ارسال پیام)
روی Serial Monitor چاپ پیامها را بررسی کنید
استفاده از ابزارهایی مانند MQTT Explorer برای دیدن پیامهای موضوعات
در فلاتر، لاگهای دریافتی را چاپ کنید
بررسی خطاهای اتصال (کد بازگشتی
client.state()در ESP32)استفاده از LED یا خروجی برای نشان دادن وضعیت (مثلاً روشن شدن LED هنگام اتصال)
تست در شرایط شبکه ضعیف، قطع و وصل شبکه
توسعه آتی و افزونهها
پس از پیادهسازی پایه، میتوانید امکانات بیشتری اضافه کنید:
اتصال حسگرهای دما، رطوبت، گاز، حرکت
کنترل رلهها، موتور، LED
قابلیت OTA برای بهروزرسانی بیسیم
داشبورد تحت وب برای مانیتور از راه دور
نصب اعلان (notification) در اپلیکیشن
افزودن سیستم لاگ (ذخیره تاریخچه داده)
تحلیل دادهها، هشدار هوشمند
مثال پروژه کاربردی: کنترل نور و دما
فرض کنید در اتاق، یک سنسور دما و یک رله کنترل نور داریم:
ESP32 هر دقیقه دما را میخواند
اگر دما بالاتر از آستانه باشد، اپلیکیشن میتواند فرمان خاموشی نور را ارسال کند
اپلیکیشن وضعیت دما، نور و وضعیت رله را به کاربر نمایش میدهد
در این حالت، شما دو موضوع اصلی دارید:
home/room1/temperature→ ارسال دماhome/room1/light/cmd→ فرمان روشن / خاموش نور
این طراحی منسجم باعث میشود که ضمن مقیاسپذیری، مدیریت موضوعات آسان شود.
نکات مهم در تولید و استقرار
در هنگام استفاده عملی:
حتماً امکان بهروزرسانی OTA را اضافه کنید
ذخیره پایدار تنظیمات (MQTT، WiFi) در حافظه
امکان ریست نرم یا سخت دستگاه
استفاده از watchdog timer برای جلوگیری از قفل شدن دستگاه
مانیتور عملکرد، مصرف انرژی و خطاها
بررسی مصرف در وضعیتهای مختلف
طراحی برای افزونگی (مثلاً چند بروکر، fallback)
مقایسه با راهکارهای دیگر
بسته به شرایط پروژه، ممکن است بخواهید از راهکارهای جایگزین استفاده کنید:
بلوتوث / BLE: مناسب برای محیط محلی و برد کوتاه
Zigbee: شبکه مش با مصرف کم انرژی
LoRa / LoRaWAN: برای مخابره در مسافت زیاد با مصرف پایین
NB-IoT / LTE-M: اگر نیاز به پوشش گسترده با سیمکارت دارید
هر کدام مزایا و معایب خود را دارند؛ اما برای محیط خانگی با اتصال Wi-Fi، راهکار ESP32 + MQTT + Flutter بسیار مناسب است.
جمعبندی و توصیهها
پروژه شما — ارسال داده از ESP32 به اپلیکیشن فلاتر از طریق اینترنت — پل ارتباط میان سختافزار و نرمافزار است. کد نمونهای که نوشتید اسکلت اولیه بسیار خوبی است. اما برای تبدیل آن به یک محصول کاربردی، باید به مسائل زیر توجه ویژه کنید:
امنیت ارتباطات
پایداری اتصال و بازیابی آن
ساختار موضوعات و پیامها
بهینهسازی مصرف انرژی
طراحی رابط کاربری مناسب
اشکالزدایی و تست دقیق
قابلیت گسترش و افزودن ویژگیهای جدید
اگر بخواهید، میتوانم برایتان کد کامل اپلیکیشن فلاتر همراه با بخشهای ارسال و دریافت، UI و امنیت را آماده کنم و یا مثال عملی پروژه مشابه ارائه دهم. دوست داری آن را هم بسازم و برات ارسال کنم؟
سوالات متداول
چرا از MQTT استفاده میکنیم نه HTTP؟
MQTT سبکتر است، ارتباط دائمیتر را فراهم میآورد (publish/subscribe) و مناسب IoT است، در حالی که HTTP برای درخواست/پاسخ طراحی شده است.
آیا میتوانم بدون سرور MQTT کار کنم؟
میتوان از HTTP یا WebSocket استفاده کرد، یا ESP32 خودش نقش سرور بگیرد، اما آن طراحی پیچیدگی و محدودیتهای بیشتری دارد.
چگونه امنیت ارتباط را تضمین کنم؟
با استفاده از TLS، احراز هویت، محدود کردن دسترسی به موضوعات و بهروزرسانی امن (OTA).
آیا ESP32 توان اجرای TLS را دارد؟
بله، برخی کتابخانهها امکان TLS (SSL) را روی ESP32 فراهم میکنند، البته مصرف حافظه و پردازش بیشتر خواهد شد.
چگونه اپلیکیشن فلاتر پیامها را دریافت میکند؟
با اتصال به همان broker و مشترک شدن در همان موضوع (topic) پیامها، سپس پردازش payload دریافتی.
اگر اتصال MQTT قطع شود چه میشود؟
تابع reconnect() باید تلاش مجدد کند؛ در طراحی خوب باید تحلیل قطعی، backoff و fallback در نظر گرفته شود.