در این نوشتار نحوۀ اتصال مجدد ESP32 به شبکۀ Wi-Fi (بعد از قطعی ارتباط) رو بهتون نشون میدیم. مواردی که در این مقاله بررسی میکنیم در زمانی که اتصال اینترنت ESP23 به صورت لحظه ای قطع میشه، یا مواقعی که ESP32 به صورت موقت خارج از محدودۀ روتر Wi-Fi است، یا شروع مجدد روتر، قطعی اینترنت مودم یا غیره بهتون کمک میکنه.
اتصال مجدد ESP32 به شبکه Wi-Fi بعد از قطعی اتصال
برای اینکه بتونین بعد از قطع شدن اتصال، مجدداً به شبکه Wi-Fi وصل بشین میتونین با استفاده از ()WiFi.reconnect
دوباره به نقطه دسترسی که قبلاً بهش وصل شده بودین، وصل بشین.
WiFi.reconnect()
یا میتونین ()WiFi.disconnect
و به دنبال اون WiFi.begin(ssid,password)
رو فراخوانی کنین.
WiFi.disconnect(); WiFi.begin(ssid, password);
یا وقتی اتصال قطع شد میتونین ESP32 رو با استفاده از ()ESP.restart
ریاستارت کنین.
شما میتونین کدی مثل کد زیر به ()loop
اضافه کنین تا هر چند وقت یک بار چک کنه و ببینه بورد به اینترنت وصله یا نه و اگر به اینترنت وصل نبود مجدداً به اینترنت وصلش کنه.
unsigned long currentMillis = millis(); // if WiFi is down, try reconnecting if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) { Serial.print(millis()); Serial.println("Reconnecting to WiFi..."); WiFi.disconnect(); WiFi.reconnect(); previousMillis = currentMillis; }
حتماً متغیرهای previousMillis
و interval
رو مشخص کنین. متغیر interval
نشون میده که هر چند میلیثانیه یک بار، اتصال چک شده (برای مثال 30 ثانیه):
unsigned long previousMillis = 0; unsigned long interval = 30000;
اینجا نمونه کامل رو براتون گذاشتم.
#include <WiFi.h> // Replace with your network credentials (STATION) const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; unsigned long previousMillis = 0; unsigned long interval = 30000; void initWiFi() { WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("Connecting to WiFi .."); while (WiFi.status() != WL_CONNECTED) { Serial.print('.'); delay(1000); } Serial.println(WiFi.localIP()); } void setup() { Serial.begin(115200); initWiFi(); Serial.print("RSSI: "); Serial.println(WiFi.RSSI()); } void loop() { unsigned long currentMillis = millis(); // if WiFi is down, try reconnecting every CHECK_WIFI_TIME seconds if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) { Serial.print(millis()); Serial.println("Reconnecting to WiFi..."); WiFi.disconnect(); WiFi.reconnect(); previousMillis = currentMillis; } }
این نمونه نشون میده که چجوری میشه به شبکه وصل شد و هر 30 ثانیه یک بار اگر بورد به اینترنت وصل بود اتصال رو چک کرد. اگه اتصال برقرار نبود، قطع میشه و تلاش میکنه مجدد به اینترنت وصل بشه.
یا به جای اون میتونین از Wi-Fi Events استفاده کنین تا قطعی اینترنت رو تشخیص بده و برای رفع مشکل تابعی رو فراخونی کنه.
ESP32 Wi-Fi Events
ESP32 میتونه رویداد های مختلف شبکه Wi-Fi رو مدیریت کنه. در رویداد های Wi-Fi لازم نیست که به طور مستمر وضعیت Wi-Fi رو چک کنین. وقتی یک رویداد خاص اتفاق میافته، به صورت خودکار تابع مورد نظر رو برای رفع مشکل فراخوانی میکنه.
اگر اتصال قطع شد یا مجدداً برقرار شد شناسایی رویداد های زیر میتونه مفید باشه:
-
ARDUINO_EVENT_WIFI_STA_CONNECTED : ماژول ESP32 در حالت station به یک نقطه دسترسی/hotspot (روتر) وصل میشه.
-
ARDUINO_EVENT_WIFI_STA_DISCONNECTED : اتصال ESP32 station به نقطه دسترسی قطع میشه.
در بخش بعدی یک مثال کاربردی ارائه دادیم.
اتصال مجدد به شبکۀ Wi-Fi بعد از قطعی اتصال
(Wi-Fi Events)
رویدادهای Wi-Fi میتونن تشخیص بدن که اتصال به Wi-Fi قطع شده و تلاش کنن تا دوباره اتصال رو برقرار کنن (از ARDUINO_EVENT_WIFI_STA_DISCONNECTED استفاده کنین.) نمونه کد رو در این قسمت میتونین مشاهده کنین:
#include <WiFi.h> const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; void WiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info){ Serial.println("Connected to AP successfully!"); } void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info){ Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void WiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info){ Serial.println("Disconnected from WiFi access point"); Serial.print("WiFi lost connection. Reason: "); Serial.println(info.wifi_sta_disconnected.reason); Serial.println("Trying to Reconnect"); WiFi.begin(ssid, password); } void setup(){ Serial.begin(115200); // delete old config WiFi.disconnect(true); delay(1000); WiFi.onEvent(WiFiStationConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED); WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP); WiFi.onEvent(WiFiStationDisconnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED); /* Remove WiFi event Serial.print("WiFi Event ID: "); Serial.println(eventID); WiFi.removeEvent(eventID);*/ WiFi.begin(ssid, password); Serial.println(); Serial.println(); Serial.println("Wait for WiFi... "); } void loop(){ delay(1000); }
کارکرد کد
در این مثال، سه رویداد رو اضافه کردیم: وقتی که ESP32 به Wi-Fi وصل میشه، وقتیکه آدرس IP دریافت میکنه، وقتی که اتصالش قطع میشه (بهترتیب زیر):
ARDUINO_EVENT_WIDI_STA_CONNECTED
and
ARDUINO_EVENT_WIFI_STA_GOT_IP
and
ARDUINO_EVENT_WIFI_STA_DISCONNECTED
وقتی ESP32 به نقطه دسترسی وصل میشه (Event ARDUINO_EVENT_WIFI_STA_CONNECTED
) تابع ()WiFiStationConnected
فراخون میشه:
WiFi.onEvent(WiFiStationConnected, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_CONNECTED);