Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NodeMCU auto-join open wifi

I have searched for solution for this issue for quite a long time with no luck.

I would like NodeMCU to look for an open wifi network and connect to it. As long as the connection is available use that connection - and when the connection drops start looking for a new open network.

I live in Finland and we have free open WiFi almost on every corner. I am planning on creating something wearable/mobile that would use WiFi when available.

I am also only starting on programming, basics in C and using the Arduino IDE so no Lua language experience here.

I understand that WiFi.scanNetworks() can distinguish a secure from an unsecured SSID, but I haven't found out how I could use that to my advantage in Arduino IDE.

like image 840
taeraeyttaejae Avatar asked Jan 08 '17 09:01

taeraeyttaejae


People also ask

What is auto join on WiFi?

Auto join is a feature that allows your phone to automatically join any WiFi network it already has the credentials for, or open WiFi networks, without having to ask you to do anything. This can be a time saver at home and at work. But, it carries a lot of risks when used with public WiFi networks.

How do I stop public WiFi from automatically joining?

To stop your Android device from auto-connecting to open networks: Open the Android settings and go to Network & Internet. Select Wi-Fi > Wi-Fi preferences. Turn off the Connect to public networks toggle switch.


1 Answers

You can scan for networks also in STA mode.

The method you need is WiFi.encryptionType() after WiFi.scanNetworks() to determine whether a network encrypted or not.

I am sharing a sketch with you that I was working on for a similar project previously.

Sketch searches for WiFi networks, sorts them in order to RSSI, and performs connection on non-encrypted one with highest strength.

Here it is, good luck:

#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.");  
    }
  }
}
like image 178
cagdas Avatar answered Oct 04 '22 18:10

cagdas