RBE1001Lib
WifiManager.cpp
Go to the documentation of this file.
1 
2 /*
3  * WifiManager.cpp
4  *
5  * Created on: Jun 13, 2018
6  * Author: hephaestus
7  */
8 
9 #include "WifiManager.h"
11 
12 static void WiFiEventWifiManager(WiFiEvent_t event) {
13  if (WifiManager::staticRef != NULL)
14  WifiManager::staticRef->WiFiEvent(event);
15 }
16 
18 }
19 
21  WifiManager::staticRef = NULL;
22 }
24  return state;
25 }
27  switch (state) {
28  case firstStart:
29  Serial.println("WifiManager.getState()=firstStart");
30  break;
31  case Disconnected:
32  Serial.println("WifiManager.getState()=Disconnected");
33  break;
34  case InitialConnect:
35  Serial.println("WifiManager.getState()=InitialConnect");
36  break;
37  case Connected:
38  Serial.println("WifiManager.getState()=Connected");
39  break;
40  case HaveSSIDSerial:
41  Serial.println("WifiManager.getState()=HaveSSIDSerial");
42  break;
43  case reconnect:
44  Serial.println("WifiManager.getState()=reconnect");
45  break;
46  case APWaitingForSTA:
47  Serial.println("WifiManager.getState()=APWaitingForSTA");
48  break;
49  default:
50  break;
51  }
52 }
54  APMode = true;
55  WiFi.mode(WIFI_STA);
56  WiFi.disconnect();
57  delay(100);
58  setup();
59  state = reconnect;
60 }
65  setup();
66  disconnect();
67 }
69  if (setupDone)
70  return;
71  Serial.begin(115200);
72 
73 
74  WiFi.mode(WIFI_MODE_AP);
75  uint8_t mac[6];
76  char macStr[18] = { 0 };
77  esp_wifi_get_mac(WIFI_IF_STA, mac);
78  sprintf(macStr, "%02X-%02X", mac[4], mac[5]);
79  String defaultap = "esp32-" + String(macStr);
80 
81  preferences.begin("wifi", true);
82  networkNameServer = preferences.getString("ssid", "none"); //NVS key ssid
83  networkPswdServer = getPassword(networkNameServer); //NVS key password
84  apNameServer = preferences.getString("apssid", defaultap); //NVS key ssid
85  apPswdServer = getPassword(apNameServer, "Wumpus3742"); //NVS key password
86  preferences.end();
87 
88  state = reconnect;
89  staticRef = this;
91  WiFi.onEvent(WiFiEventWifiManager);
93  setupDone = true;
94 }
96  WiFi.disconnect(true);
97  Serial.println("\n\n\nAP starting " + apNameServer);
98 //Initiate connection
99  WiFi.mode(WIFI_MODE_AP);
100  String mac = WiFi.macAddress();
101  WiFi.softAP(apNameServer.c_str(), apPswdServer.c_str());
102 
103  timeOfLastConnect = 0;
105 
106  Serial.println("Mac Address: " + mac);
107 
108  preferences.begin("wifi", false); // Note: Namespace name is limited to 15 chars
109  if (preferences.getString("apssid", "none").compareTo(apNameServer) != 0) {
110  preferences.putString("apssid", apNameServer);
111 
112  delay(300);
113  }
114  if (getPassword(apNameServer).compareTo(
115  apPswdServer) != 0) {
117  delay(300);
118  }
119 
120  preferences.end();
121  Serial.println("Starting AP:" + apNameServer + "\npass = " + apPswdServer);
122  timeSinceAPStart=millis();
123 }
124 void WifiManager::connectToWiFi(const char * ssid, const char * pwd) {
125 
126  Serial.println("Attempting to connect to WiFi network: " + String(ssid));
127 //Initiate connection
128 
129  WiFi.mode(WIFI_STA);
130  WiFi.disconnect(true);
131  delay(300);
133 
134  timeOfLastConnect = 0;
136  String mac = WiFi.macAddress();
137  Serial.println("Mac Address: " + mac);
138  Serial.println("Waiting for WIFI connection... \n\n");
139  if(state==Disconnected)
140  WiFi.begin(ssid, pwd);
141  else
142  Serial.println("Wifi state already changed ");
143 }
152  Serial.println("scan start");
153  // WiFi.scanNetworks will return the number of networks found
154  WiFi.mode(WIFI_STA);
155  WiFi.disconnect(true);
156  delay(100);
157  int16_t n = WiFi.scanComplete();
158  WiFi.scanNetworks(true, false, false, 300);
159  state = scanRunning;
161  return n;
162 }
163 
165  bool myNetworkPresent = false;
166  preferences.begin("wifi", true);
167  int16_t n = WiFi.scanComplete();
168  if (n >= 0) {
169  if (n == 0) {
170  Serial.println("no networks found");
171  } else {
172  Serial.println(String(n) + " networks found");
173  if (getPassword(networkNameServer).compareTo(
174  "none") != 0) {
175  for (int i = 0; i < n && myNetworkPresent == false; ++i) {
176  // Print SSID and RSSI for each network found
177  if (networkNameServer.compareTo(WiFi.WiFiScanClass::SSID(i))
178  == 0) {
179  myNetworkPresent = true;
180  Serial.println(
181  "Default network found: "
182  + WiFi.WiFiScanClass::SSID(i));
183  networkPswdServer = getPassword(networkNameServer); //NVS key password
184  }
185 
186  }
187  }
188  if (!myNetworkPresent) {
189  Serial.println(" Default AP is missing, searching for new one");
190  String bestNet="none";
191  int32_t bestStren=-5000;
192  for (int i = 0; i < n; ++i) {
193  // Print SSID and RSSI for each network found
194  String tmp = WiFi.WiFiScanClass::SSID(i);
195  if (getPassword(tmp).compareTo("none") != 0) {
196  myNetworkPresent = true;
197  if(WiFi.WiFiScanClass::RSSI(i)>bestStren){
198  bestNet=WiFi.WiFiScanClass::SSID(i);
199  bestStren=WiFi.WiFiScanClass::RSSI(i);
200  networkPswdServer = getPassword(tmp); //NVS key password
201  }
202  }
203  Serial.print(i + 1);
204  Serial.print(": ");
205  Serial.print(tmp);
206  Serial.print(" (");
207  Serial.print(WiFi.WiFiScanClass::RSSI(i));
208  Serial.print(")");
209  Serial.println(
210  (WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ?
211  " " : "*");
212  delay(10);
213  }
214  if(myNetworkPresent){
215  networkNameServer=bestNet;
216  }
217  }
218 
219  Serial.println("");
220 
221  }
222  } else {
223  Serial.println("Scan Failed!! " + String(n));
224  }
225 
226  preferences.end();
227  if (!myNetworkPresent) {
228  Serial.println("NO availible AP/Pass stored");
229 
230  APMode = true;
231  }else
233 }
235  if (state != HaveSSIDSerial) {
236  if (Serial.available() > 1) {
237  String tmp = Serial.readString();
238  tmp.trim();
239  if (tmp.substring(0, 3).compareTo("AP:") == 0
240  || tmp.substring(0, 3).compareTo("ap:") == 0) {
241  String got = tmp.substring(3, 18); // ensure SSID is less than 15 char to use the SSID as key for password
242  if (got.length() > 1) {
243  apNameServer = got;
245  } else
246  state = reconnect;
247  APMode = true;
248  Serial.println("AP Mode ssid: " + apNameServer);
249  } else if ((tmp.compareTo("STA") == 0 || tmp.compareTo("sta") == 0)
250  && tmp.length() == 3) {
251  Serial.println(
252  "Switching to STA mode New ssid: " + networkNameServer);
253  APMode = false;
254  state = reconnect;
255  } else if ((tmp.compareTo("ERASE") == 0
256  || tmp.compareTo("erase") == 0) && tmp.length() == 5) {
257  Serial.println("Erasing all stored passwords");
258  erase();
259  ESP.restart();
260  } else if ((tmp.compareTo("scan") == 0
261  || tmp.compareTo("SCAN") == 0) && tmp.length() == 4) {
262  Serial.println("Re-scanning and reconnecting");
263  disconnect();
264  }else {
265  networkNameServer = tmp;
266  Serial.println("New ssid: " + networkNameServer);
267  APMode = false;
269  }
270  if (state == HaveSSIDSerial)
271  Serial.println("New password: ");
272 
273  }
274  }
275 }
276 
277 String WifiManager::getPasswordKey(String ssid) {
278  if (ssid.length() <= PASS_LEN_KEY)
279  return ssid;
280  else
281  return ssid.substring(0, PASS_LEN_KEY);
282 }
283 void WifiManager::setPassword(String ssid,String pass){
284  preferences.putString(getPasswordKey(ssid).c_str(), pass);
285 }
286 String WifiManager::getPassword(String ssid,String defaultPass){
287  return preferences.getString(getPasswordKey(ssid).c_str(), defaultPass);
288 }
289 
291  long now = millis();
292  runSerialLoop();
293  switch (state) {
294  case firstStart:
295  //staticRef->printState();
296 
297  state = reconnect;
298  printState();
299  break;
300  case InitialConnect:
301  preferences.begin("wifi", false); // Note: Namespace name is limited to 15 chars
302  if (preferences.getString("ssid", "none").compareTo(networkNameServer)
303  != 0) {
304  Serial.println("Writing new ssid " + networkNameServer);
305  preferences.putString("ssid", networkNameServer);
306  delay(300);
307  }
308  if (getPassword(networkNameServer).compareTo(
309  networkPswdServer) != 0) {
310  Serial.println("Writing new pass ****");
312  delay(300);
313  }
314  preferences.end();
315  state = Connected;
316  printState();
317  break;
318  case APWaitingForSTA:
319  if ((timeSinceAPPrint + timeoutTime) < millis()) {
320  timeSinceAPPrint = millis();
321  Serial.println("Waiting for client to connect to AP "+String(millis()-timeSinceAPStart));
322  }
323  if ((timeSinceAPStart + 60000*5) < millis()){
324  disconnect();// No connections after 5 minute, try connecting
325  }// @suppress("No break at end of case")
326  case apconnected:
327  case Connected:
328  break;
329  case Disconnected:
330  //printState();
331 
332  if ((timeoutTime + timeOfLastConnect) <now)
333  if ((timeoutTime+ timeOfLastDisconnect) < now) {
334  Serial.println(
335  "Timeouts for connection wait, reconnecting last connected: "
336  + String( timeOfLastConnect)
337  + " last disconnected: "
338  + String(timeOfLastDisconnect)+
339  " now "+String(now));
340  state = reconnect;
341  printState();
344  connectionAttempts = 0;
345  updateApList();
348  }
349  }
350  break;
351  case scanRunning:
352  if(WiFi.scanComplete()!=WIFI_SCAN_RUNNING){
354  Serial.println("scan DONE!");
355  }
356  break;
357  case scanDone:
358  rescan();
360  break;
361  case reconnect:
362  if (!APMode) {
363  Serial.println("connect to WiFi network");
364  //Connect to the WiFi network
367  } else {
369  startAP();
370  }
371  //printState();
372  break;
373  case HaveSSIDSerial:
374  if (Serial.available() > 0) {
375  if (!APMode){
376  networkPswdServer = Serial.readString();
377  networkPswdServer.trim();
378  }
379  else{
380  apPswdServer = Serial.readString();
381  apPswdServer.trim();
382  }
383  state = reconnect;
384  printState();
385  }
386  break;
387  }
388 }
389 
396  printState();
397  WiFi.disconnect(true);
398  delay(300);
400  timeOfLastConnect = millis()-timeoutTime-1;
401  timeOfLastDisconnect =millis()-timeoutTime-1;
402  networkNameServer="none";
403  APMode=false;
404 
405 }
406 void WifiManager::WiFiEvent(WiFiEvent_t event) {
407  if (state == HaveSSIDSerial)
408  return;
409  //Pass the event to the UDP Simple packet server
410  switch (event) {
411  case SYSTEM_EVENT_STA_GOT_IP:
412  if (!APMode) {
414  printState();
415 
416  //When connected set
417  Serial.print("\n\n\nWiFi connected! DHCP took "+String(millis()-timeOfLastConnect)+" IP address: ");
418  Serial.print(WiFi.localIP());
419  Serial.print("\n\n\n");
420  timeOfLastConnect = millis();
421  }
422  break;
423  case SYSTEM_EVENT_STA_DISCONNECTED:
424  timeOfLastDisconnect = millis();
425  if (!APMode) {
427  printState();
428  WiFi.disconnect(true);
429  Serial.println("\n\nWiFi lost connection, retry " + String(
431  timeOfLastDisconnect=millis();
432  }
433  break;
434  case SYSTEM_EVENT_WIFI_READY:
435  if (state == Connected && !APMode) {
436  disconnect();
437  Serial.println("WiFi lost connection, retry " + String(
439  } else {
440  Serial.println("ESP32 WiFi ready ");
441  }
442  break;
443  case SYSTEM_EVENT_SCAN_DONE:
444  Serial.println("SYSTEM_EVENT_SCAN_DONE");
445  break;
446  case SYSTEM_EVENT_STA_START:
447  //Serial.println("ESP32 station start ");
448  break;
449  case SYSTEM_EVENT_STA_STOP:
450  Serial.println("SYSTEM_EVENT_STA_STOP");
451  break;
452  case SYSTEM_EVENT_STA_CONNECTED:
453  Serial.println(" ESP32 station connected to AP ");
454  if (!APMode) {
455  state = apconnected;
456  timeOfLastConnect = millis();
457  }
458  break;
459  case SYSTEM_EVENT_STA_AUTHMODE_CHANGE:
460  Serial.println("SYSTEM_EVENT_STA_AUTHMODE_CHANGE");
461  break;
462  case SYSTEM_EVENT_STA_LOST_IP:
463  Serial.println("SYSTEM_EVENT_STA_LOST_IP");
464  break;
465  case SYSTEM_EVENT_STA_WPS_ER_SUCCESS:
466  Serial.println("SYSTEM_EVENT_STA_WPS_ER_SUCCESS");
467  break;
468  case SYSTEM_EVENT_STA_WPS_ER_FAILED:
469  Serial.println("SYSTEM_EVENT_STA_WPS_ER_FAILED");
470  break;
471  case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT:
472  Serial.println("SYSTEM_EVENT_STA_WPS_ER_TIMEOUT");
473  break;
474  case SYSTEM_EVENT_STA_WPS_ER_PIN:
475  Serial.println("SYSTEM_EVENT_STA_WPS_ER_PIN");
476  break;
477  case SYSTEM_EVENT_AP_START:
478  Serial.println("SYSTEM_EVENT_AP_START");
479  break;
480  case SYSTEM_EVENT_AP_STOP:
481  Serial.println("SYSTEM_EVENT_AP_STOP");
482  break;
483  case SYSTEM_EVENT_AP_STACONNECTED:
484  Serial.println("SYSTEM_EVENT_AP_STACONNECTED");
485  state = Connected;
486  break;
487  case SYSTEM_EVENT_AP_STADISCONNECTED:
488  Serial.println("SYSTEM_EVENT_AP_STADISCONNECTED");
490  break;
491  case SYSTEM_EVENT_AP_PROBEREQRECVED:
492  Serial.println("SYSTEM_EVENT_AP_PROBEREQRECVED");
493  break;
494  case SYSTEM_EVENT_AP_STA_GOT_IP6:
495  Serial.println("SYSTEM_EVENT_AP_STA_GOT_IP6");
496  break;
497  case SYSTEM_EVENT_ETH_START:
498  Serial.println("SYSTEM_EVENT_ETH_START");
499  break;
500  case SYSTEM_EVENT_ETH_STOP:
501  Serial.println("SYSTEM_EVENT_ETH_STOP");
502  break;
503  case SYSTEM_EVENT_ETH_CONNECTED:
504  Serial.println("SYSTEM_EVENT_ETH_CONNECTED");
505  break;
506  case SYSTEM_EVENT_ETH_DISCONNECTED:
507  Serial.println("SYSTEM_EVENT_ETH_DISCONNECTED");
508  break;
509  case SYSTEM_EVENT_ETH_GOT_IP:
510  Serial.println("SYSTEM_EVENT_ETH_GOT_IP");
511  break;
512  case SYSTEM_EVENT_MAX:
513  Serial.println("SYSTEM_EVENT_MAX");
514  break;
515  default:
516  break;
517  }
518 }
519 
524  return APMode;
525 }
526 
532  preferences.begin("wifi", false); // Note: Namespace name is limited to 15 chars
533  preferences.clear(); // erase all stored passwords
534  delay(300);
535  preferences.end();
536 }
void runSerialLoop()
static void WiFiEventWifiManager(WiFiEvent_t event)
Definition: WifiManager.cpp:12
void setup()
Definition: WifiManager.cpp:68
String apPswdServer
Definition: WifiManager.h:41
void WiFiEvent(WiFiEvent_t event)
String apNameServer
Definition: WifiManager.h:40
#define rescanIncrement
Definition: WifiManager.h:14
enum connectionState whatToDoAfterScanning
Definition: WifiManager.h:48
connectionState
Definition: WifiManager.h:17
void disconnect()
void startAP()
Definition: WifiManager.cpp:95
bool setupDone
Definition: WifiManager.h:49
static WifiManager * staticRef
Definition: WifiManager.h:58
int updateApList()
String networkNameServer
Definition: WifiManager.h:38
virtual ~WifiManager()
Definition: WifiManager.cpp:20
Preferences preferences
Definition: WifiManager.h:43
void setupAP()
Definition: WifiManager.cpp:53
String networkPswdServer
Definition: WifiManager.h:39
long timeOfLastConnect
Definition: WifiManager.h:37
bool isApMode()
#define timeoutTime
Definition: WifiManager.h:15
long timeSinceAPStart
Definition: WifiManager.h:46
void printState()
Definition: WifiManager.cpp:26
long timeOfLastDisconnect
Definition: WifiManager.h:36
void connectToWiFi(const char *ssid, const char *pwd)
String getPasswordKey(String ssid)
enum connectionState state
Definition: WifiManager.h:47
enum connectionState getState()
Definition: WifiManager.cpp:23
String getPassword(String ssid, String defaultPass="none")
int connectionAttempts
Definition: WifiManager.h:42
void setPassword(String ssid, String pass)
long timeSinceAPPrint
Definition: WifiManager.h:45
#define PASS_LEN_KEY
Definition: WifiManager.h:16
void setupScan()
Definition: WifiManager.cpp:64