Introduction: Connect an ESP8266 to Any Open WiFi Network Automatically
So you bought an ESP8266 microncontroller and now you want to connect it to the internet. Getting your project onto a network you control is easy. Getting it to connect to an open, or unsecured, network is quite a bit more complicated... at least it was.
After scouring the interwebs for code examples, I've mashed several together (and corrected for poor English translation) to create this automatic sketch. Just copy, paste, and upload. After flashing, your ESP8266 will scan, sort, and (attempt to) connect to the strongest open network available, assuming there is one.
That's it. Have fun!
Step 1: Download the .ino File or Copy and Paste
What the title says...
// #include WiFi Library
#include
/* 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 complete!"); if (n == 0) { Serial.println("No networks available."); } else { Serial.print(n); Serial.println(" networks discovered."); 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.println("The strongest open network is:"); 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) { memset(ssid, 0, MAX_SSID_LEN); strncpy(ssid, WiFi.SSID(indices[i]).c_str(), MAX_SSID_LEN); break; } } } }
void setup() { // Scan, Sort, and Connect to WiFi Serial.begin(SERIAL_BAUD); Serial.println("Scanning for open networks..."); 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("Connecting to "); 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("Connection Successful!"); Serial.println("Your device IP address is "); Serial.println(WiFi.localIP()); } else { Serial.println("Connection FAILED"); } } else { Serial.println("No open networks available. :-("); } } }
void loop () { }
5 Comments
Question 6 months ago on Step 1
after connecting college lan network i have to login with login id and password, do you have any idea after connecting successfully how can i login with that network for internet access ?
6 months ago on Step 1
after connecting college lan network i have to login with login id and password, i already registered node mcu mac address with that router, do you have any idea after connecting successfully how can i login with that network for internet access ?
3 years ago
Great! It worked! This will be very useful for not always Online systems.
4 years ago on Introduction
Hello. With this device and your script, is it possible to make any Windows device (laptop, tablet, Win phone) with any Windows to
connect to open WiFis without the device asking permission first ? In other words, to pre-approve automatic connection to any open WiFi in the area. Trying to find a way for my
laptop to connect automatically to any open Wi-Fi around me (the strongest one). So that, when
I travel around with a laptop, it would
connect to all open wi-fi sources automatically, without asking for confirmation
first.
Thanks
Oleg, fan@cogeco.net
Question 4 years ago on Step 1
is there a way to use this code to connect to encrypted networks of if i entered the ssids and the paswords of these networks