// Reference: https://github.com/copercini/esp32-iot-examples/blob/master/WiFi_nonBlocking/WiFi_nonBlocking.ino
#include "WifiManager.h"
#include "WiFi.h"
const char * APP_WIFI_STA_SSID = "my-wifi-ssid";
const char * APP_WIFI_STA_PASS ="my-wifi-password";
const char * APP_WIFI_AP_SSID = "my-device-name";
String sta_ipv6;
String ap_ipv6;
volatile bool connected;
void onWhenWifiConnects();
void onWhenWifiOnDisconnects();
void whileWifiIsConnectedLoop();
void WiFiEvent(WiFiEvent_t event);
WifiManager::WifiManager()
{
ESP_LOGW(TAG, "Start the constructor\n");
// Delete old configurations, if any
WiFi.disconnect(true);
// Wait some time
vTaskDelay(500);
connected = false;
WiFi.onEvent(WiFiEvent);
ESP_LOGW(TAG, "Finished with the constructor\n");
}
void WifiManager::run()
{
}
WifiManager::~WifiManager()
{
}
void WiFiEvent(WiFiEvent_t event)
{
ESP_LOGW(TAG, "Runing WiFiEvent\n");
switch (event)
{
case SYSTEM_EVENT_WIFI_READY:
ESP_LOGW(TAG, "[WiFi-event] ESP32 WiFi ready\n");
case SYSTEM_EVENT_SCAN_DONE:
ESP_LOGW(TAG, "[WiFi-event] ESP32 finish scanning AP\n");
case SYSTEM_EVENT_STA_START:
//set sta hostname here
WiFi.setHostname(APP_WIFI_AP_SSID);
ESP_LOGW(TAG, "[WiFi-event] ESP32 station start\n");
case SYSTEM_EVENT_AP_START:
ESP_LOGW(TAG, "[WiFi-event] ESP32 soft-AP start\n");
//can set ap hostname here
WiFi.softAPsetHostname(APP_WIFI_AP_SSID);
//enable ap ipv6 here
WiFi.softAPenableIpV6();
case SYSTEM_EVENT_STA_STOP:
ESP_LOGW(TAG, "[WiFi-event] ESP32 station stop\n");
case SYSTEM_EVENT_STA_CONNECTED:
//enable sta ipv6 here
WiFi.enableIpV6();
ESP_LOGW(TAG, "[WiFi-event] ESP32 station connected to AP\n");
case SYSTEM_EVENT_AP_STA_GOT_IP6:
ESP_LOGW(TAG, "[WiFi-event] ESP32 station or ap or ethernet interface v6IP addr is preferred\n");
//both interfaces get the same event
sta_ipv6 = WiFi.localIPv6().toString();
ap_ipv6 = WiFi.softAPIPv6().toString();
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
connected = false;
onWhenWifiOnDisconnects();
//TODO: Set the disconnected flag
//TODO: Reset-the ip address (clear the ip)
ESP_LOGW(TAG, "[WiFi-event] ESP32 station disconnected from AP\n");
case SYSTEM_EVENT_STA_AUTHMODE_CHANGE:
ESP_LOGW(TAG, "[WiFi-event] The auth mode of AP connected by ESP32 station changed\n");
case SYSTEM_EVENT_STA_LOST_IP:
ESP_LOGW(TAG, "[WiFi-event] ESP32 station lost IP and the IP is reset to 0\n");
case SYSTEM_EVENT_STA_WPS_ER_SUCCESS:
ESP_LOGW(TAG, "[WiFi-event] ESP32 station wps succeeds in enrollee mode\n");
case SYSTEM_EVENT_STA_WPS_ER_FAILED:
ESP_LOGW(TAG, "[WiFi-event] ESP32 station wps fails in enrollee mode\n");
case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT:
ESP_LOGW(TAG, "[WiFi-event] ESP32 station wps timeout in enrollee mode\n");
case SYSTEM_EVENT_STA_WPS_ER_PIN:
ESP_LOGW(TAG, "[WiFi-event] ESP32 station wps pin code in enrollee mode\n");
case SYSTEM_EVENT_ETH_START:
ESP_LOGW(TAG, "[WiFi-event] SP32 ethernet start\n");
case SYSTEM_EVENT_ETH_STOP:
ESP_LOGW(TAG, "[WiFi-event] ESP32 ethernet stop\n");
case SYSTEM_EVENT_ETH_CONNECTED:
ESP_LOGW(TAG, "[WiFi-event] ESP32 ethernet phy link up\n");
case SYSTEM_EVENT_ETH_DISCONNECTED:
ESP_LOGW(TAG, "[WiFi-event] ESP32 ethernet phy link down \n");
case SYSTEM_EVENT_ETH_GOT_IP:
ESP_LOGW(TAG, "[WiFi-event] ESP32 ethernet got IP from connected AP\n");
case SYSTEM_EVENT_MAX:
ESP_LOGW(TAG, "[WiFi-event] ESP32 ethernet got IP from connected AP\n");
case SYSTEM_EVENT_AP_STOP:
ESP_LOGW(TAG, "[WiFi-event] ESP32 soft-AP stop \n");
case SYSTEM_EVENT_AP_STACONNECTED:
ESP_LOGW(TAG, "[WiFi-event] A station connected to ESP32 soft-AP \n");
case SYSTEM_EVENT_AP_STADISCONNECTED:
ESP_LOGW(TAG, "[WiFi-event] A station disconnected from ESP32 soft-AP\n");
case SYSTEM_EVENT_AP_PROBEREQRECVED:
ESP_LOGW(TAG, "[WiFi-event] Receive probe request packet in soft-AP interface \n");
case SYSTEM_EVENT_STA_GOT_IP:
ESP_LOGW(TAG, "[WiFi-event] event\n");
ESP_LOGW(TAG, "WiFi connected\n");
ESP_LOGW(TAG, "IP address: %f\n", WiFi.localIP());
connected = true;
onWhenWifiConnects();
// TODO: Set the connected flag
// TODO: Set the ip
break;
}
}
void onWhenWifiConnects()
{
Serial.println("STA Connected");
Serial.print("STA SSID: ");
Serial.println(WiFi.SSID());
Serial.print("STA IPv4: ");
Serial.println(WiFi.localIP());
Serial.print("STA IPv6: ");
Serial.println(WiFi.localIPv6());
}
void onWhenWifiOnDisconnects()
{
Serial.println("STA Disconnected");
delay(1000);
WiFi.begin(APP_WIFI_STA_SSID, APP_WIFI_STA_PASS);
}
void whileWifiIsConnectedLoop()
{
Serial.print("RSSI: ");
Serial.println(WiFi.RSSI());
delay(1000);
}
bool WifiManager::isConnected()
{
return connected;
}