typedef enum {
wifiNotConnected, wifiConnectWait, wifiConnectInit, wifiConnectWork
} wifiConnStage_t;
bool wifiConnect()
{
_ledWiFi->ledBlinkOn(_wifiBlinkConn);
_wifiTryConnect++;
Serial.print(F("WiFi :: Connect to network '"));
Serial.print(_wifiSSID);
Serial.print(F("', try "));
Serial.print(_wifiTryConnect);
Serial.print(F(" "));
#if defined(ESP32)
// -- ESP32 :: begin --------------------------------------------------
_wifiConnectedEvent = WiFi.onEvent(onWiFiConnected, WiFiEvent_t::SYSTEM_EVENT_STA_CONNECTED);
_wifiGotIPEvent = WiFi.onEvent(onWiFiGotIP, WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP);
if (_wifiDisconnectedEvent != 0) WiFi.removeEvent(_wifiDisconnectedEvent);
_wifiDisconnectedEvent = 0;
// -- ESP32 :: end ----------------------------------------------------
#else
// -- ESP8266 :: begin ------------------------------------------------
_wifiConnectedHandler = WiFi.onStationModeConnected(onWiFiConnected);
_wifiGotIPHandler = WiFi.onStationModeGotIP(onWiFiGotIP);
_wifiDisconnectedHandler = nullptr;
// -- ESP8266 :: end --------------------------------------------------
#endif
WiFi.mode(WIFI_STA);
WiFi.setAutoReconnect(false);
#if defined(ESP32)
// -- ESP32 :: begin --------------------------------------------------
WiFi.begin(_wifiSSID.c_str(), _wifiPass.c_str(), 0, NULL, false);
// -- ESP32 :: end ----------------------------------------------------
#else
// -- ESP8266 :: begin ------------------------------------------------
WiFi.begin(_wifiSSID, _wifiPass, 0, NULL, false);
// -- ESP8266 :: end --------------------------------------------------
#endif
_wifiStage = wifiConnectWait;
wifiConnTimerStart();
WiFi.reconnect();
}
bool wifiConnectionFailed(wl_status_t wifiStatus, const byte printStatus)
{
Serial.println();
Serial.println(F("WiFi :: Connection failed!"));
if (printStatus > 0) {
wifiPrintStatus(wifiStatus, printStatus > 1);
};
wifiConnTimerStop();
WiFi.disconnect(true);
#if defined(ESP32)
// -- ESP32 :: begin --------------------------------------------------
if (_cbWiFiConnLost != nullptr) {
_cbWiFiConnLost(WIFI_REASON_UNSPECIFIED);
};
// -- ESP32 :: end ----------------------------------------------------
#else
// -- ESP8266 :: begin ------------------------------------------------
if (_cbWiFiConnLost != nullptr) {
_cbWiFiConnLost(WIFI_DISCONNECT_REASON_UNSPECIFIED);
};
// -- ESP8266 :: end --------------------------------------------------
#endif
if (_wifiTryConnect >= _wifiTryConnectMax) {
Serial.println();
Serial.println(F("*****************************************************************************************"));
Serial.println(F("$$$ SYSTEM RESTART $$$"));
Serial.println(F("*****************************************************************************************"));
wifiConnTimerStop();
fixResetReason(RR_WIFI_CONN_ATTEMPTS_EXCEEDED);
ESP.restart();
};
}
bool wifiLoop()
{
bool _result = false;
// Проверяем статус подключения к WiFi
wl_status_t _wifiStatus = WiFi.status();
// Подключение к WiFi еще не было установлено
if ((_wifiStatus == WL_IDLE_STATUS) || (_wifiStatus == WL_DISCONNECTED)) {
switch (_wifiStage) {
// Нет подключения, запускаем процедуру соединяемся...
case wifiNotConnected:
wifiConnect();
break;
// В процессе подключения...
case wifiConnectWait:
yield();
// -- ESP8266 ONLY ------------------------------------------------------
#if defined(ESP8266)
// -- ESP8266 :: begin ------------------------------------------------
if (_connTimer.onRestart()) {
wifiConnTimerDo();
};
// -- ESP8266 :: end --------------------------------------------------
#endif
// -- ESP8266 ONLY ------------------------------------------------------
break;
// Что-то пошло не так, пожалуй лучше всего будет сбросить соединение
default:
wifiConnectionFailed(_wifiStatus, 2);
break;
};
}
// Подключение к WiFi установлено
else if (_wifiStatus == WL_CONNECTED) {
switch (_wifiStage) {
// Соединение установлено только что
case wifiConnectWait:
_result = true;
// Меняем частоту мигания светодиода
_ledWiFi->ledBlinkOn(_wifiBlinkInit);
// Останавливаем таймер подключения и сбрасываем счетчики
wifiConnTimerStop();
_wifiTimeSyncRun = 0;
_wifiStage = wifiConnectInit;
break;
// Соединение установлено в предыдущем рабочем цикле
case wifiConnectInit:
// Синхронизация времени с NTP, но только если она еще не была ни разу запущена
if (year() < 2000) {
// Считаем количество попыток синхронизации времени (так как она почему-то иногда не проходит совсем)
_wifiTimeSyncRun++;
if (_wifiTimeSyncRun > _wifiTimeSyncRunMax) {
// Не удалось синхронизировать время - собрасываем соединение
wifiConnectionFailed(_wifiStatus, 0);
}
else {
// Запускаем синхронизацию времени c NTP
_result = true;
ntpTimeSyncRun();
};
}
else {
// Ставим отметку, что инициализация завершена
_wifiStage = wifiConnectWork;
// Сбрасываем счетчик попыток соединения
_wifiTryConnect = 0;
// Выполняем процедуру при установлении соединения
if (_cbWiFiConnInit != nullptr) {
_result = true;
_cbWiFiConnInit(_wifiFisrtConnect);
};
// Сбрасываем флаг _wifiFisrtConnect
if (_wifiFisrtConnect) {
_wifiFisrtConnect = false;
};
// Отключаем мигание светодиода
_ledWiFi->ledBlinkOff();
};
break;
// Соединение установлено и инициализировано
case wifiConnectWork:
// Выполняем процедуру при постоянном соединении
if (_cbWiFiConnWork != nullptr) {
_result = true;
_cbWiFiConnWork();
};
break;
// Другое состояние
default:
wifiConnectionFailed(_wifiStatus, 2);
break;
};
}
// Ошибки : WL_NO_SSID_AVAIL, WL_CONNECTION_LOST, WL_CONNECT_FAILED, WL_SCAN_COMPLETED
else {
wifiConnectionFailed(_wifiStatus, 1);
};
return _result;
};