如何让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);
希望对您有所帮助!
如果您有任何问题,我很乐意提供帮助。
对很多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);
希望对您有所帮助!
如果您有任何问题,我很乐意提供帮助。