gpt4 book ai didi

esp8266 - NodeMCU自动加入开放wifi

转载 作者:行者123 更新时间:2023-12-03 00:20:12 26 4
gpt4 key购买 nike

我已经寻找这个问题的解决方案很长时间了,但没有成功。

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

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

我也只是开始编程、C 基础知识和使用 Arduino IDE,所以这里没有 Lua 语言经验。

我知道 WiFi.scanNetworks() 可以区分安全和不安全的 SSID,但我还没有找到如何在 Arduino IDE 中利用它来发挥我的优势。

最佳答案

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

您需要的方法是 WiFi.scanNetworks() 之后的 WiFi.encryptionType() 来确定网络是否加密。

我正在与您分享我之前为类似项目制作的草图。

Sketch 搜索 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.");
}
}
}

关于esp8266 - NodeMCU自动加入开放wifi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41531412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com