2017-09-30 14 views
0

자격 증명을 하드 코딩하지 않고 WiFi 설정을 구성 할 수있는 방법으로 NodeMCU (Lolin v3) 보드를 프로그래밍하려고합니다. 나는 WiFiManager 라이브러리가 있다는 것을 알고 있지만, 라이브러리를 제공하는 UI를 사용하지 않고 자체 구현을해야하기 때문에 사용하지 않을 것입니다. 사용자가 제공 한 자격 증명은 AP_STA 모드 또는 STA 모드에서만 보드를 시작할지 여부를 확인하는 데 사용되는 SPIFFS를 사용하여 파일에 저장됩니다. ESP8266 WIFI_AP_STA 모드로 WiFi 설정하기

void connectWiFi(String ssid, String password, boolean staOnly = false) { 
    boolean state = true; 
    int i = 0; 
    if(staOnly) 
    WiFi.mode(WIFI_STA); 
    WiFi.begin(ssid.c_str(), password.c_str()); 
    while (WiFi.status() != WL_CONNECTED) { 
    delay(500); 
    if (i > 10) { 
     state = false; 
     break; 
    } 
    i++; 
    } 
    return state; 
} 

void join() { 
    String ssid = setupServer.arg("ssid"); 
    String password = setupServer.arg("password"); 
    result = connectWifi(ssid, password); 
    if(result) { 
    Serial.println("Connected"); 
    // **THIS IS THE PROBLEMATIC PART** 
    setupServer.send(200, "text/plain", WiFi.localIP().toString()); 
    // save credentials to a file 
    Serial.println("Conf saved"); 
    delay(2000); 
    ESP.restart(); 
    } else 
    setupServer.send(200, "text/plain", "fail"); 
    } 

void setup() { 
    Serial.begin(115200); 
    WiFi.disconnect(true); 
    boolean fileExists = SPIFFS.exists(WIFI_CONF_FILE); 
    if(!fileExists) { 
    WiFi.mode(WIFI_AP_STA); 
    WiFi.softAP("AP", "password"); 
    IPAddress myIP = WiFi.softAPIP(); 
    setupServer = ESP8266WebServer(myIP, 8888); 
    setupServer.on("/join", join); 
    setupServer.begin(); 
    } else { 
    // read file contents for ssid and password 
    connectWifi(ssid, password, true); 
    // do some work here 
    } 
} 

void loop() { 
    setupServer.handleClient(); 
} 

그래서 지금은 신선한 부팅을 수행 할 때, 보드가 AP_STA 모드로 들어가고 SSID AP로 시작 : 아래

은 내가 사용하는 논리이다. 내가 그것에 연결하고 http://192.169.4.1/join?ssid=mywifi&password=12345678 브라우저에서 엽니 다. 어떻게 든 연결이 종료되고 브라우저에 "Destination Unreachable"이 표시됩니다. 그러나 직렬 모니터는 '연결됨'과 '저장된 내용'을 인쇄합니다.

브라우저에 성공 응답을 반환하지 않는 이유를 알고 싶습니다. WiFi에 연결 한 후 localIP가 필요합니다. 실패 할 경우 실패한 응답을 올 Y 르게 리턴합니다. 다시 시작하기 전에 연결되어있는 클라이언트에게 항상 할당 된 IP 주소를 반환하는지 어떻게 확인할 수 있습니까?

도움을 주시면 감사하겠습니다.

감사합니다.

+0

스테이션 모드에서 클라이언트 모드로 전환하고 아마도 새 IP 주소를 얻는다면 당연히 연결이 끊어집니다. 브라우저가 연결된 IP 주소를 더 이상 사용할 수 없습니다. – larsks

+0

아, 사과드립니다. 나는 그 부분을 놓쳤습니다. 나는 제공된 코드를 바로 잡을 것이다. 나는 그것도 포함시켰다. –

+0

@larsks AP_STA에서 구성 할 때 스테이션 전용 모드로 전환되지 않는 코드를 수정했습니다. STA 전용 모드는 나중에 만 활성화됩니다. –

답변

0

무선 모듈이 두 가지 모드로 공유되므로 발생하는 것처럼 보입니다. https://github.com/esp8266/Arduino/issues/3282

이것은 STA는이 연결을 시도하는 AP의 채널로 전환되며, SoftAP가로 전환해야 할 것이다는 사실과 관련이 :

여기에이 문제에 대한 explaination 발견 같은 채널. 따라서 클라이언트 (SoftAP에 연결된 PC 또는 스마트 폰)는 새 채널의 SoftAP에 다시 연결해야합니다. 대부분의 경우 이로 인해 TCP 연결이 재설정됩니다.