Skip to content

Commit 067ca81

Browse files
authored
Merge pull request #32 from rjwats/ft_autoreconnect
Fix Access Point Issues
2 parents 94656de + 2c31b67 commit 067ca81

File tree

11 files changed

+124
-67
lines changed

11 files changed

+124
-67
lines changed

data/config/wifiSettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"ssid":"ssid",
2+
"ssid":"",
33
"password":"password",
44
"hostname":"esp8266-react",
55
"static_ip_config":false

data/www/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><link rel="stylesheet" href="/css/roboto.css"><link rel="manifest" href="/app/manifest.json"><title>ESP8266 React</title></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script src="/js/1.b351.js"></script><script src="/js/2.8ca9.js"></script><script src="/js/0.439a.js"></script></body></html>
1+
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><link rel="stylesheet" href="/css/roboto.css"><link rel="manifest" href="/app/manifest.json"><title>ESP8266 React</title></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script src="/js/1.b351.js"></script><script src="/js/2.8ca9.js"></script><script src="/js/0.40b9.js"></script></body></html>

data/www/js/0.40b9.js.gz

10.9 KB
Binary file not shown.

data/www/js/0.439a.js.gz

-10.9 KB
Binary file not shown.

interface/src/forms/APSettingsForm.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class APSettingsForm extends React.Component {
6666
<Fragment>
6767
<TextValidator
6868
validators={['required', 'matchRegexp:^.{1,32}$']}
69-
errorMessages={['Access Point SSID is required', 'Access Point SSID must be 32 characeters or less']}
69+
errorMessages={['Access Point SSID is required', 'Access Point SSID must be 32 characters or less']}
7070
name="ssid"
7171
label="Access Point SSID"
7272
className={classes.textField}

interface/src/forms/WiFiSettingsForm.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ class WiFiSettingsForm extends React.Component {
9999
{
100100
selectedNetwork ? this.renderSelectedNetwork() :
101101
<TextValidator
102-
validators={['required', 'matchRegexp:^.{1,32}$']}
103-
errorMessages={['SSID is required', 'SSID must be 32 characeters or less']}
102+
validators={['matchRegexp:^.{0,32}$']}
103+
errorMessages={['SSID must be 32 characters or less']}
104104
name="ssid"
105105
label="SSID"
106106
className={classes.textField}

src/NTPSettingsService.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ NTPSettingsService::NTPSettingsService(AsyncWebServer* server, FS* fs, SecurityM
66
_onStationModeDisconnectedHandler = WiFi.onStationModeDisconnected(std::bind(&NTPSettingsService::onStationModeDisconnected, this, std::placeholders::_1));
77
_onStationModeGotIPHandler = WiFi.onStationModeGotIP(std::bind(&NTPSettingsService::onStationModeGotIP, this, std::placeholders::_1));
88
#elif defined(ESP_PLATFORM)
9-
WiFi.onEvent(std::bind(&NTPSettingsService::onStationModeDisconnected, this, std::placeholders::_1, std::placeholders::_2), WiFiEvent_t::SYSTEM_EVENT_AP_STADISCONNECTED);
9+
WiFi.onEvent(std::bind(&NTPSettingsService::onStationModeDisconnected, this, std::placeholders::_1, std::placeholders::_2), WiFiEvent_t::SYSTEM_EVENT_STA_DISCONNECTED);
1010
WiFi.onEvent(std::bind(&NTPSettingsService::onStationModeGotIP, this, std::placeholders::_1, std::placeholders::_2), WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP);
1111
#endif
1212

src/OTASettingsService.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void OTASettingsService::writeToJsonObject(JsonObject& root) {
3939

4040
void OTASettingsService::configureArduinoOTA() {
4141
if (_arduinoOTA){
42+
_arduinoOTA->end();
4243
delete _arduinoOTA;
4344
_arduinoOTA = nullptr;
4445
}

src/WiFiSettingsService.cpp

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
#include <WiFiSettingsService.h>
22

3-
WiFiSettingsService::WiFiSettingsService(AsyncWebServer* server, FS* fs, SecurityManager* securityManager) : AdminSettingsService(server, fs, securityManager, WIFI_SETTINGS_SERVICE_PATH, WIFI_SETTINGS_FILE) {}
3+
WiFiSettingsService::WiFiSettingsService(AsyncWebServer* server, FS* fs, SecurityManager* securityManager) : AdminSettingsService(server, fs, securityManager, WIFI_SETTINGS_SERVICE_PATH, WIFI_SETTINGS_FILE) {
4+
#if defined(ESP8266)
5+
_onStationModeDisconnectedHandler = WiFi.onStationModeDisconnected(std::bind(&WiFiSettingsService::onStationModeDisconnected, this, std::placeholders::_1));
6+
#elif defined(ESP_PLATFORM)
7+
WiFi.onEvent(std::bind(&WiFiSettingsService::onStationModeDisconnected, this, std::placeholders::_1, std::placeholders::_2), WiFiEvent_t::SYSTEM_EVENT_STA_DISCONNECTED);
8+
#endif
9+
}
410

511
WiFiSettingsService::~WiFiSettingsService() {}
612

@@ -56,16 +62,46 @@ void WiFiSettingsService::onConfigUpdated() {
5662
}
5763

5864
void WiFiSettingsService::reconfigureWiFiConnection() {
59-
Serial.println("Reconfiguring WiFi...");
60-
61-
// disconnect and de-configure wifi and software access point
65+
// disconnect and de-configure wifi
6266
WiFi.disconnect(true);
6367

64-
// configure for static IP
68+
// reset last connection attempt to force loop to reconnect immediately
69+
_lastConnectionAttempt = 0;
70+
}
71+
72+
void WiFiSettingsService::readIP(JsonObject& root, String key, IPAddress& _ip){
73+
if (!root[key].is<String>() || !_ip.fromString(root[key].as<String>())){
74+
_ip = INADDR_NONE;
75+
}
76+
}
77+
78+
void WiFiSettingsService::writeIP(JsonObject& root, String key, IPAddress& _ip){
79+
if (_ip != INADDR_NONE){
80+
root[key] = _ip.toString();
81+
}
82+
}
83+
84+
void WiFiSettingsService::loop() {
85+
unsigned long currentMillis = millis();
86+
if (!_lastConnectionAttempt || (unsigned long)(currentMillis - _lastConnectionAttempt) >= WIFI_RECONNECTION_DELAY) {
87+
_lastConnectionAttempt = currentMillis;
88+
manageSTA();
89+
}
90+
}
91+
92+
void WiFiSettingsService::manageSTA() {
93+
// Abort if already connected, or if we have no SSID
94+
if (WiFi.isConnected() || _ssid.length() == 0) {
95+
return;
96+
}
97+
// Connect or reconnect as required
98+
if ((WiFi.getMode() & WIFI_STA) == 0) {
99+
Serial.println("Connecting to WiFi.");
65100
if (_staticIPConfig) {
101+
// configure for static IP
66102
WiFi.config(_localIP, _gatewayIP, _subnetMask, _dnsIP1, _dnsIP2);
67-
} else {
68-
// configure for DHCP
103+
} else {
104+
// configure for DHCP
69105
#if defined(ESP8266)
70106
WiFi.config(INADDR_ANY, INADDR_ANY, INADDR_ANY);
71107
WiFi.hostname(_hostname);
@@ -74,19 +110,18 @@ void WiFiSettingsService::reconfigureWiFiConnection() {
74110
WiFi.setHostname(_hostname.c_str());
75111
#endif
76112
}
77-
78-
// connect to the network
113+
// attempt to connect to the network
79114
WiFi.begin(_ssid.c_str(), _password.c_str());
80-
}
81-
82-
void WiFiSettingsService::readIP(JsonObject& root, String key, IPAddress& _ip){
83-
if (!root[key].is<String>() || !_ip.fromString(root[key].as<String>())){
84-
_ip = INADDR_NONE;
85115
}
86116
}
87117

88-
void WiFiSettingsService::writeIP(JsonObject& root, String key, IPAddress& _ip){
89-
if (_ip != INADDR_NONE){
90-
root[key] = _ip.toString();
91-
}
118+
#if defined(ESP8266)
119+
void WiFiSettingsService::onStationModeDisconnected(const WiFiEventStationModeDisconnected& event) {
120+
WiFi.disconnect(true);
92121
}
122+
#elif defined(ESP_PLATFORM)
123+
void WiFiSettingsService::onStationModeDisconnected(WiFiEvent_t event, WiFiEventInfo_t info) {
124+
WiFi.disconnect(true);
125+
}
126+
#endif
127+

src/WiFiSettingsService.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#define WIFI_SETTINGS_FILE "/config/wifiSettings.json"
88
#define WIFI_SETTINGS_SERVICE_PATH "/rest/wifiSettings"
9+
#define WIFI_RECONNECTION_DELAY 1000 * 60
910

1011
class WiFiSettingsService : public AdminSettingsService {
1112

@@ -15,13 +16,13 @@ class WiFiSettingsService : public AdminSettingsService {
1516
~WiFiSettingsService();
1617

1718
void begin();
19+
void loop();
1820

1921
protected:
2022

2123
void readFromJsonObject(JsonObject& root);
2224
void writeToJsonObject(JsonObject& root);
2325
void onConfigUpdated();
24-
void reconfigureWiFiConnection();
2526

2627
private:
2728
// connection settings
@@ -30,15 +31,27 @@ class WiFiSettingsService : public AdminSettingsService {
3031
String _hostname;
3132
bool _staticIPConfig;
3233

34+
// for the mangement delay loop
35+
unsigned long _lastConnectionAttempt;
36+
3337
// optional configuration for static IP address
3438
IPAddress _localIP;
3539
IPAddress _gatewayIP;
3640
IPAddress _subnetMask;
3741
IPAddress _dnsIP1;
3842
IPAddress _dnsIP2;
3943

44+
#if defined(ESP8266)
45+
WiFiEventHandler _onStationModeDisconnectedHandler;
46+
void onStationModeDisconnected(const WiFiEventStationModeDisconnected& event);
47+
#elif defined(ESP_PLATFORM)
48+
void onStationModeDisconnected(WiFiEvent_t event, WiFiEventInfo_t info);
49+
#endif
50+
4051
void readIP(JsonObject& root, String key, IPAddress& _ip);
4152
void writeIP(JsonObject& root, String key, IPAddress& _ip);
53+
void reconfigureWiFiConnection();
54+
void manageSTA();
4255

4356
};
4457

0 commit comments

Comments
 (0)