اتصال خودکار و مجدد به مودم پس از قطع ارتباط در ماژول ESP8266

اتصال خودکار و مجدد به مودم پس از قطع ارتباط در ماژول ESP8266
نوشته شده توسط

سلام و درود خدمت همراهان همیشگی مایکروالکام. در مطالب قبلی از سری مطالب مربوط به آموزش های ESP8266 به ارسال و دریافت دیتا از طریق MQTT پرداخته شد. در این مطلب به بررسی و نحوه اتصال مجدد بصورت خودکار به مودم یا روتری که ماژول وایفای ESP8266 به آن متصل بوده است پرداخته خواهد شد. پس با من تا انتهای مطلب همراه باشید. همچنین شما میتونید سایر مطالب من رو از این قسمت دنبال کنید.


مقدمه

برخی از پروژه های مبتنی بر اینترنت اشیا (IoT) که از ماژول های ESP8266 یا ESP32 استفاده شده است مستلزم اتصال به یک مودم یا روتر جهت برقراری ارتباط بر بستر اینترنت هستند. برای اینکار طبق آموزش های قبلی ماژول ESP8266 یا ESP32 خود را به آن متصل می‌کنیم. اما در برخی مواقع بنا به دلایلی همانند Restart شدن مودم، قطع اتصال اینترنت مودم، خاموش شدن مودم یا هر دلیل دیگر ارتباط دستگاه با مودم قطع خواهد شد.

در این مواقع نیاز است که دستگاه به مودم دیگری متصل شود یا در صورت رفع مواردی که بیان شد، مجددا به همان شبکه متصل شود. در این مورد روش هایی وجود دارد مثلا دائما شبکه WiFi های موجود بررسی شود و در صورت وجود شبکه مورد نظر مجددا به آن متصل شد. اما یک روش ساده تر این است که بصورت خودکار ماژول به آخرین یا همان مودم/روتر مد نظر متصل شود. در این مطلب به بیان این راه حل پرداخته خواهد شد.


اتصال ESP8266 به مودم WiFi

جهت برقراری ارتباط و اتصال EPS8266 به مودم یا روتر می‌توانیم از تکه کد زیر استفاده نماییم. در کد زیر پس از اتصال موفقیت آمیز، IP محلی اختصاص داده شده را نمایش خواهیم داد. در کد زیر بجای ssid نام مودم خود و بجای password، رمز مودم را وارد کنید. حتما به یاد داشته باشید که این دو مقدار را حتما بین دو دبل کوتیشن (” “) قرار دهید.

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());
}

اتصال مجدد به شبکه WiFi پس از قطع اتصال در ESP8266

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

جهت اتصال مجدد به شبکه WiFi پس از قطع ارتباط می‌توانیم از دستورات به ترتیب زیر استفاده نماییم. با این کار می‌توانیم ماژول ESP8266 را به آخرین شبکه ای که متصل بوده است، متصل نماییم. محل قرار گیری این دستورات، در جایی است که دستورات برقراری ارتباط و اتصال به مودم را نوشته ایم. می‌توانیم در کد هایی که در بالا به آن اشاره شده، آنها را پس از دستور Serial.println(WiFi.localIP()) وارد نماییم.

WiFi.setAutoReconnect(true);
WiFi.persistent(true);

برقراری ارتباط با مودم و اتصال خودکار به شبکه WiFi در ESP8266

در کد های زیر، هر 20 ثانیه وضعیت اتصال به مودم بررسی خواهد شد. در صورتی که مشکلی رخ داده باشد مثلا مودم قطع یا خاموش شده باشد وضعیت آن را برروی سریال مانیتور نمایش خواهیم داد. همچنین با استفاده از دستورات مربوط به اتصال مجدد که در کد زیر نیز لحاظ شده است، پس از روشن شدن یا رفع مشکل مودم، ماژول ESP8266 بصورت خودکار به مودم متصل خواهد شد. جهت بررسی به مدت هر 20 ثانیه از تابع Millis استفاده شده است.

#include <ESP8266WiFi.h>

const char* ssid = "ssid";
const char* password = "password";

unsigned long previousMillis = 0;
unsigned long interval = 20000; //every 20sec.

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("");
  Serial.print("Local IP: ");
  Serial.println(WiFi.localIP());
  WiFi.setAutoReconnect(true);
  WiFi.persistent(true);
}

