From e1aada23b055dc48535663b51c64b85157695f04 Mon Sep 17 00:00:00 2001 From: Robert Strouse Date: Tue, 7 Feb 2023 11:09:10 -0800 Subject: [PATCH] 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. --- Network.cpp | 26 +++++++++++++++----------- Web.cpp | 22 +++++++++++++++++++++- data/index.html | 20 ++++++++++---------- 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/Network.cpp b/Network.cpp index 8fff7ea..e04ebed 100644 --- a/Network.cpp +++ b/Network.cpp @@ -15,6 +15,7 @@ extern SocketEmitter sockEmit; extern MQTTClass mqtt; extern rebootDelay_t rebootDelay; +int connectRetries = 0; void Network::end() { sockEmit.end(); SSDP.end(); @@ -34,11 +35,21 @@ bool Network::setup() { } void Network::loop() { 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->emitSockets(); + if(WiFi.status() != WL_CONNECTED) return; } - else sockEmit.loop(); + sockEmit.loop(); if(settings.WIFI.ssdpBroadcast) { if(!SSDP.isStarted) SSDP.begin(); SSDP.loop(); @@ -147,7 +158,7 @@ bool Network::connect() { Serial.print(this->channel); Serial.print(" ("); Serial.print(this->strength); - Serial.print("dbm) "); + Serial.println("dbm) "); } else Serial.println("Connecting to AP"); this->connectAttempts++; @@ -274,17 +285,10 @@ bool Network::openSoftAP() { 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(); - webServer.loop(); if(millis() - this->lastEmit > 1500) { - if(this->connect()) {} + //if(this->connect()) {} this->lastEmit = millis(); this->emitSockets(); if(clients > 0) diff --git a/Web.cpp b/Web.cpp index f4dae67..c7f8b11 100644 --- a/Web.cpp +++ b/Web.cpp @@ -798,6 +798,25 @@ void Web::begin() { Serial.print("Scanned "); Serial.print(n); Serial.println(" networks"); + DynamicJsonDocument doc(16384); + JsonObject obj = doc.to(); + 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\":["; for (int i = 0; i < n; ++i) { if (i != 0) content += ","; @@ -805,7 +824,8 @@ void Web::begin() { delay(10); } content += "]}"; - server.send(statusCode, "application/json", content); + */ + server.send(statusCode, "application/json", g_content); }); server.on("/reboot", []() { webServer.sendCORSHeaders(); diff --git a/data/index.html b/data/index.html index cb937a6..9880bf5 100644 --- a/data/index.html +++ b/data/index.html @@ -131,6 +131,8 @@ document.getElementsByName('hostname')[0].value = settings.hostname; document.getElementsByName('ntptimeserver')[0].value = settings.ntpServer; 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 { init() { document.getElementById("divNetworkStrength").innerHTML = this.displaySignal(-100); - - //this.loadAPs(); }; async loadAPs() { if (document.getElementById('btnScanAPs').classList.contains('disabled')) return; document.getElementById('divAps').innerHTML = '
'; document.getElementById('btnScanAPs').classList.add('disabled'); - document.getElementById('btnConnectWiFi').classList.add('disabled'); + //document.getElementById('btnConnectWiFi').classList.add('disabled'); getJSON('/scanaps', (err, aps) => { document.getElementById('btnScanAPs').classList.remove('disabled'); - document.getElementById('btnConnectWiFi').classList.remove('disabled'); + //document.getElementById('btnConnectWiFi').classList.remove('disabled'); console.log(aps); if (err) { this.displayAPs({ connected: { name: '', passphrase: '' }, accessPoints: [] }); @@ -258,9 +258,9 @@ let divAps = document.getElementById('divAps'); divAps.setAttribute('data-lastloaded', new Date().getTime()); divAps.innerHTML = div; - document.getElementsByName('ssid')[0].value = aps.connected.name; - document.getElementsByName('passphrase')[0].value = aps.connected.passphrase; - this.procWifiStrength(aps.connected); + //document.getElementsByName('ssid')[0].value = aps.connected.name; + //document.getElementsByName('passphrase')[0].value = aps.connected.passphrase; + //this.procWifiStrength(aps.connected); }; selectSSID(el) { let obj = { @@ -309,7 +309,7 @@ elWave.classList.remove('waveStrength-0', 'waveStrength-1', 'waveStrength-2', 'waveStrength-3', 'waveStrength-4'); 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(); @@ -1660,8 +1660,8 @@ tab.classList.add('selected'); if (tab.getAttribute('data-grpid') === 'fsWiFiSettings') { // Only load the networks if we need them. - if(new Date().getTime() - parseInt(document.getElementById('divAps').getAttribute('data-lastloaded'), 10) > 60000) - wifi.loadAPs(); + //if(new Date().getTime() - parseInt(document.getElementById('divAps').getAttribute('data-lastloaded'), 10) > 60000) + // wifi.loadAPs(); } let grp = document.getElementById(tab.getAttribute('data-grpid')); if (typeof grp !== 'undefined' && grp) grp.style.display = '';