ayushsharma82 / ESPConnect

[Deprecated] Simple & Easy WiFi Manager with Captive Portal for ESP8266 / ESP32
GNU General Public License v3.0
94 stars 30 forks source link

[v2] ESPConnect v2 Proposal #23

Closed mathieucarbou closed 8 months ago

mathieucarbou commented 9 months ago

Note: the logo is only in my local fork - not in this PR. This PR has the default ESpConnect logo of course.

Here is the code rewrite of ESPConnect I did and which I am using.

Debug

-D ESPCONNECT_DEBUG

Usage

Add: -D ESPCONNECT_V2

See API doc for more info.

  ESPConnect.setAutoRestart(false);  // true to switch back to old behaviour
  ESPConnect.setBlocking(false); // true to switch back to old behaviour

  ESPConnect.setCaptivePortalTimeout(Config.getInt(KEY_CAPTURE_PORTAL_TIMEOUT));
  ESPConnect.setWiFiConnectTimeout(Config.getInt(KEY_WIFI_CONNECTION_TIMEOUT));

  // using this being() method will use auto-load and auto-save internal code for apMode flag and wifi creds
  ESPConnect.begin(&Mycila::HTTPd.server,
                   Config.get(KEY_HOSTNAME),
                   AppInfo.name + "-" + AppInfo.id,
                   Config.get(KEY_ADMIN_PASSWORD));

    // using this being() method WON'T use auto-load and auto-save internal code for apMode flag and wifi creds: up to the user to handle saving (that's what I am using)
  ESPConnect.begin(&HTTPd.server,
                   Config.get(KEY_HOSTNAME),
                   AppInfo.name + "-" + AppInfo.id,
                   Config.get(KEY_ADMIN_PASSWORD),
                   {Config.get(KEY_WIFI_SSID), Config.get(KEY_WIFI_PASSWORD), Mycila::Config.getBool(KEY_AP_MODE_ENABLE)});

If using aync (non-blocking) mode, you need to call loop()

Events

You can listen to events like that. If not using auto restart, you need to listen to events to decide what to fo when reaching a final state!

Example:

  ESPConnect.listen([&](ESPConnectState previous, ESPConnectState state) {
    Mycila::Logger.debug(TAG, "NetworkState: %s => %s", ESPConnect.getStateName(previous), ESPConnect.getStateName(state));

    switch (state) {
    case ESPConnectState::STA_CONNECTED:
      Mycila::Logger.info(TAG, "Connected to WiFi %s with IP address %s", ESPConnect.getWiFiSSID().c_str(), ESPConnect.getIPAddress().toString().c_str());
      break;

    case ESPConnectState::AP_CONNECTED:
      Mycila::Logger.info(TAG, "Access Point %s started with IP address %s", ESPConnect.getWiFiSSID().c_str(), ESPConnect.getIPAddress().toString().c_str());
      break;

    case ESPConnectState::STA_DISCONNECTED:
      Mycila::Logger.warn(TAG, "Disconnected from WiFi %s", ESPConnect.getWiFiSSIDConfigured().c_str());
      _events.push(AppEvent::NETWORK_DISCONNECTED);
      break;

    case ESPConnectState::NETWORK_DISABLED:
      Mycila::Logger.info(TAG, "Disable Network...");
      break;

    case ESPConnectState::STA_CONNECTING:
      Mycila::Logger.info(TAG, "Connecting to WiFi %s (timeout: %u seconds)...", ESPConnect.getWiFiSSIDConfigured().c_str(), ESPConnect.getWiFiConnectTimeout());
      break;

    case ESPConnectState::AP_CONNECTING:
      Mycila::Logger.info(TAG, "Starting Access Point %s...", ESPConnect.getAccessPointSSID().c_str());
      break;

    case ESPConnectState::PORTAL_STARTING:
      Mycila::Logger.info(TAG, "Starting Captive Portal %s for %u seconds...", ESPConnect.getAccessPointSSID().c_str(), ESPConnect.getCaptivePortalTimeout());
      break;

    case ESPConnectState::PORTAL_STARTED:
      Mycila::Logger.info(TAG, "Captive Portal started at %s with IP address %s", ESPConnect.getWiFiSSID().c_str(), ESPConnect.getIPAddress().toString().c_str());
      break;

    case ESPConnectState::PORTAL_COMPLETE: {
      bool ap = ESPConnect.isAPMode();
      if (ap) {
        Mycila::Logger.info(TAG, "Captive Portal: Access Point configured");
        // SAVE CONFIG
        Mycila::Config.setBool(KEY_AP_MODE_ENABLE, true);
      } else {
        Mycila::Logger.info(TAG, "Captive Portal: WiFi configured");
        // SAVE CONFIG
        Mycila::Config.setBool(KEY_AP_MODE_ENABLE, false);
        Mycila::Config.set(KEY_WIFI_SSID, ESPConnect.getWiFiSSIDConfigured());
        Mycila::Config.set(KEY_WIFI_PASSWORD, ESPConnect.getWiFiPassword());
      }
      // TRIGGER ESP RESTART
      _restartThrottle.setEnable(true);
      break;
    }

    case ESPConnectState::PORTAL_TIMEOUT:
      Mycila::Logger.warn(TAG, "Captive Portal: timed out.");
      // TRIGGER ESP RESTART    
      _restartThrottle.setEnable(true);
      break;

    case ESPConnectState::STA_TIMEOUT:
      Mycila::Logger.error(TAG, "Unable to connect to SSID: %s", ESPConnect.getWiFiSSIDConfigured().c_str());
      break;

    case ESPConnectState::STA_RECONNECTING:
      Mycila::Logger.info(TAG, "Trying to reconnect to WiFi %s", ESPConnect.getWiFiSSIDConfigured().c_str());
      break;

    default:
      break;
    }
  });
mathieucarbou commented 8 months ago

MycilaESPConnect fork is available in platformio registry and Arduino lib manager.