2017-01-08 3 views
4

Я искал решение этой проблемы довольно долгое время без везения.NodeMCU auto-join open wifi

Я хотел бы, чтобы NodeMCU искал открытую сеть Wi-Fi и подключался к ней. Пока соединение доступно, используйте это соединение - и когда соединение падает, начинается поиск новой открытой сети.

Я живу в Финляндии, и у нас есть бесплатный открытый WiFi почти на каждом углу. Я планирую создать что-то носимое/мобильное, которое будет использовать Wi-Fi, когда оно доступно.

Я также только начинаю программировать, основываясь на C и используя Arduino IDE, поэтому здесь нет опыта Lua.

Я понимаю, что WiFi.scanNetworks() может отличить защищенный от незащищенного SSID, но я не узнал, как использовать его в своей среде в Arduino IDE.

+1

одна загвоздка, что приходит на ум: вы не можете сканировать точки доступа на других каналах в то время как в режиме STA. вы можете отсканировать список, отфильтровать защищенные точки доступа, а затем 'WiFi.begin()' на одном оставшемся. – dandavis

+0

«Мне нужен NodeMCU ...» - указывает, что вы используете прошивку NodeMCU. «с использованием Arduino IDE, поэтому здесь нет опыта Lua» - теперь что? Прошивка NodeMCU/Lua или Arduino? –

+0

У Arduino есть поддержка NodeMCU для поддержки его диспетчера устройств. Но да, он ничего не делает, кроме ESP8266 + Serial для USB. – cagdas

ответ

3

Вы можете сканировать также сети в режиме STA.

Метод, который вам нужен, - WiFi.encryptionType() после WiFi.scanNetworks(), чтобы определить, была ли сеть зашифрована или нет.

Я делюсь с вами эскизом, над которым я работал ранее для подобного проекта.

Эскиз ищет сети Wi-Fi, сортирует их по каналу 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."); 
    } 
    } 
} 
+0

Отличный материал! Вы обновите его для работы с ESP32? – pawisoon

+0

Мой плохой! Для ESP32 только изменение: ENC_TYPE_NONE - WIFI_AUTH_OPEN и заголовок импорта: #include pawisoon

+0

На самом деле я не мог успеть, чтобы начать работать с 32.Но рад видеть, что вы сделали это хорошо. – cagdas

Смежные вопросы