Fix WiFi setup

* Increased the number of APs that can be queried and filtered out those that have an RSSI -95.  Previously, the number of returned SSIDs could blow the output buffer.
* Do not disable the Save button during scan of potential APs.  If the scan is taking a long time you should just be able to type it in.
* If a connection is lost and cannot be recovered fall back to AP mode to allow resetting the creds without power off.
This commit is contained in:
Robert Strouse 2023-02-07 11:09:10 -08:00
parent dcd90a4c29
commit e1aada23b0
3 changed files with 46 additions and 22 deletions

View file

@ -15,6 +15,7 @@ extern SocketEmitter sockEmit;
extern MQTTClass mqtt; extern MQTTClass mqtt;
extern rebootDelay_t rebootDelay; extern rebootDelay_t rebootDelay;
int connectRetries = 0;
void Network::end() { void Network::end() {
sockEmit.end(); sockEmit.end();
SSDP.end(); SSDP.end();
@ -34,11 +35,21 @@ bool Network::setup() {
} }
void Network::loop() { void Network::loop() {
if(millis() - this->lastEmit > 1500) { if(millis() - this->lastEmit > 1500) {
if(this->connect()) {} while(!this->connect()) {
// If we lost our connenction
connectRetries++;
if(connectRetries > 100) {
this->openSoftAP();
break;
}
sockEmit.loop();
}
connectRetries = 0;
this->lastEmit = millis(); this->lastEmit = millis();
this->emitSockets(); this->emitSockets();
if(WiFi.status() != WL_CONNECTED) return;
} }
else sockEmit.loop(); sockEmit.loop();
if(settings.WIFI.ssdpBroadcast) { if(settings.WIFI.ssdpBroadcast) {
if(!SSDP.isStarted) SSDP.begin(); if(!SSDP.isStarted) SSDP.begin();
SSDP.loop(); SSDP.loop();
@ -147,7 +158,7 @@ bool Network::connect() {
Serial.print(this->channel); Serial.print(this->channel);
Serial.print(" ("); Serial.print(" (");
Serial.print(this->strength); Serial.print(this->strength);
Serial.print("dbm) "); Serial.println("dbm) ");
} }
else Serial.println("Connecting to AP"); else Serial.println("Connecting to AP");
this->connectAttempts++; this->connectAttempts++;
@ -274,17 +285,10 @@ bool Network::openSoftAP() {
while ((WiFi.status() != WL_CONNECTED)) while ((WiFi.status() != WL_CONNECTED))
{ {
for(int i = 0; i < 3; i++) {
//delay(100);
//digitalWrite(LED_BUILTIN, HIGH);
//delay(100);
//digitalWrite(LED_BUILTIN, LOW);
}
int clients = WiFi.softAPgetStationNum(); int clients = WiFi.softAPgetStationNum();
webServer.loop(); webServer.loop();
if(millis() - this->lastEmit > 1500) { if(millis() - this->lastEmit > 1500) {
if(this->connect()) {} //if(this->connect()) {}
this->lastEmit = millis(); this->lastEmit = millis();
this->emitSockets(); this->emitSockets();
if(clients > 0) if(clients > 0)

22
Web.cpp
View file

@ -798,6 +798,25 @@ void Web::begin() {
Serial.print("Scanned "); Serial.print("Scanned ");
Serial.print(n); Serial.print(n);
Serial.println(" networks"); Serial.println(" networks");
DynamicJsonDocument doc(16384);
JsonObject obj = doc.to<JsonObject>();
JsonObject connected = obj.createNestedObject("connected");
connected["name"] = settings.WIFI.ssid;
connected["passphrase"] = settings.WIFI.passphrase;
connected["strength"] = WiFi.RSSI();
connected["channel"] = WiFi.channel();
JsonArray arr = obj.createNestedArray("accessPoints");
for(int i = 0; i < n; ++i) {
if(WiFi.SSID(i).length() == 0 || WiFi.RSSI(i) < -95) continue; // Ignore hidden and weak networks that we cannot connect to anyway.
JsonObject a = arr.createNestedObject();
a["name"] = WiFi.SSID(i);
a["channel"] = WiFi.channel(i);
a["encryption"] = settings.WIFI.mapEncryptionType(WiFi.encryptionType(i));
a["strength"] = WiFi.RSSI(i);
a["macAddress"] = WiFi.BSSIDstr(i);
}
serializeJson(doc, g_content);
/*
String content = "{\"connected\": {\"name\":\"" + String(settings.WIFI.ssid) + "\",\"passphrase\":\"" + String(settings.WIFI.passphrase) + "\",\"strength\":" + WiFi.RSSI() + ",\"channel\":" + WiFi.channel() + "}, \"accessPoints\":["; String content = "{\"connected\": {\"name\":\"" + String(settings.WIFI.ssid) + "\",\"passphrase\":\"" + String(settings.WIFI.passphrase) + "\",\"strength\":" + WiFi.RSSI() + ",\"channel\":" + WiFi.channel() + "}, \"accessPoints\":[";
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
if (i != 0) content += ","; if (i != 0) content += ",";
@ -805,7 +824,8 @@ void Web::begin() {
delay(10); delay(10);
} }
content += "]}"; content += "]}";
server.send(statusCode, "application/json", content); */
server.send(statusCode, "application/json", g_content);
}); });
server.on("/reboot", []() { server.on("/reboot", []() {
webServer.sendCORSHeaders(); webServer.sendCORSHeaders();

View file

@ -131,6 +131,8 @@
document.getElementsByName('hostname')[0].value = settings.hostname; document.getElementsByName('hostname')[0].value = settings.hostname;
document.getElementsByName('ntptimeserver')[0].value = settings.ntpServer; document.getElementsByName('ntptimeserver')[0].value = settings.ntpServer;
document.getElementsByName('ssdpBroadcast')[0].checked = settings.ssdpBroadcast; document.getElementsByName('ssdpBroadcast')[0].checked = settings.ssdpBroadcast;
document.getElementById('fldSsid').value = settings.ssid;
document.getElementById('fldPassphrase').value = settings.passphrase;
} }
}); });
@ -215,17 +217,15 @@
class Wifi { class Wifi {
init() { init() {
document.getElementById("divNetworkStrength").innerHTML = this.displaySignal(-100); document.getElementById("divNetworkStrength").innerHTML = this.displaySignal(-100);
//this.loadAPs();
}; };
async loadAPs() { async loadAPs() {
if (document.getElementById('btnScanAPs').classList.contains('disabled')) return; if (document.getElementById('btnScanAPs').classList.contains('disabled')) return;
document.getElementById('divAps').innerHTML = '<div style="display:flex;justify-content:center;align-items:center;"><div class="lds-roller"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div></div>'; document.getElementById('divAps').innerHTML = '<div style="display:flex;justify-content:center;align-items:center;"><div class="lds-roller"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div></div>';
document.getElementById('btnScanAPs').classList.add('disabled'); document.getElementById('btnScanAPs').classList.add('disabled');
document.getElementById('btnConnectWiFi').classList.add('disabled'); //document.getElementById('btnConnectWiFi').classList.add('disabled');
getJSON('/scanaps', (err, aps) => { getJSON('/scanaps', (err, aps) => {
document.getElementById('btnScanAPs').classList.remove('disabled'); document.getElementById('btnScanAPs').classList.remove('disabled');
document.getElementById('btnConnectWiFi').classList.remove('disabled'); //document.getElementById('btnConnectWiFi').classList.remove('disabled');
console.log(aps); console.log(aps);
if (err) { if (err) {
this.displayAPs({ connected: { name: '', passphrase: '' }, accessPoints: [] }); this.displayAPs({ connected: { name: '', passphrase: '' }, accessPoints: [] });
@ -258,9 +258,9 @@
let divAps = document.getElementById('divAps'); let divAps = document.getElementById('divAps');
divAps.setAttribute('data-lastloaded', new Date().getTime()); divAps.setAttribute('data-lastloaded', new Date().getTime());
divAps.innerHTML = div; divAps.innerHTML = div;
document.getElementsByName('ssid')[0].value = aps.connected.name; //document.getElementsByName('ssid')[0].value = aps.connected.name;
document.getElementsByName('passphrase')[0].value = aps.connected.passphrase; //document.getElementsByName('passphrase')[0].value = aps.connected.passphrase;
this.procWifiStrength(aps.connected); //this.procWifiStrength(aps.connected);
}; };
selectSSID(el) { selectSSID(el) {
let obj = { let obj = {
@ -309,7 +309,7 @@
elWave.classList.remove('waveStrength-0', 'waveStrength-1', 'waveStrength-2', 'waveStrength-3', 'waveStrength-4'); elWave.classList.remove('waveStrength-0', 'waveStrength-1', 'waveStrength-2', 'waveStrength-3', 'waveStrength-4');
elWave.classList.add(cssClass); elWave.classList.add(cssClass);
} }
document.getElementById('spanNetworkStrength').innerHTML = (isNaN(strength.strength) || strength < -100) ? '---' : strength.strength; document.getElementById('spanNetworkStrength').innerHTML = (isNaN(strength.strength) || strength.strength <= -100) ? '----' : strength.strength;
} }
}; };
var wifi = new Wifi(); var wifi = new Wifi();
@ -1660,8 +1660,8 @@
tab.classList.add('selected'); tab.classList.add('selected');
if (tab.getAttribute('data-grpid') === 'fsWiFiSettings') { if (tab.getAttribute('data-grpid') === 'fsWiFiSettings') {
// Only load the networks if we need them. // Only load the networks if we need them.
if(new Date().getTime() - parseInt(document.getElementById('divAps').getAttribute('data-lastloaded'), 10) > 60000) //if(new Date().getTime() - parseInt(document.getElementById('divAps').getAttribute('data-lastloaded'), 10) > 60000)
wifi.loadAPs(); // wifi.loadAPs();
} }
let grp = document.getElementById(tab.getAttribute('data-grpid')); let grp = document.getElementById(tab.getAttribute('data-grpid'));
if (typeof grp !== 'undefined' && grp) grp.style.display = ''; if (typeof grp !== 'undefined' && grp) grp.style.display = '';