diff --git a/libraries/ESP8266HTTPUpdateServer/examples/WebUpdater/WebUpdater.ino b/libraries/ESP8266HTTPUpdateServer/examples/WebUpdater/WebUpdater.ino new file mode 100644 index 000000000..13798adbf --- /dev/null +++ b/libraries/ESP8266HTTPUpdateServer/examples/WebUpdater/WebUpdater.ino @@ -0,0 +1,43 @@ +/* + To upload through terminal you can use: curl -F "image=@firmware.bin" esp8266-webupdate.local/update +*/ + +#include +#include +#include +#include +#include + +const char* host = "esp8266-webupdate"; +const char* ssid = "........"; +const char* password = "........"; + +ESP8266WebServer httpServer(80); +ESP8266HTTPUpdateServer httpUpdater; + +void setup(void){ + + Serial.begin(115200); + Serial.println(); + Serial.println("Booting Sketch..."); + WiFi.mode(WIFI_AP_STA); + WiFi.begin(ssid, password); + + while(WiFi.waitForConnectResult() != WL_CONNECTED){ + WiFi.begin(ssid, password); + Serial.println("WiFi failed, retrying."); + } + + MDNS.begin(host); + + httpUpdater.setup(&httpServer); + httpServer.begin(); + + MDNS.addService("http", "tcp", 80); + Serial.printf("HTTPUpdateServer ready! Open http://%s.local/update in your browser\n", host); +} + +void loop(void){ + httpServer.handleClient(); + delay(1); +} diff --git a/libraries/ESP8266HTTPUpdateServer/keywords.txt b/libraries/ESP8266HTTPUpdateServer/keywords.txt new file mode 100644 index 000000000..08354a599 --- /dev/null +++ b/libraries/ESP8266HTTPUpdateServer/keywords.txt @@ -0,0 +1,20 @@ +####################################### +# Syntax Coloring Map For HTTPUpdateServer +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +ESP8266HTTPUpdateServer KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +begin KEYWORD2 +setup KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### diff --git a/libraries/ESP8266HTTPUpdateServer/library.properties b/libraries/ESP8266HTTPUpdateServer/library.properties new file mode 100644 index 000000000..5fd998871 --- /dev/null +++ b/libraries/ESP8266HTTPUpdateServer/library.properties @@ -0,0 +1,9 @@ +name=ESP8266HTTPUpdateServer +version=1.0 +author=Ivan Grokhotkov, Miguel Ángel Ajo +maintainer=Ivan Grokhtkov +sentence=Simple HTTP Update server based on the ESP8266WebServer +paragraph=The library accepts HTTP post requests to the /update url, and updates the ESP8266 firmware. +category=Communication +url= +architectures=esp8266 diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.cpp b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.cpp new file mode 100644 index 000000000..2ed37c502 --- /dev/null +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.cpp @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include +#include "ESP8266HTTPUpdateServer.h" + + +const char* ESP8266HTTPUpdateServer::_serverIndex = +R"(
+ + +
+ )"; + +ESP8266HTTPUpdateServer::ESP8266HTTPUpdateServer(bool serial_debug) +{ + _serial_output = serial_debug; + _server = NULL; +} + +void ESP8266HTTPUpdateServer::setup(ESP8266WebServer *server) +{ + _server = server; + + // handler for the /update form page + _server->on("/update", HTTP_GET, [&](){ + _server->sendHeader("Connection", "close"); + _server->sendHeader("Access-Control-Allow-Origin", "*"); + _server->send(200, "text/html", _serverIndex); + }); + + // handler for the /update form POST (once file upload finishes) + _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(); + }); + + // handler for the file upload, get's the sketch bytes, and writes + // them through the Update object. + _server->onFileUpload([&](){ + if(_server->uri() != "/update") return; + HTTPUpload& upload = _server->upload(); + if(upload.status == UPLOAD_FILE_START){ + if (_serial_output) + Serial.setDebugOutput(true); + WiFiUDP::stopAll(); + if (_serial_output) + 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 + if (_serial_output) Update.printError(Serial); + } + } else if(upload.status == UPLOAD_FILE_WRITE){ + if (_serial_output) Serial.printf("."); + if(Update.write(upload.buf, upload.currentSize) != upload.currentSize){ + if (_serial_output) Update.printError(Serial); + + } + } else if(upload.status == UPLOAD_FILE_END){ + if(Update.end(true)){ //true to set the size to the current progress + if (_serial_output) Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize); + } else { + if (_serial_output) Update.printError(Serial); + } + if (_serial_output) Serial.setDebugOutput(false); + } else if(upload.status == UPLOAD_FILE_ABORTED){ + Update.end(); + if (_serial_output) Serial.println("Update was aborted"); + } + yield(); + }); +} diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h new file mode 100644 index 000000000..5054af1e6 --- /dev/null +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h @@ -0,0 +1,18 @@ +#ifndef __HTTP_UPDATE_SERVER_H +#define __HTTP_UPDATE_SERVER_H + +class ESP8266WebServer; + +class ESP8266HTTPUpdateServer +{ + private: + bool _serial_output; + ESP8266WebServer *_server; + static const char *_serverIndex; + public: + ESP8266HTTPUpdateServer(bool serial_debug=false); + void setup(ESP8266WebServer *server=NULL); +}; + + +#endif