-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathWiFinder.cpp
More file actions
129 lines (115 loc) · 4.27 KB
/
WiFinder.cpp
File metadata and controls
129 lines (115 loc) · 4.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "WiFinder.h"
String urlDecoder(String url) {
String decodedString = "";
int charCounter = 0;
while(charCounter < url.length()) {
if (url[charCounter] != '%') {
decodedString += url[charCounter];
charCounter += 1;
} else {
char newChar = (int(url[charCounter+1]) << 4) & (int(url[charCounter+2]));
decodedString += newChar;
charCounter += 3;
}
}
}
/*
* Return codes:
* 0 - Known network found
* 1 - Networks found
* 2 - No networks found
*/
int WiFinder::begin(String known_ssid, String known_pass, String guest_ssid) {
WiFi.mode(WIFI_STA);
WiFi.disconnect();
Serial.println("Scanning for WiFi networks");
int num_of_networks = WiFi.scanNetworks();
// Check that there are networks
if (num_of_networks == 0) {
Serial.println("No networks found, exiting");
return 2;
}
// See if we know the password to any
Serial.print("Found "); Serial.print(num_of_networks); Serial.println(" networks");
for (int i = 0; i < num_of_networks; i++) {
SSIDs[i].ssid = WiFi.SSID(i);
SSIDs[i].encrypted = (WiFi.encryptionType(i) != WIFI_AUTH_OPEN);
if (SSIDs[i].ssid == known_ssid) {
Serial.print("Found recognised network: "); Serial.println(known_ssid);
ssid = known_ssid;
password = known_pass;
return 0;
}
}
// Need to ask user for password
Serial.println("No recognised networks found, starting SoftAP");
WiFi.mode(WIFI_AP);
WiFiServer server(80);
IPAddress apIP(192,168,0,1);
DNSServer dns;
WiFi.softAPConfig(apIP, apIP, IPAddress(255,255,255,0));
WiFi.softAP(guest_ssid.c_str());
dns.start(byte(53), "*", apIP);
server.begin();
Serial.println("SoftAP started, waiting for requests");
String serverHTML = "<!DOCTYPE html><html><head><title>";
serverHTML += guest_ssid;
serverHTML += "</title></head><body><h1>Please choose the WiFi network you want to connect to:</h1>";
serverHTML += "<form method='post'><label for='ssid'>SSID:</label><select name='ssid' id='ssid'>";
for (int i = 0; i < num_of_networks; i++) {
serverHTML += "<option value='";
serverHTML += SSIDs[i].ssid;
serverHTML += "'>";
serverHTML += SSIDs[i].ssid;
serverHTML += "</option>";
}
serverHTML += "</select><label for='password'>Password:</label><input type='text' name='password' id='password' />";
serverHTML += "<input type='submit' value='Submit' /></form></body></html>";
bool needPassword = true;
while(needPassword) {
dns.processNextRequest();
WiFiClient client = server.available();
if (client) {
Serial.println("New client connected");
while (client.connected()) {
if (client.available()) {
String request = client.readString().trim();
Serial.println("Request recieved:\n------ Request Body Start -----");
Serial.println(request);
Serial.println("------ Request Body End -----");
String reqType = request.substring(0,4);
Serial.print("Request type: ");
Serial.println(reqType);
if (reqType == "GET ") {
Serial.println("Get request, sending wifi choice page");
client.print("HTTP/1.1 200 OK\nContent-type:text/html\n\n");
client.print(serverHTML);
Serial.println("Sent");
} else if (reqType == "POST") {
Serial.println("Post request");
String reqArgs = request.substring(request.lastIndexOf('\n')+1)
}
// String request = client.readStringUntil(' '); // will either contain POST or GET
// if (request == "GET") {
// client.print("HTTP/1.1 200 OK\nContent-type:text/html\n\n");
// client.print(serverHTML);
// } else if (request == "POST") {
// client.readStringUntil('='); // This will discard everything up to the SSID
// ssid = client.readStringUntil('&');
// client.readStringUntil('='); // discards the text "password"
// password = urlDecoder(client.readStringUntil('\n'));
// needPassword = false;
// }
}
}
client.stop();
}
}
WiFi.mode(WIFI_STA);
}
const char* WiFinder::get_ssid() {
return ssid.c_str();
};
const char* WiFinder::get_password() {
return password.c_str();
};