void setup() {
  Serial.begin(115200);
  initWiFi(); //connect to modem
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval){
    //check ESP8266 WiFi connection status
    switch (WiFi.status()){
      case WL_NO_SSID_AVAIL:
        Serial.println("Configured SSID cannot be reached");
        break;
      case WL_CONNECTED:
        Serial.println("Connection successfully established");
        break;
      case WL_CONNECT_FAILED:
        Serial.println("Connection failed");
        break;
    }
    Serial.printf("Connection status: %d\n", WiFi.status());
    previousMillis = currentMillis;
  }
}

نتیجه

اتصال مجدد به مودم پس از قطع ارتباط در ESP8266
اتصال مجدد به مودم پس از قطع ارتباط در ESP8266

اتصال مجدد به مودم به روش استفاده از وقایع یا Events در ESP8266

توسط ماژول های ESP8266 می‌توانیم Event ها گوناگونی را همانند قطع ارتباط داشته و از آنها در کد های خود استفاده نماییم. با استفاده از این وقایع نیاز به چک کردن وضعیت ماژول بصورت دائم نیست. هنگامی که یک Event رخ دهد، تابع معرفی شده آن و دستورات کاربر در آن، بصورت خودکار فراخوانی و انجام خواهند شد. می‌توان این کار را به نوعی شبیه عملکرد وقفه دانست. در روش دوم اتصال مجدد ماژول به مودم یا روتر از Event های زیر می‌توانیم استفاده نماییم. در ادامه به یک نمونه از استفاده این دستورات پرداخته خواهد شد.

    • onStationModeGotIP: هنگام اتصال بصورت موفقیت آمیز، این رویداد رخ داده و می‌توانیم IP اختصاص داده شده به ماژول را دریافت و آن را نمایش دهیم.
    • onStationModeDisconnected: هنگام قطع ارتباط با مودم، این رویداد رخ داده و می‌توانیم دستورات مورد نظر خود را در صورت رخ دادن چنین وضعیتی انجام دهیم.

نمونه کد

در کد زیر هنگام اتصال صحیح به مودم، Event مورد نظر (onWifiConnect) رخ داده و در تابع آن IP لوکال اختصاص داده شده را نمایش خواهیم داد. در صورت قطع ارتباط ماژول و مودم Event مربوطه (onWifiDisconnect) رخ داده و در دستورات داخل تابع آن مجددا نسبت به اتصال به مودم اقدام خواهد شد.

#include <ESP8266WiFi.h>

// Replace with your network credentials
const char* ssid = "ssid";
const char* password = "password";

WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;

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("");
  Serial.print("Local IP: ");
  Serial.println(WiFi.localIP());
}

void onWifiConnect(const WiFiEventStationModeGotIP& event) {
  Serial.println("Connected to Wi-Fi sucessfully.");
  Serial.print(" Local IP Address: ");
  Serial.println(WiFi.localIP());
}

void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
  Serial.println("Disconnected from Wi-Fi, trying to connect...");
  WiFi.disconnect();
  WiFi.begin(ssid, password);
}

void setup() {
  Serial.begin(115200);
  pinMode(2, OUTPUT);

  //Register event handlers
  wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
  wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);
  //connect to modem
  initWiFi();
}

void loop() {
  digitalWrite(2, LOW);
  delay(1000);
  digitalWrite(2, HIGH);
  delay(1000);
}

نتیجه

اتصال مجدد به مودم پس از قطع ارتباط مودم با استفاده از Events در ESP8266
اتصال مجدد به مودم پس از قطع ارتباط مودم با استفاده از Events در ESP8266

نتیجه گیری

در این مطلب به بیان دو روش جهت برقرای ارتباط و اتصال مجدد ماژول ESP8266 با مودم یا روتر وایفای بیان شد. با استفاده از روش دوم یا همان استفاده از Event ها نیاز به بررسی همیشگی و دائمی نبوده و در صورت رخ دادن شرایط Event، به تابع مربوطه رفته و می‌توانیم دستورات مورد نظر خود را انجام دهیم.

امیدوارم از این آموزش کمال بهره را برده باشید. در صورتی که هرگونه نظر یا سوال داشتید درباره این آموزش لطفا اون رو در انتهای همین صفحه در قسمت دیدگاه ها قرار بدید. در کوتاه ترین زمان ممکن به اون ها پاسخ خواهم داد. اگر این مطلب براتون مفید بود، اون رو حتما به اشتراک بگذارید. همینطور میتونید این آموزش را توی اینستاگرام با هشتگ microelecom# به اشتراک بگذارید و پیج مایکروالکام (microelecom@) رو هم منشن کنید.

<%