Completed Network::serialConfigure()

Next up: update and complete Network::apConfigure()
This commit is contained in:
Gregg 2020-09-12 10:06:44 -05:00
parent 4a6c737c72
commit 123e2924a5
3 changed files with 151 additions and 24 deletions

View File

@ -232,16 +232,35 @@ void Span::initWifi(){
if(!nvs_get_blob(wifiHandle,"WIFIDATA",NULL,&len)){ // if found WiFi data in NVS
nvs_get_blob(wifiHandle,"WIFIDATA",&wifiData,&len); // retrieve data
} else {
network.scan(); // scan for networks
resetPressed=0;
int status=-1;
char key[2];
while(status<1){ // loop until a configuration method is chosen and completed
statusLED.start(250);
Serial.print("Network configuration required!\nPress control button for 3 seconds to start AccessPoint or enter network data here.\n\n");
Serial.print(">>> WiFi SSID: ");
resetPressed=0;
int status=0;
while(status==0){ // loop until a configuration method is chosen and completed
if(status==-1){
if(WiFi.status()==WL_CONNECTED)
WiFi.disconnect();
Serial.print("Network configuration required! Found the following SSIDs:\n\n");
statusLED.start(250); // rapidly blink Status LED
for(int i=0;i<network.numSSID;i++){
Serial.print(" ");
Serial.print(i+1);
Serial.print(") ");
Serial.print(network.ssidList[i]);
Serial.print("\n");
}
Serial.print("\nType 'W' <return> to set WiFi credentials or press control button for 3 seconds to start Access Point...\n\n");
status=0;
}
if(!resetPressed){
if(!digitalRead(resetPin)){
resetPressed=1;
@ -251,19 +270,18 @@ void Span::initWifi(){
resetPressed=0;
} else if(millis()>resetTime){
statusLED.start(100,0.3,3,500);
// statusLED.start(2000,0.75);
Serial.print("(skipping)\n\n");
status=network.apConfigure(hostName);
network.apConfigure(hostName);
}
if(Serial.available())
status=network.serialConfigure();
if(Serial.available() && *readSerial(key,1)=='W'){
status=network.serialConfigure()?1:-1;
}
} // while loop
} // while loop
Serial.println(status);
Serial.print("'"); Serial.print(network.ssid); Serial.println("'");
Serial.print("'"); Serial.print(network.pwd); Serial.println("'");
Serial.print("'"); Serial.print(mask(network.pwd,2)); Serial.println("'");
Serial.print("'"); Serial.print(network.setupCode); Serial.println("'");
while(1);

View File

@ -9,18 +9,42 @@ using namespace Utils;
///////////////////////////////
int Network::serialConfigure(){
void Network::scan(){
int n=WiFi.scanNetworks();
free(ssidList);
ssidList=(char **)calloc(n,sizeof(char *));
numSSID=0;
for(int i=0;i<n;i++){
boolean found=false;
for(int j=0;j<numSSID;j++){
if(!strcmp(WiFi.SSID(i).c_str(),ssidList[j]))
found=true;
}
if(!found){
ssidList[numSSID]=(char *)calloc(WiFi.SSID(i).length()+1,sizeof(char));
sprintf(ssidList[numSSID],"%s",WiFi.SSID(i).c_str());
numSSID++;
}
}
}
///////////////////////////////
boolean Network::serialConfigure(){
sprintf(ssid,"");
sprintf(pwd,"");
readSerial(ssid,MAX_SSID);
Serial.print(ssid);
Serial.print("\n");
while(!strlen(ssid)){
Serial.print(">>> WiFi SSID: ");
readSerial(ssid,MAX_SSID);
readSerial(ssid,MAX_SSID);
if(atoi(ssid)>0 && atoi(ssid)<=numSSID){
strcpy(ssid,ssidList[atoi(ssid)-1]);
}
Serial.print(ssid);
Serial.print("\n");
}
@ -32,9 +56,85 @@ int Network::serialConfigure(){
Serial.print("\n");
}
Serial.print("Done");
while(1);
homeSpan.statusLED.start(1000); // slowly blink Status LED
while(WiFi.status()!=WL_CONNECTED){
Serial.print("\nConnecting to: ");
Serial.print(ssid);
Serial.print("... ");
if(WiFi.begin(ssid,pwd)!=WL_CONNECTED){
char buf[8]="";
Serial.print("Can't connect. Re-trying in 5 seconds (or type 'X <return>' to cancel)...");
long sTime=millis();
while(millis()-sTime<5000){
if(Serial.available()){
readSerial(buf,1);
if(buf[0]=='X'){
Serial.print("Canceled!\n\n");
return(0);
}
}
}
}
} // WiFi not yet connected
Serial.print("Success! IP: ");
Serial.print(WiFi.localIP());
Serial.print("\n\n");
homeSpan.statusLED.start(250); // rapidly blink Status LED
boolean okay=false;
Serial.print("Specify new 8-digit Setup Code or leave blank to retain existing code...\n\n");
while(!okay){
Serial.print("Setup Code: ");
sprintf(setupCode,"");
readSerial(setupCode,8);
if(strlen(setupCode)==0){
okay=true;
Serial.print("(skipping)\n\n");
} else {
Serial.print(setupCode);
int n=0;
while(setupCode[n]!='\0' && setupCode[n]>='0' && setupCode[n]<='9')
n++;
if(n<8)
Serial.print("\n** Invalid format!\n\n");
else if(!allowedCode(setupCode))
Serial.print("\n** Disallowed code!\n\n");
else {
Serial.print(" Accepted!\n\n");
okay=true;
}
} // if Setup Code not blank
} // while !okay
char k[2]="";
while(k[0]!='y' && k[0]!='n'){
Serial.print("Confirm settings (y/n)? ");
readSerial(k,1);
Serial.print(k);
Serial.print("\n");
}
Serial.print("\n");
return(k[0]=='y');
}
///////////////////////////////
boolean Network::allowedCode(char *s){
return(
strcmp(s,"00000000") && strcmp(s,"11111111") && strcmp(s,"22222222") && strcmp(s,"33333333") &&
strcmp(s,"44444444") && strcmp(s,"55555555") && strcmp(s,"66666666") && strcmp(s,"77777777") &&
strcmp(s,"88888888") && strcmp(s,"99999999") && strcmp(s,"12345678") && strcmp(s,"87654321"));
}
///////////////////////////////
@ -169,6 +269,7 @@ int Network::processRequest(char *body, char *formData){
timer=millis();
WiFi.begin(ssid,pwd);
homeSpan.statusLED.start(1000);
responseBody+="<meta http-equiv = \"refresh\" content = \"5; url = /wifi-status\" />"
"<p>Initiating WiFi connection to:</p><p><b>" + String(ssid) + "</p>";

View File

@ -1,7 +1,10 @@
#include <WiFi.h>
#include <unordered_set>
#include "Settings.h"
using std::unordered_set;
///////////////////////////////
struct Network {
@ -10,6 +13,9 @@ struct Network {
const char *apPassword="homespan"; // Access Point password (does not need to be secret - only used to ensure excrypted WiFi connection)
const unsigned long lifetime=120000; // length of time (in milliseconds) to keep Access Point alive before shutting down and re-starting
char **ssidList=NULL;
int numSSID;
WiFiClient client; // client used for HTTP calls
unsigned long timer; // length of time of trying to connect to WiFi
unsigned long alarmTimeOut; // alarm time after which access point is shut down and HomeSpan is re-started
@ -18,7 +24,9 @@ struct Network {
char pwd[MAX_PWD+1];
char setupCode[8+1];
int serialConfigure(); // configure homeSpan WiFi and Setup Code from Serial Monitor; return 1=save connection, -1=cancel and restart
void scan(); // scan for WiFi networks and save only those with unique SSIDs
boolean serialConfigure(); // configure homeSpan WiFi and Setup Code from Serial Monitor; return 1=save settings, 0=cancel settings
boolean allowedCode(char *s); // checks if Setup Code is allowed (HAP defines a list of disallowed codes)
int apConfigure(char *hostName); // configure homeSpan WiFi and Setup Code using temporary Captive Access Point 'hostName'; return 1=save connection, -1=cancel and restart
int processRequest(char *body, char *formData); // process the HTTP request; return 0=continue, 1=save connection, -1=cancel and re-start
int getFormValue(char *formData, char *tag, char *value, int maxSize); // search for 'tag' in 'formData' and copy result into 'value' up to 'maxSize' characters; returns number of characters, else -1 if 'tag' not found