NodeMCU自动加入开放wifi

时间:2017-01-08 09:51:46

标签: esp8266 arduino-ide nodemcu arduino-esp8266

我已经搜索了这个问题的解决方案很长一段时间没有运气。

我希望NodeMCU能够寻找一个开放的wifi网络并连接到它。只要连接可用,就使用该连接 - 当连接断开时,开始寻找新的开放网络。

我住在芬兰,几乎每个角落都有免费的开放式WiFi。我正计划创建可穿戴/移动设备,以便在可用时使用WiFi。

我也只是从编程开始,用C语言编写基础并使用Arduino IDE,所以没有Lua语言经验。

我知道WiFi.scanNetworks()可以区分安全和不安全的SSID,但我还没有发现如何在Arduino IDE中将其用于我的优势。

1 个答案:

答案 0 :(得分:5)

您也可以在STA模式下扫描网络。

WiFi.encryptionType()WiFi.scanNetworks()确定网络是否已加密。

我正和你分享一个草图,我之前正在为一个类似的项目工作。

草图搜索WiFi网络,按RSSI对其进行排序,并在最高强度的非加密网络上执行连接。

祝你好运:

#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.");  
    }
  }
}