2016-09-25 66 views
2

我正在使用ESP8266-12 WiFi模塊訪問我的家庭無線網絡來控制燈。爲了上傳新固件(OTA:Over the Air)更新,我想使用ESP8266的熱點AccessPoint,因爲更改我的wifi網絡密碼後,我無法做到這一點。這是我的Arduino代碼:如何切換到正常的WiFi模式,以接入點模式ESP8266

#include <ESP8266WiFi.h> 
#include <ESP8266mDNS.h> 
#include <ArduinoOTA.h> 
#include <ESP8266WebServer.h> 

//ssid and password of your wifi network 
const char* ssid = "wifi_ssid"; 
const char* password = "wifi_password"; 

//ssid and password to connect to local hotspot of ESP8266 
const char *esp_ssid = "your_desired_ssid"; 
const char *esp_password = "your_desired_password"; 

IPAddress ip(192, 168, 1, xx); // where xx is the desired IP Address 
IPAddress gateway(192, 168, 1, 254); // set gateway to match your wifi network 
IPAddress subnet(255, 255, 255, 0); // set subnet mask to match your wifi network 

ESP8266WebServer server(80); 
int status = LOW; 
const int pin = 5; 

const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>"; 

//Authorization username and password before updating firmware 
const char* www_username = "admin"; 
const char* www_password = "esp8266"; 

void connectToWifi() { 
    Serial.print("Connecting to "); 
    Serial.println(ssid); 

    WiFi.config(ip, gateway, subnet); 
    WiFi.begin(ssid, password); 
    while(WiFi.waitForConnectResult() != WL_CONNECTED) { 
    delay(500); 
    Serial.print("."); 
    //ESP.restart(); 
    } 
    Serial.print("WiFi connected to "); 
    Serial.println(WiFi.localIP()); 
} 

void createAccessPoint() { 
    Serial.println("Configuring access point for wifi network *your_desired_ssid*..."); 
    WiFi.softAP(esp_ssid, esp_password); 
    IPAddress accessIP = WiFi.softAPIP(); 
    Serial.print("ESP AccessPoint IP address: "); 
    Serial.println(accessIP); 
    /* Go to http://192.168.4.1 in a web browser 
    * connected to this access point to see it. 
    */ 
} 

void serverResponse(){ 
    server.sendHeader("Connection", "close"); 
    server.sendHeader("Access-Control-Allow-Origin", "*"); 
    server.send(200, "text/plain", String(status)); 
} 


void setup() { 
    Serial.begin(115200); 
    pinMode(pin, OUTPUT); 
    connectToWifi(); 
    ArduinoOTA.begin(); 
    server.on("/fupdate", [](){ 
    if(server.authenticate(www_username, www_password)){ 
     createAccessPoint(); 
     server.sendHeader("Connection", "close"); 
     server.sendHeader("Access-Control-Allow-Origin", "*"); 
     server.send(200, "text/html", serverIndex); 
    } 
    else{ 
     return server.requestAuthentication(); 
    } 

    }); 
    server.on("/status", [](){ 
    serverResponse(); 
    }); 
    server.on("/on", [](){ 
    status = HIGH; 
    serverResponse(); 
    }); 
    server.on("/off", [](){ 
    status = LOW; 
    serverResponse(); 
    }); 
    server.on("/update", HTTP_POST, [](){ 
     server.sendHeader("Connection", "close"); 
     server.sendHeader("Access-Control-Allow-Origin", "*"); 
     server.send(200, "text/plain", (Update.hasError())?"FAIL":"OK"); 
     ESP.restart(); 
    },[](){ 
     HTTPUpload upload = server.upload(); 
     if(upload.status == UPLOAD_FILE_START){ 
     Serial.setDebugOutput(true); 
     WiFiUDP::stopAll(); 
     Serial.printf("Update: %s\n", upload.filename.c_str()); 
     uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; 
     if(!Update.begin(maxSketchSpace)){//start with max available size 
      Update.printError(Serial); 
     } 
     } else if(upload.status == UPLOAD_FILE_WRITE){ 
     if(Update.write(upload.buf, upload.currentSize) != upload.currentSize){ 
      Update.printError(Serial); 
     } 
     } else if(upload.status == UPLOAD_FILE_END){ 
     if(Update.end(true)){ //true to set the size to the current progress 
      Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize); 
     } else { 
      Update.printError(Serial); 
     } 
     Serial.setDebugOutput(false); 
     } 
     yield(); 
    }); 
    server.begin(); 
    MDNS.addService("http", "tcp", 80); 

    Serial.print("Open http://"); 
    Serial.print(WiFi.localIP()); 
    Serial.println("/ in your browser to see it working"); 
} 

void loop() { 
    digitalWrite(pin, status); 
    ArduinoOTA.handle(); 
    server.handleClient(); 
    delay(1); 
} 

我有一個簡單的WifiWebServer處理請求。當我發送/fupdate請求時,ESP模塊應該創建熱點,並且我可以通過接入點連接我的計算機以更新固件。爲了更新固件,我設置了授權。如果授權完成,只有T可以上傳新的固件。 但是我的ESP8266模塊在發送/fupdate **請求或授權之前正在創建熱點。這是當我賦予權力時啓用熱點。有人可以如何解決這個問題?

回答

4

把這些線路稱爲connectToWifi(函數的頂部)

WiFi.softAPdisconnect(); 
    WiFi.disconnect(); 
    WiFi.mode(WIFI_STA); 
    delay(100); 

ESP的WiFi模塊存儲在芯片上自己的配置,他希望清楚地覆蓋它。不要讓他嘗試一些共同點,明確定義配置並停止無關的先前操作。

1

它看起來像你永遠不會關閉接入點。您可能在此刪除了該部分,但請確保在更新固件後,正確關閉A.P.。如果你像這樣運行代碼,第一次可能會運行良好,但是一旦你運行了「/ fupdate」命令,它將永遠保持A.P.,並且當你第二次運行「/ fupdate」時最終會崩潰。

所以你應該在調用「createAccessPoint」之前檢查狀態,因爲如果它已經創建的軟件可能會失敗。

相關問題