From 010c3114693c36c6e6e2b1ad9fa5ba005ba45e23 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Sat, 19 Dec 2015 20:05:59 +0200 Subject: [PATCH] add example --- .../ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino | 225 +++++++++++ examples/ESP_AsyncFSBrowser/data/edit.htm.gz | Bin 0 -> 4116 bytes examples/ESP_AsyncFSBrowser/data/favicon.ico | Bin 0 -> 1150 bytes examples/ESP_AsyncFSBrowser/data/graphs.js.gz | Bin 0 -> 2379 bytes examples/ESP_AsyncFSBrowser/data/index.htm | 366 ++++++++++++++++++ 5 files changed, 591 insertions(+) create mode 100644 examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino create mode 100644 examples/ESP_AsyncFSBrowser/data/edit.htm.gz create mode 100644 examples/ESP_AsyncFSBrowser/data/favicon.ico create mode 100644 examples/ESP_AsyncFSBrowser/data/graphs.js.gz create mode 100644 examples/ESP_AsyncFSBrowser/data/index.htm diff --git a/examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino b/examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino new file mode 100644 index 0000000..ca7e99f --- /dev/null +++ b/examples/ESP_AsyncFSBrowser/ESP_AsyncFSBrowser.ino @@ -0,0 +1,225 @@ +#include +#include +#include +#include +#include +#include + +// WEB HANDLER IMPLEMENTATION +class SPIFFSEditor: public AsyncWebHandler { + private: + String _username; + String _password; + bool _uploadAuthenticated; + public: + SPIFFSEditor(String username=String(), String password=String()):_username(username),_password(password),_uploadAuthenticated(false){} + bool canHandle(AsyncWebServerRequest *request){ + if(request->method() == HTTP_GET && request->url() == "/edit" && (SPIFFS.exists("/edit.htm") || SPIFFS.exists("/edit.htm.gz"))) + return true; + else if(request->method() == HTTP_GET && request->url() == "/list") + return true; + else if(request->method() == HTTP_GET && (request->url().endsWith("/") || SPIFFS.exists(request->url()) || (!request->hasParam("download") && SPIFFS.exists(request->url()+".gz")))) + return true; + else if(request->method() == HTTP_POST && request->url() == "/edit") + return true; + else if(request->method() == HTTP_DELETE && request->url() == "/edit") + return true; + else if(request->method() == HTTP_PUT && request->url() == "/edit") + return true; + return false; + } + + void handleRequest(AsyncWebServerRequest *request){ + if(_username.length() && (request->method() != HTTP_GET || (request->url() != "/edit" && request->url() != "/list")) && !request->authenticate(_username.c_str(),_password.c_str())) + return request->requestAuthentication(); + + if(request->method() == HTTP_GET && request->url() == "/edit"){ + request->send(SPIFFS, "/edit.htm"); + } else if(request->method() == HTTP_GET && request->url() == "/list"){ + if(request->hasParam("dir")){ + String path = request->getParam("dir")->value(); + Dir dir = SPIFFS.openDir(path); + path = String(); + String output = "["; + while(dir.next()){ + File entry = dir.openFile("r"); + if (output != "[") output += ','; + bool isDir = false; + output += "{\"type\":\""; + output += (isDir)?"dir":"file"; + output += "\",\"name\":\""; + output += String(entry.name()).substring(1); + output += "\"}"; + entry.close(); + } + output += "]"; + request->send(200, "text/json", output); + output = String(); + } + else + request->send(400); + } else if(request->method() == HTTP_GET){ + String path = request->url(); + if(path.endsWith("/")) + path += "index.htm"; + request->send(SPIFFS, path, String(), request->hasParam("download")); + } else if(request->method() == HTTP_DELETE){ + if(request->hasParam("path", true)){ + ESP.wdtDisable(); SPIFFS.remove(request->getParam("path", true)->value()); ESP.wdtEnable(10); + request->send(200, "", "DELETE: "+request->getParam("path", true)->value()); + } else + request->send(404); + } else if(request->method() == HTTP_POST){ + if(request->hasParam("data", true, true) && SPIFFS.exists(request->getParam("data", true, true)->value())) + request->send(200, "", "UPLOADED: "+request->getParam("data", true, true)->value()); + else + request->send(500); + } else if(request->method() == HTTP_PUT){ + if(request->hasParam("path", true)){ + String filename = request->getParam("path", true)->value(); + if(SPIFFS.exists(filename)){ + request->send(200); + } else { + File f = SPIFFS.open(filename, "w"); + if(f){ + f.write(0x00); + f.close(); + request->send(200, "", "CREATE: "+filename); + } else { + request->send(500); + } + } + } else + request->send(400); + } + } + + void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){ + if(!index){ + if(!_username.length() || request->authenticate(_username.c_str(),_password.c_str())) + _uploadAuthenticated = true; + request->_tempFile = SPIFFS.open(filename, "w"); + } + if(_uploadAuthenticated && request->_tempFile && len){ + ESP.wdtDisable(); request->_tempFile.write(data,len); ESP.wdtEnable(10); + } + if(_uploadAuthenticated && final) + if(request->_tempFile) request->_tempFile.close(); + } +}; + + +// SKETCH BEGIN +AsyncWebServer server(80); + +const char* ssid = "**********"; +const char* password = "************"; +const char* http_username = "admin"; +const char* http_password = "admin"; + + +extern "C" void system_set_os_print(uint8 onoff); +extern "C" void ets_install_putc1(void* routine); + +static void _u0_putc(char c){ + while(((U0S >> USTXC) & 0x7F) != 0); + U0F = c; +} + +void initSerial(){ + Serial.begin(115200); + ets_install_putc1((void *) &_u0_putc); + system_set_os_print(1); +} + +void initWiFi(){ +} + +void setup(){ + initSerial(); + SPIFFS.begin(); + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, password); + if (WiFi.waitForConnectResult() != WL_CONNECTED) { + Serial.printf("STA: Failed!\n"); + WiFi.disconnect(false); + delay(1000); + WiFi.begin(ssid, password); + } + ArduinoOTA.begin(); + //Serial.printf("format start\n"); SPIFFS.format(); Serial.printf("format end\n"); + + server.serveStatic("/fs", SPIFFS, "/"); + + server.on("/heap", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(200, "text/plain", String(ESP.getFreeHeap())); + }); + server.addHandler(new SPIFFSEditor(http_username,http_password)); + + server.onNotFound([](AsyncWebServerRequest *request){ + os_printf("NOT_FOUND: "); + if(request->method() == HTTP_GET) + os_printf("GET"); + else if(request->method() == HTTP_POST) + os_printf("POST"); + else if(request->method() == HTTP_DELETE) + os_printf("DELETE"); + else if(request->method() == HTTP_PUT) + os_printf("PUT"); + else if(request->method() == HTTP_PATCH) + os_printf("PATCH"); + else if(request->method() == HTTP_HEAD) + os_printf("HEAD"); + else if(request->method() == HTTP_OPTIONS) + os_printf("OPTIONS"); + else + os_printf("UNKNOWN"); + os_printf(" http://%s%s\n", request->host().c_str(), request->url().c_str()); + + if(request->contentLength()){ + os_printf("_CONTENT_TYPE: %s\n", request->contentType().c_str()); + os_printf("_CONTENT_LENGTH: %u\n", request->contentLength()); + } + + int headers = request->headers(); + int i; + for(i=0;igetHeader(i); + os_printf("_HEADER[%s]: %s\n", h->name().c_str(), h->value().c_str()); + } + + int params = request->params(); + for(i=0;igetParam(i); + if(p->isFile()){ + os_printf("_FILE[%s]: %s, size: %u\n", p->name().c_str(), p->value().c_str(), p->size()); + } else if(p->isPost()){ + os_printf("_POST[%s]: %s\n", p->name().c_str(), p->value().c_str()); + } else { + os_printf("_GET[%s]: %s\n", p->name().c_str(), p->value().c_str()); + } + } + + request->send(404); + }); + server.onFileUpload([](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){ + if(!index) + os_printf("UploadStart: %s\n", filename.c_str()); + os_printf("%s", (const char*)data); + if(final) + os_printf("UploadEnd: %s (%u)\n", filename.c_str(), index+len); + }); + server.onRequestBody([](AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total){ + if(!index) + os_printf("BodyStart: %u\n", total); + os_printf("%s", (const char*)data); + if(index + len == total) + os_printf("BodyEnd: %u\n", total); + }); + server.begin(); +} + +void loop(){ + ArduinoOTA.handle(); +} + diff --git a/examples/ESP_AsyncFSBrowser/data/edit.htm.gz b/examples/ESP_AsyncFSBrowser/data/edit.htm.gz new file mode 100644 index 0000000000000000000000000000000000000000..9ee1b81f0054db18190d447db26b3a7a15f10e88 GIT binary patch literal 4116 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 literal 0 HcmV?d00001 diff --git a/examples/ESP_AsyncFSBrowser/data/favicon.ico b/examples/ESP_AsyncFSBrowser/data/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..71b25fe6ee6012a4c26602977262d217af885520 GIT binary patch literal 1150 zcmd5)T}YZ?6n@3p3@y{hrv0dyWg4`Ks8LiSs1Zp~iZo)Ag)vw}5=AXod1FBkBZ8nH zm^Z-|?V=!w1lNUBASeXo@J`0^VlWvo2dii2d%G#v{l>?6f6jZJbDr~@k1-K_xw(v1 z9ebI0x7Iqot*#Mb_8XCpMW( zReHVNRa#m)qtR%dYqeVa%E}7s=;*k^yt%pgaZOFlCyT}Mt)ikLSyomSAdHVNiTwQh zYlT9AoSdAi?Ck6_l}cqxrBb4{wllAZC#W|h5(!LCPa_ZrfO4a^w-*$T#l=O$<8hpvoWSq* zr+q%3e_~?7OnSW+IMa^f<71qjo??H0AF)^rR;v~3>+77){QNxD*47Y-M377-5sgNF zZ*FeBB8@*378YW1auP>JN7&xpMmQYC!NCEBhljDWw8S}YZEay}Y>emI+uIY~)4^cy z8F70`_|(9_00svKF*G!U(a}+OJRTk|_-LM-)6~=yc6N5SQH{@((@6bGii?Y1E0xNx zGMVg3&{-mpfX*l>DM4Lb9lE=_xgNW_yPVhI;UPky&|8{|m^5NE!wk}(ie_b}IlBq} zMVOVKdwqR9$B&PX3*3JY_m9Nk&GPc{gN==iJO5F2bv2uvofXmS?P|3;LfBta`3zy6F#O-#g&(F`<>gww4@PB>= d7!xdbpRqYH(Gg7acUp7g|4wmf`3*+E{Q*gMMA`rV literal 0 HcmV?d00001 diff --git a/examples/ESP_AsyncFSBrowser/data/graphs.js.gz b/examples/ESP_AsyncFSBrowser/data/graphs.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..e0e13f69ea4c4fcb968dec7efaea5bcb8e8e9b63 GIT binary patch literal 2379 zcmV-R3AFYfiwFp_eqL1o17~t!aAqv&p?2vdxN=LO>OL^T_()0dDDoZes5%)DvZ&|K}+-V$3I(tEpU z`ecX(BO*3nh!Hf639+|~4&8=7>@fjx-yy@pOC%Yp%89ZvS~awg%dJa_R&XC~Us6>u zgGZf@x+P$YfDN0pPLvglWhP{(<=R{uX)ccWwKlXYOZld7{%T0UC+W^DGCwjLdOSZc zobJdXqeF=E*ytRLy6qaX6r-&`!?VEImCkS8xb#>tZj}QUdd8OW+UO%@VvST&hsM-0 z-qwsi2<;A=yGpvqAmbvis!EX+wv9KoKTZWjo9~b26rMlB)SRX<6hlA*CXAI~nON<~q&dystTB}Dh_30d z2BuDh&4cnUfP}R_aXPk@t4hrr9>4_P-I!kMH%;?`qK$3ZzN7aQyk|R_u_KvS$!;S3 zh<1%JY1aZv?*@kuYBx|-dN0D#F|1eyy=z542dz&e&?XH+fIhfs8ds{UM|4{>zSFG{ zMUO8fPIiBL(p#otgWT98FF9YJ{MpdY$<62F*}um7bm-@lt%~xw_fziD8y0%iu7%e0 z8uHu_6UG(&iYtl>Q)c)IUbk7fh9RVm!rGYzEg{AlVm?5w1f;cwm}^M;0WuPhoi(Jj zhU`8-G64a#>0Z=)l!3iU210GBxtgbqUyy^&!!`$_OI^#{|A|ISs@;zJsnm-Y^}<{0 zg;(l@2R%up7q^HRuQ6jFOb*6iPpv7GnT1kPz|Lyd7FG!5QtHe9tSQO=LsOC$G-dfz zQ`)sVL2?G|yXGIj@C8-`n&5pdyxX;&KwJQ#*ED_u$U6mF@2wV8AFKi&eh1ZoGp?|} zvI3tI;lse^1X&vj)P^lV9a0<_v}iP>JHk&Z_$k6w1?n}tP*njmK9YhW_^gWf48f*{ z5ua^F+^-_;R}uFy;vJ|ySPOh8BVHgc7zOj73S&@4J=lnPaTL-8L@g)~eqO=P%c##c z;fGVYfY?hos`s4~@e^6~WOXX5Gg%E})tA+|tZvxRfhzyy>$uJ*BJe#)aj=d@WQ(cf=SRYXhn(>d2yiC zY9kY7EH(IwEHo3aJMz>l*KTuFw+tPwWH4XNynRs0l#ENIoWgk^G;&4YxUA6!3O1Ze(*#9YrTncg_ z+*g&3GNGeVE_xL_1)*3rTLyxaYB&<3@Vg1?Ot4GTBh1Jc*XC*dz#?&pM>zDz9Gip;q*FzH})0o zh82qXwPMck#(67loOlC$Z7%R0x?JBw&Aak4id{WXO4z9=&qUc5q#FaHcc@e3{Md(V|Fm=_2+mdQX z379`NpaN8ZZ)oArlAC_Mo#JA-*1R!nka+_#fQfJqb-3K)N{d-XORaCC9 znC}U!?4z7*Tm|7`rl`2|ATu_|oNA7!#0oF*T?JC-(yf#>NV;uOu}_h{Vc-Cupl{x= zSC)_a;FXU``i^**0fH%Lm{bEV&7>mfo+>zGf^<13fUx~zfb^B3Tk>w$f0^@1Oe^{6 z%IH(}r(-_&39pru$a6@70dWuG)MY8R!!UO29Adb%AzTj_(ij5c zMjJpF?>8|I&*MYp2hkOxq9P3Wl7Z`-yFr$O_7bK59LNiN6F!7EeL*Cnn%XHie~uGA zVu3%(Ib)3bEI);rVzPW2Qac#5cVISt5@$S1?1;D9ZEm|j3q=t5@0pkLh|M9%Ns)^z za^al?cZ?@RHo}>Y?8s+p7w)o<;p}>83PG;_F;&I`i3@=8lVf8d&2{t{AEvxB7z`j7 zX9;oe)($@_iFS0}t8%ux!@uCX_W+nOFrBA%0?D#*v81IRvMGZRKgYQpaz74T4nAVJ zKX_ioa&9LHgFKA_=xUk#-3h-u;pb37fS2}yJCLIwDsZVGLdiPFQIeUFbaRpBb=JcuLlsLz2D+FPOIL8cOb|~o!2P{|NV;6e*hp(-P}AB003iGm9zi= literal 0 HcmV?d00001 diff --git a/examples/ESP_AsyncFSBrowser/data/index.htm b/examples/ESP_AsyncFSBrowser/data/index.htm new file mode 100644 index 0000000..7523b22 --- /dev/null +++ b/examples/ESP_AsyncFSBrowser/data/index.htm @@ -0,0 +1,366 @@ + + + + + + ESP Monitor + + + + + + +
+
+
+ + + + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+ + + + + + + + + + + + + +
   SSIDBSSIDChannelSecureHiddenRSSI
+
+ + + +