Created
August 19, 2017 05:54
-
-
Save bphermansson/09a2b0f711057109964a77c9a34dd2ff to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// https://stackoverflow.com/questions/41531412/nodemcu-auto-join-open-wifi | |
#include <ESP8266WiFi.h> | |
/* Serial Baud Rate */ | |
#define SERIAL_BAUD 9600 | |
/* Delay paramter for connection. */ | |
#define WIFI_DELAY 500 | |
/* Max SSID octets. */ | |
#define MAX_SSID_LEN 32 | |
/* Wait this much until device gets IP. */ | |
#define MAX_CONNECT_TIME 30000 | |
/* SSID that to be stored to connect. */ | |
char ssid[MAX_SSID_LEN] = ""; | |
/* Scan available networks and sort them in order to their signal strength. */ | |
void scanAndSort() { | |
memset(ssid, 0, MAX_SSID_LEN); | |
int n = WiFi.scanNetworks(); | |
Serial.println("Scan done!"); | |
if (n == 0) { | |
Serial.println("No networks found!"); | |
} else { | |
Serial.print(n); | |
Serial.println(" networks found."); | |
int indices[n]; | |
for (int i = 0; i < n; i++) { | |
indices[i] = i; | |
} | |
for (int i = 0; i < n; i++) { | |
for (int j = i + 1; j < n; j++) { | |
if (WiFi.RSSI(indices[j]) > WiFi.RSSI(indices[i])) { | |
std::swap(indices[i], indices[j]); | |
} | |
} | |
} | |
for (int i = 0; i < n; ++i) { | |
Serial.print(WiFi.SSID(indices[i])); | |
Serial.print(" "); | |
Serial.print(WiFi.RSSI(indices[i])); | |
Serial.print(" "); | |
Serial.print(WiFi.encryptionType(indices[i])); | |
Serial.println(); | |
if(WiFi.encryptionType(indices[i]) == ENC_TYPE_NONE) { | |
Serial.println("Found non-encrypted network. Store it and exit to connect."); | |
memset(ssid, 0, MAX_SSID_LEN); | |
strncpy(ssid, WiFi.SSID(indices[i]).c_str(), MAX_SSID_LEN); | |
break; | |
} | |
} | |
} | |
} | |
void setup() { | |
Serial.begin(SERIAL_BAUD); | |
Serial.println("Started."); | |
} | |
void loop() { | |
if(WiFi.status() != WL_CONNECTED) { | |
/* Clear previous modes. */ | |
WiFi.softAPdisconnect(); | |
WiFi.disconnect(); | |
WiFi.mode(WIFI_STA); | |
delay(WIFI_DELAY); | |
/* Scan for networks to find open guy. */ | |
scanAndSort(); | |
delay(WIFI_DELAY); | |
/* Global ssid param need to be filled to connect. */ | |
if(strlen(ssid) > 0) { | |
Serial.print("Going to connect for : "); | |
Serial.println(ssid); | |
/* No pass for WiFi. We are looking for non-encrypteds. */ | |
WiFi.begin(ssid); | |
unsigned short try_cnt = 0; | |
/* Wait until WiFi connection but do not exceed MAX_CONNECT_TIME */ | |
while (WiFi.status() != WL_CONNECTED && try_cnt < MAX_CONNECT_TIME / WIFI_DELAY) { | |
delay(WIFI_DELAY); | |
Serial.print("."); | |
try_cnt++; | |
} | |
if(WiFi.status() == WL_CONNECTED) { | |
Serial.println(""); | |
Serial.println("WiFi connected"); | |
Serial.println("IP address: "); | |
Serial.println(WiFi.localIP()); | |
} else { | |
Serial.println("Cannot established connection on given time."); | |
} | |
} else { | |
Serial.println("No non-encrypted WiFi found."); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment