如何让nodemcu自动连接强wifi信号

How to make nodemcu auto connect strong wifi signal

对很多wifi但需要连接强信号(wifi之间的动态切换看起来像手机)

请试试这个

// #include WiFi Library
#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 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 ()  {
}

自动连接最强网络

扫描网络

int8_t scanNetworks(bool async, bool show_hidden, uint8 channel, uint8* ssid);

您可以连续扫描可用网络或 使用 scanNetworks 函数进行定期检查,其中 return 找到的网络数量。

scanNetworks 将 return 找到的网络数量(8 位整数)。

默认情况下,异步标志设置为 false,因此您的程序将在 nodemcu 运行时停止 扫描网络。 您可以将其设置为 true,以便您的程序在扫描网络时保持 运行。

不用担心其他参数,它们已设置为默认值。 如果需要,您也可以通过传递这些值来更改它们。

请记住,当您扫描网络时,您的 Wifi 模式已切换为站 所以如果你想在接入点模式下连续扫描网络, 您的电台将被关闭。你将不得不重新启动接入点 扫描完成后。

虽然扫描是 运行,但 scanNetworks 函数将 return WIFI_SCAN_RUNNING 如果

,您可以处理结果

(WiFi.scanNetworks() != WIFI_SCAN_RUNNING)

正在处理 WiFi 扫描结果

int_32t WiFi.RSSI(unit_8t i);     // returns the network strength of ith network
String WiFi.SSID(uint8_t i);  // returns the ssid of ith network

结果按强度降序排列, 所以第0个结果强度最高,第n个结果强度最小

扫描完成后,前提是您知道可用网络的密码 您可以通过编写

直接连接到第 0 个结果

WiFi.begin(WiFi.SSID(0), password);

但检查您是否知道该网络始终是个好主意。

您可以通过已知(可信)网络的列表轻松地做到这一点。 并将每个结果的 ssid 与列表的每个成员进行比较。 如果匹配,则可以开始连接。

char knownNetworks [][] = 
{
   "Network1",
   "Network2",
};

#define KNOWN_NETWORKS 2

int8_t networkResult = WiFi.scanNetworks();

for(int i = 0; i < KNOWN_NETWORKS; i++)
  for(int j = 0; j < scanResult; j++)
    if(strcpy(knownNetworks[i], WiFi.SSID(j) == 0)
      WiFi.begin(knownNetworks[i], password);

希望对您有所帮助!

如果您有任何问题,我很乐意提供帮助。