2017-01-08 10 views
4

나는이 문제에 대한 해결책을 오래 동안 찾지 못했습니다.NodeMCU가 자동으로 Wi-Fi를 엽니 다.

NodeMCU에서 개방형 WiFi 네트워크를 찾고 연결하려고합니다. 연결이 가능한 한 해당 연결을 사용하십시오. 연결이 끊어지면 새로운 열린 네트워크를 찾기 시작합니다.

나는 핀란드에 살고 있으며 거의 ​​모든 구석에 무료 Wi-Fi를 제공합니다. 가능한 경우 WiFi를 사용할 수있는 착용 가능/모바일을 만들 계획입니다.

저는 C 언어의 기초적인 프로그래밍과 Arduino IDE만을 사용하기 시작 했으므로 루아 언어에 대한 경험은 없습니다.

나는 WiFi.scanNetworks()이 안전하지 않은 SSID와 구별 될 수 있음을 이해하지만 Arduino IDE의 장점을 어떻게 활용할 수 있는지 알지 못했습니다.

+1

하나하다가 :

여기 행운, 당신이 동안 STA 모드에서 다른 채널에서의 AP를 검색 할 수 없습니다. 당신은리스트를 스캔하고 보안 AP를 걸러 낸 다음 왼쪽에있는 WiFi.begin()을 걸러 낼 수 있습니다. – dandavis

+0

"NodeMCU를 사용하고 싶습니다 ..."- NodeMCU 펌웨어를 사용하고 있음을 나타냅니다. "Arduino IDE를 사용하여 루아 어 언어 경험이 없으므로"- 이제 무엇을 할 수 있습니까? NodeMCU/Lua 펌웨어 또는 Arduino? –

+0

Arduino는 장치 관리자에서 NodeMCU 보드를 지원합니다. 하지만 그렇습니다. ESP8266 + Serial to USB 만 수행합니다. – cagdas

답변

3

STA 모드에서도 네트워크를 검색 할 수 있습니다.

네트워크가 암호화되었는지 여부를 확인하려면 WiFi.scanNetworks() 뒤에 WiFi.encryptionType() 뒤에 오는 방법이 필요합니다.

이전에 비슷한 프로젝트를 진행하고있는 당신과 스케치를 공유하고 있습니다.

스케치는 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."); 
    } 
    } 
} 
+0

좋은 물건! ESP32에서 작동하도록 업데이트합니까? – pawisoon

+0

내 잘못이야! ESP32의 경우 : ENC_TYPE_NONE에서 WIFI_AUTH_OPEN으로 가져 오기 헤더 : #include pawisoon

+0

실제로 32로 작업하기 시작할 시간이 없습니다.그러나 당신이 잘 해냈다는 것을 알게되어서 기쁩니다. – cagdas