From 09b8b8087c0ef761c51c35461c64cf82b7ae2f2e Mon Sep 17 00:00:00 2001 From: Sashka Date: Mon, 23 Oct 2017 17:59:13 -0400 Subject: [PATCH] Add libesphttpd to extras and supporting example (#458) * libesphttpd: added extras and example * Added "heatshrink" as a submodule * Updated libesphttpd * Updated libesphttpd * Trying to fix the commit id * Updated libesphttpd * Added zlib1g-dev package * Use native gcc to build mkespfsimage and mkupgimg * Added NS and GW for DHCP server configuration --- .gitmodules | 6 + .travis.yml | 1 + examples/esphttpd/FreeRTOSConfig.h | 11 + examples/esphttpd/Makefile | 16 ++ examples/esphttpd/cgi-test.c | 90 ++++++++ examples/esphttpd/cgi-test.h | 8 + examples/esphttpd/cgi.c | 81 +++++++ examples/esphttpd/cgi.h | 10 + .../esphttpd/html/cats/cross-eyed-cat.jpg | Bin 0 -> 36487 bytes .../esphttpd/html/cats/junge-katze-iv.jpg | Bin 0 -> 34289 bytes .../esphttpd/html/cats/kitten-loves-toy.jpg | Bin 0 -> 49447 bytes examples/esphttpd/html/flash/140medley.min.js | 2 + examples/esphttpd/html/flash/index.html | 75 +++++++ examples/esphttpd/html/flash/style.css | 34 +++ examples/esphttpd/html/index.tpl | 26 +++ examples/esphttpd/html/led.tpl | 15 ++ examples/esphttpd/html/style.css | 17 ++ examples/esphttpd/html/test/index.html | 9 + examples/esphttpd/html/test/test.js | 205 +++++++++++++++++ examples/esphttpd/html/websocket/index.html | 69 ++++++ examples/esphttpd/html/wifi/140medley.min.js | 2 + examples/esphttpd/html/wifi/connecting.html | 43 ++++ examples/esphttpd/html/wifi/icons.png | Bin 0 -> 914 bytes examples/esphttpd/html/wifi/style.css | 24 ++ examples/esphttpd/html/wifi/wifi.tpl | 94 ++++++++ examples/esphttpd/io.c | 72 ++++++ examples/esphttpd/io.h | 7 + examples/esphttpd/user_main.c | 210 ++++++++++++++++++ extras/libesphttpd/component.mk | 64 ++++++ extras/libesphttpd/libesphttpd | 1 + 30 files changed, 1192 insertions(+) create mode 100644 examples/esphttpd/FreeRTOSConfig.h create mode 100644 examples/esphttpd/Makefile create mode 100644 examples/esphttpd/cgi-test.c create mode 100644 examples/esphttpd/cgi-test.h create mode 100644 examples/esphttpd/cgi.c create mode 100644 examples/esphttpd/cgi.h create mode 100644 examples/esphttpd/html/cats/cross-eyed-cat.jpg create mode 100644 examples/esphttpd/html/cats/junge-katze-iv.jpg create mode 100644 examples/esphttpd/html/cats/kitten-loves-toy.jpg create mode 100644 examples/esphttpd/html/flash/140medley.min.js create mode 100644 examples/esphttpd/html/flash/index.html create mode 100644 examples/esphttpd/html/flash/style.css create mode 100644 examples/esphttpd/html/index.tpl create mode 100644 examples/esphttpd/html/led.tpl create mode 100644 examples/esphttpd/html/style.css create mode 100644 examples/esphttpd/html/test/index.html create mode 100644 examples/esphttpd/html/test/test.js create mode 100644 examples/esphttpd/html/websocket/index.html create mode 100644 examples/esphttpd/html/wifi/140medley.min.js create mode 100644 examples/esphttpd/html/wifi/connecting.html create mode 100644 examples/esphttpd/html/wifi/icons.png create mode 100644 examples/esphttpd/html/wifi/style.css create mode 100644 examples/esphttpd/html/wifi/wifi.tpl create mode 100644 examples/esphttpd/io.c create mode 100644 examples/esphttpd/io.h create mode 100644 examples/esphttpd/user_main.c create mode 100644 extras/libesphttpd/component.mk create mode 160000 extras/libesphttpd/libesphttpd diff --git a/.gitmodules b/.gitmodules index 17f8003..6790fd5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -28,3 +28,9 @@ [submodule "extras/crc_generic/crc_lib"] path = extras/crc_generic/crc_lib url = https://github.com/Zaltora/crc_generic_lib.git +[submodule "extras/libesphttpd/libesphttpd"] + path = extras/libesphttpd/libesphttpd + url = https://github.com/nochkin/libesphttpd +[submodule "extras/libesphttpd/libesphttpd/lib/heatshrink"] + path = extras/libesphttpd/libesphttpd/lib/heatshrink + url = https://github.com/atomicobject/heatshrink diff --git a/.travis.yml b/.travis.yml index 39674fe..4d2597d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,7 @@ addons: - git - help2man - vim-common + - zlib1g-dev before_install: - pip install --user pyserial diff --git a/examples/esphttpd/FreeRTOSConfig.h b/examples/esphttpd/FreeRTOSConfig.h new file mode 100644 index 0000000..d6d9c5e --- /dev/null +++ b/examples/esphttpd/FreeRTOSConfig.h @@ -0,0 +1,11 @@ +/* FreeRTOSConfig overrides. + + This is intended as an example of overriding some of the default FreeRTOSConfig settings, + which are otherwise found in FreeRTOS/Source/include/FreeRTOSConfig.h +*/ + +#define configUSE_RECURSIVE_MUTEXES 1 + +/* Use the defaults for everything else */ +#include_next + diff --git a/examples/esphttpd/Makefile b/examples/esphttpd/Makefile new file mode 100644 index 0000000..2362443 --- /dev/null +++ b/examples/esphttpd/Makefile @@ -0,0 +1,16 @@ +PROGRAM = esphttpd +EXTRA_COMPONENTS = extras/dhcpserver extras/rboot-ota extras/libesphttpd + +ESP_IP ?= 192.168.4.1 + +#Tag for OTA images. 0-27 characters. Change to eg your projects title. +LIBESPHTTPD_OTA_TAGNAME ?= generic + +LIBESPHTTPD_MAX_CONNECTIONS ?= 8 +LIBESPHTTPD_STACKSIZE ?= 2048 + +PROGRAM_CFLAGS += -DFREERTOS -DLIBESPHTTPD_OTA_TAGNAME="\"$(LIBESPHTTPD_OTA_TAGNAME)\"" -DFLASH_SIZE=$(FLASH_SIZE) +EXTRA_CFLAGS += -DMEMP_NUM_NETCONN=$(LIBESPHTTPD_MAX_CONNECTIONS) + +include ../../common.mk + diff --git a/examples/esphttpd/cgi-test.c b/examples/esphttpd/cgi-test.c new file mode 100644 index 0000000..7a16aed --- /dev/null +++ b/examples/esphttpd/cgi-test.c @@ -0,0 +1,90 @@ +/* +Cgi routines as used by the tests in the html/test subdirectory. +*/ + +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * Jeroen Domburg wrote this file. As long as you retain + * this notice you can do whatever you want with this stuff. If we meet some day, + * and you think this stuff is worth it, you can buy me a beer in return. + * ---------------------------------------------------------------------------- + */ + + +#include +#include +#include + +#include + +#include "cgi-test.h" + +typedef struct { + int len; + int sendPos; +} TestbedState; + + +int ICACHE_FLASH_ATTR cgiTestbed(HttpdConnData *connData) { + char buff[1024]; + int first=0; + int l, x; + TestbedState *state=(TestbedState*)connData->cgiData; + + if (connData->conn==NULL) { + //Connection aborted. Clean up. + if (state) free(state); + return HTTPD_CGI_DONE; + } + + if (state==NULL) { + //First call + state=malloc(sizeof(TestbedState)); + memset(state, 0, sizeof(state)); + connData->cgiData=state; + first=1; + } + + if (connData->requestType==HTTPD_METHOD_GET) { + if (first) { + httpdStartResponse(connData, 200); + httpdHeader(connData, "content-type", "application/data"); + httpdEndHeaders(connData); + l=httpdFindArg(connData->getArgs, "len", buff, sizeof(buff)); + state->len=1024; + if (l!=-1) state->len=atoi(buff); + state->sendPos=0; + return HTTPD_CGI_MORE; + } else { + l=sizeof(buff); + if (l>(state->len-state->sendPos)) l=(state->len-state->sendPos); + //Fill with semi-random data + for (x=0; xsendPos>>10))&0x1F)+'0'; + httpdSend(connData, buff, l); + state->sendPos+=l; + printf("Test: Uploaded %d/%d bytes\n", state->sendPos, state->len); + if (state->len<=state->sendPos) { + if (state) free(state); + return HTTPD_CGI_DONE; + } else { + return HTTPD_CGI_MORE; + } + } + } + if (connData->requestType==HTTPD_METHOD_POST) { + if (connData->post->len!=connData->post->received) { + //Still receiving data. Ignore this. + printf("Test: got %d/%d bytes\n", connData->post->received, connData->post->len); + return HTTPD_CGI_MORE; + } else { + httpdStartResponse(connData, 200); + httpdHeader(connData, "content-type", "text/plain"); + httpdEndHeaders(connData); + l=sprintf(buff, "%d", connData->post->received); + httpdSend(connData, buff, l); + return HTTPD_CGI_DONE; + } + } + return HTTPD_CGI_DONE; +} diff --git a/examples/esphttpd/cgi-test.h b/examples/esphttpd/cgi-test.h new file mode 100644 index 0000000..a2c752e --- /dev/null +++ b/examples/esphttpd/cgi-test.h @@ -0,0 +1,8 @@ +#ifndef CGI_TEST_H +#define CGI_TEST_H + +#include + +int cgiTestbed(HttpdConnData *connData); + +#endif diff --git a/examples/esphttpd/cgi.c b/examples/esphttpd/cgi.c new file mode 100644 index 0000000..5b83ca2 --- /dev/null +++ b/examples/esphttpd/cgi.c @@ -0,0 +1,81 @@ +/* +Some random cgi routines. Used in the LED example and the page that returns the entire +flash as a binary. Also handles the hit counter on the main page. +*/ + +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * Jeroen Domburg wrote this file. As long as you retain + * this notice you can do whatever you want with this stuff. If we meet some day, + * and you think this stuff is worth it, you can buy me a beer in return. + * ---------------------------------------------------------------------------- + */ + + +#include +#include +#include + +#include + +#include "cgi.h" +#include "io.h" + + +//cause I can't be bothered to write an ioGetLed() +static char currLedState=0; + +//Cgi that turns the LED on or off according to the 'led' param in the POST data +int ICACHE_FLASH_ATTR cgiLed(HttpdConnData *connData) { + int len; + char buff[1024]; + + if (connData->conn==NULL) { + //Connection aborted. Clean up. + return HTTPD_CGI_DONE; + } + + len=httpdFindArg(connData->post->buff, "led", buff, sizeof(buff)); + if (len!=0) { + currLedState=atoi(buff); + ioLed(currLedState); + } + + httpdRedirect(connData, "led.tpl"); + return HTTPD_CGI_DONE; +} + + + +//Template code for the led page. +int ICACHE_FLASH_ATTR tplLed(HttpdConnData *connData, char *token, void **arg) { + char buff[128]; + if (token==NULL) return HTTPD_CGI_DONE; + + strcpy(buff, "Unknown"); + if (strcmp(token, "ledstate")==0) { + if (currLedState) { + strcpy(buff, "on"); + } else { + strcpy(buff, "off"); + } + } + httpdSend(connData, buff, -1); + return HTTPD_CGI_DONE; +} + +static int hitCounter=0; + +//Template code for the counter on the index page. +int ICACHE_FLASH_ATTR tplCounter(HttpdConnData *connData, char *token, void **arg) { + char buff[128]; + if (token==NULL) return HTTPD_CGI_DONE; + + if (strcmp(token, "counter")==0) { + hitCounter++; + sprintf(buff, "%d", hitCounter); + } + httpdSend(connData, buff, -1); + return HTTPD_CGI_DONE; +} diff --git a/examples/esphttpd/cgi.h b/examples/esphttpd/cgi.h new file mode 100644 index 0000000..5cb7296 --- /dev/null +++ b/examples/esphttpd/cgi.h @@ -0,0 +1,10 @@ +#ifndef CGI_H +#define CGI_H + +#include + +int cgiLed(HttpdConnData *connData); +int tplLed(HttpdConnData *connData, char *token, void **arg); +int tplCounter(HttpdConnData *connData, char *token, void **arg); + +#endif diff --git a/examples/esphttpd/html/cats/cross-eyed-cat.jpg b/examples/esphttpd/html/cats/cross-eyed-cat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e166e871d87539efd48b1695540f6abbc96444af GIT binary patch literal 36487 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

pGO8 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

tsrjhj^j>eKG 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 +Upgrade firmware + + + + + +

+

Update firmware

+
Loading...
+ + +
+ \ No newline at end of file diff --git a/examples/esphttpd/html/flash/style.css b/examples/esphttpd/html/flash/style.css new file mode 100644 index 0000000..7678ec8 --- /dev/null +++ b/examples/esphttpd/html/flash/style.css @@ -0,0 +1,34 @@ + +body { + background-color: #404040; + font-family: sans-serif; +} + +#main { + background-color: #d0d0FF; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + border: 2px solid #000000; + width: 800px; + margin: 0 auto; + padding: 20px +} + +#progressbar { + margin: 10px; + padding: 0; + border: 1px solid #000000; + height: 20px; + width: 200px; + background-color: #808080; +} + +#progressbarinner { + width: 10px; + height: 20px; + border: none; + background-color: #00ff00; +} + + diff --git a/examples/esphttpd/html/index.tpl b/examples/esphttpd/html/index.tpl new file mode 100644 index 0000000..737f301 --- /dev/null +++ b/examples/esphttpd/html/index.tpl @@ -0,0 +1,26 @@ + +Esp8266 web server + + + +
+

It Works

+

+If you see this, it means the tiny li'l website in your ESP8266 does actually work. Fyi, this page has +been loaded %counter% times. +

    +
  • If you haven't connected this device to your WLAN network now, you can do so.
  • +
  • You can also control the LED.
  • +
  • Esphttpd now also supports websockets.
  • +
  • Test esphttpd using the built-in test suite
  • +
  • And because I can, here's a link to my website
+ +

+ +

And because we're on the Internets now, here are the required pictures of cats:
+
+
+
+

+
+ diff --git a/examples/esphttpd/html/led.tpl b/examples/esphttpd/html/led.tpl new file mode 100644 index 0000000..7a9cf89 --- /dev/null +++ b/examples/esphttpd/html/led.tpl @@ -0,0 +1,15 @@ +Test + + + +
+

The LED

+

+If there's a LED connected to GPIO2, it's now %ledstate%. You can change that using the buttons below. +

+
+ + +
+
+ diff --git a/examples/esphttpd/html/style.css b/examples/esphttpd/html/style.css new file mode 100644 index 0000000..2a2f758 --- /dev/null +++ b/examples/esphttpd/html/style.css @@ -0,0 +1,17 @@ + +body { + background-color: #404040; + font-family: sans-serif; +} + +#main { + background-color: #d0d0FF; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + border: 2px solid #000000; + width: 800px; + margin: 0 auto; + padding: 20px +} + diff --git a/examples/esphttpd/html/test/index.html b/examples/esphttpd/html/test/index.html new file mode 100644 index 0000000..01f4121 --- /dev/null +++ b/examples/esphttpd/html/test/index.html @@ -0,0 +1,9 @@ +Webserver test + + + + +
+
Initializing test...
+
+ \ No newline at end of file diff --git a/examples/esphttpd/html/test/test.js b/examples/esphttpd/html/test/test.js new file mode 100644 index 0000000..03c0cd4 --- /dev/null +++ b/examples/esphttpd/html/test/test.js @@ -0,0 +1,205 @@ + +/* +Code to test the webserver. This depends on: +- The cat images being available, for concurrent espfs testing +- the test.cgi script available, for generic data mangling tests + + +This test does a max of 4 requests in parallel. The nonos SDK supports a max of +5 connections; the default libesphttpd setting is 4 sockets at a time. Unfortunately, +the nonos sdk just closes all sockets opened after the available sockets are opened, +instead of queueing them until a socket frees up. +*/ + + +function log(line) { + $("#log").insertAdjacentHTML('beforeend', line+'
'); +} + + +//Load an image multiple times in parallel +function testParLdImg(url, ct, doneFn) { + var im=[]; + var state={"loaded":0, "count":ct, "doneFn": doneFn, "error":false}; + for (var x=0; xthis.ts+2000) { + log("..."+Math.floor(e.loaded*100/this.len).toString()+"%"); + this.ts=Date.now(); + } + }.bind(state); + } + xhr.send(); +} + + +function testUploadCgi(len, doneFn) { + var xhr=j(); + var state={"len":len, "doneFn":doneFn, "ts": Date.now()}; + var data=""; + for (var x=0; x=200 && xhr.status<300) { + var ulen=parseInt(xhr.responseText); + if (ulen==this.len) { + log("Uploaded "+this.len+" bytes successfully."); + this.doneFn(true); + } else { + log("Webserver received "+ulen+" bytes successfully, but sent "+this.len+"!"); + this.doneFn(false); + } + } else if (xhr.readyState==4) { + log("Failed! Error "+xhr.status); + this.doneFn(false); + } + }.bind(state); + //If the webbrowser enables it, show progress. + if (typeof xhr.upload.onprogress != 'undefined') { + xhr.upload.onprogress=function(e) { + if (Date.now()>this.ts+2000) { + log("..."+Math.floor(e.loaded*100/e.total).toString()+"%"); + this.ts=Date.now(); + } + }.bind(state); + } + //Upload the file + xhr.send(data); +} + +function hammerNext(state, xhr) { + if (state.done==state.count) { + state.doneFn(!state.error); + } + if (state.started==state.count) return; + xhr.open("GET", "test.cgi?len="+state.len+"&nocache="+Math.floor(Math.random()*100000).toString()); + xhr.onreadystatechange=function(xhr) { + if (xhr.readyState==4 && xhr.status>=200 && xhr.status<300) { + if (xhr.response.length==this.len) { + state.done++; + hammerNext(this, xhr); + } else { + log("Downloaded "+xhr.response.length+" bytes successfully, but needed "+this.len+"!"); + state.done++; + hammerNext(this, xhr); + } + } else if (xhr.readyState==4) { + log("Failed! Error "+xhr.status); + state.done++; + hammerNext(this, xhr); + } + }.bind(state, xhr); + //If the webbrowser enables it, show progress. + if (typeof xhr.onprogress != 'undefined') { + xhr.onprogress=function(e) { + if (Date.now()>this.ts+2000) { + log("..."+state.done+"/"+state.count); + this.ts=Date.now(); + } + }.bind(state); + } + state.started++; + xhr.send(); +} + +function testHammer(count, par, len, doneFn) { + var state={"count":count, "started":0, "done":0, "par":par, "len":len, "doneFn":doneFn, "ts": Date.now(), "error":false}; + var xhr=[]; + for (var i=0; iSuccess!
"); + successCnt++; + } else { + log("Test failed!"); + } + } + tstState++; + if (tstState==1) { + log("Testing parallel load of espfs files..."); + testParLdImg("../cats/kitten-loves-toy.jpg", 3, nextTest); + } else if (tstState==2) { + log("Testing GET request of 32K..."); + testDownloadCgi(32*1024, nextTest); + } else if (tstState==3) { + log("Testing GET request of 128K..."); + testDownloadCgi(128*1024, nextTest); + } else if (tstState==4) { + log("Testing GET request of 512K..."); + testDownloadCgi(512*1024, nextTest); + } else if (tstState==5) { + log("Testing POST request of 512 bytes..."); + testUploadCgi(512, nextTest); + } else if (tstState==6) { + log("Testing POST request of 16K bytes..."); + testUploadCgi(16*1024, nextTest); + } else if (tstState==7) { + log("Testing POST request of 512K bytes..."); + testUploadCgi(512*1024, nextTest); + } else if (tstState==8) { + log("Hammering webserver with 500 requests of size 512..."); + testHammer(500, 3, 512, nextTest); + } else if (tstState==9) { + log("Hammering webserver with 500 requests of size 2048..."); + testHammer(500, 3, 2048, nextTest); + } else { + log("Tests done! "+successCnt+" out of "+(tstState-1)+" tests were successful."); + } +} + + + +window.onload=function(e) { + log("Starting tests."); + nextTest(false); +} + + + diff --git a/examples/esphttpd/html/websocket/index.html b/examples/esphttpd/html/websocket/index.html new file mode 100644 index 0000000..d7423ec --- /dev/null +++ b/examples/esphttpd/html/websocket/index.html @@ -0,0 +1,69 @@ + + + + +WebSocket Test + + + +

WebSocket Test

+ +
diff --git a/examples/esphttpd/html/wifi/140medley.min.js b/examples/esphttpd/html/wifi/140medley.min.js new file mode 100644 index 0000000..d1495d1 --- /dev/null +++ b/examples/esphttpd/html/wifi/140medley.min.js @@ -0,0 +1,2 @@ +var t=function(a,b){return function(c,d){return a.replace(/#{([^}]*)}/g,function(a,f){return Function("x","with(x)return "+f).call(c,d||b||{})})}},s=function(a,b){return b?{get:function(c){return a[c]&&b.parse(a[c])},set:function(c,d){a[c]=b.stringify(d)}}:{}}(this.localStorage||{},JSON),p=function(a,b,c,d){c=c||document;d=c[b="on"+b];a=c[b]=function(e){d=d&&d(e=e||c.event);return(a=a&&b(e))?b:d};c=this},m=function(a,b,c){b=document;c=b.createElement("p");c.innerHTML=a;for(a=b.createDocumentFragment();b= +c.firstChild;)a.appendChild(b);return a},$=function(a,b){a=a.match(/^(\W)?(.*)/);return(b||document)["getElement"+(a[1]?a[1]=="#"?"ById":"sByClassName":"sByTagName")](a[2])},j=function(a){for(a=0;a<4;a++)try{return a?new ActiveXObject([,"Msxml2","Msxml3","Microsoft"][a]+".XMLHTTP"):new XMLHttpRequest}catch(b){}}; diff --git a/examples/esphttpd/html/wifi/connecting.html b/examples/esphttpd/html/wifi/connecting.html new file mode 100644 index 0000000..12e3a83 --- /dev/null +++ b/examples/esphttpd/html/wifi/connecting.html @@ -0,0 +1,43 @@ +Connecting... + + + + + +
+

Connecting to AP...

+

Status:
+

...
+

+
+ + diff --git a/examples/esphttpd/html/wifi/icons.png b/examples/esphttpd/html/wifi/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..03109e15a4c83edbec901d41b9e1598d151fcaf4 GIT binary patch literal 914 zcmV;D18w|?P)600006VoOIv0RI60 z0RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru-V6j3Di2DDcf0@q10P95 zK~#9!?VK@h(?Ar*pOJ@1NRWXcVn9mSQTY~(1&M{BOO`S+GqenyJHnDBLl>mNRH1$c z1Y$)>B&Hh}0ur-3R7o7$T+XS_x##=+q^hwmZsUL7`}^+RQ$+v(A|_G$$&b$L;~(BA z7vSV`_TMoxOJpz<%eb=$X`p}IY-9PA1b6eV-ew!$V`euZ*vFlI zo%aYBjYg#pIv$VRQg1L6IXOty#JTsNIGz_z*2Y7K0Aq~I=kw*4GsT-15jj6i*VVbnwEVs=*E`z`>CQ_&u(#D(w!8jllKlOqT2&RL|#8# zy?+0#IS=rj>rLPM;<%;=Y1f|XOogKopcwAkc)+KRze>6O{NTDQ^h06aibt{-1y@_2uB zJek@jJCkW9hkHq*5#a5)?sD_nut6lsGVl{Zg=gu`^128lq{0yIbj4*LNra$SP}G)Uk9k$AvP z3n?BNBx(z=vqH*k8YCNVIev0000$*YQ3}3cY6NeJv1r z&5%7omctF9b#JjT0krNd;sJO-B)Q(009~si-~o6*B)MK&0RDjj9uSEK&>uj503Lt< z2!H?p0000G9p2adq3<_%?+*xlzk$V2>;ljq5KFF;0tnDh3eX=we*hj3hX>FfKz{%p o5QhiQA3%Qq9)JJ{fB^Aw4Q_yb2{`v!WiFi connection + + + + + +
+

+Current WiFi mode: %WiFiMode% +

+

+Note: %WiFiapwarn% +

+
+

+To connect to a WiFi network, please select one of the detected networks...
+

Scanning...
+
+WiFi password, if applicable:
+
+ +

+
+ + diff --git a/examples/esphttpd/io.c b/examples/esphttpd/io.c new file mode 100644 index 0000000..c104b9c --- /dev/null +++ b/examples/esphttpd/io.c @@ -0,0 +1,72 @@ + +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * Jeroen Domburg wrote this file. As long as you retain + * this notice you can do whatever you want with this stuff. If we meet some day, + * and you think this stuff is worth it, you can buy me a beer in return. + * ---------------------------------------------------------------------------- + */ + + +#include +//#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define LEDGPIO 2 +#define BTNGPIO 0 + +#ifndef ESP32 +static ETSTimer resetBtntimer; +#endif + +void ioLed(int ena) { +#ifndef ESP32 + //gpio_output_set is overkill. ToDo: use better mactos + if (ena) { + sdk_gpio_output_set((1<=6) { //3 sec pressed + sdk_wifi_station_disconnect(); + sdk_wifi_set_opmode(STATIONAP_MODE); //reset to AP+STA mode + printf("Reset to AP mode. Restarting system...\n"); + sdk_system_restart(); + } + resetCnt=0; + } +} +#endif + + +void ioInit() { +#ifndef ESP32 + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); + PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0); + sdk_gpio_output_set(0, 0, (1< wrote this file. As long as you retain + * this notice you can do whatever you want with this stuff. If we meet some day, + * and you think this stuff is worth it, you can buy me a beer in return. + * ---------------------------------------------------------------------------- + */ + +/* +This is example code for the esphttpd library. It's a small-ish demo showing off +the server, including WiFi connection management capabilities, some IO and +some pictures of cats. +*/ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "io.h" +#include "cgi.h" +#include "cgi-test.h" + +#define AP_SSID "esp-open-rtos AP" +#define AP_PSK "esp-open-rtos" + +//Function that tells the authentication system what users/passwords live on the system. +//This is disabled in the default build; if you want to try it, enable the authBasic line in +//the builtInUrls below. +int myPassFn(HttpdConnData *connData, int no, char *user, int userLen, char *pass, int passLen) { + if (no==0) { + strcpy(user, "admin"); + strcpy(pass, "s3cr3t"); + return 1; +//Add more users this way. Check against incrementing no for each user added. +// } else if (no==1) { +// strcpy(user, "user1"); +// strcpy(pass, "something"); +// return 1; + } + return 0; +} + + +static ETSTimer websockTimer; + +//Broadcast the uptime in seconds every second over connected websockets +static void websocketBcast(void *arg) { + static int ctr=0; + char buff[128]; + while(1) { + ctr++; + sprintf(buff, "Up for %d minutes %d seconds!\n", ctr/60, ctr%60); + cgiWebsockBroadcast("/websocket/ws.cgi", buff, strlen(buff), WEBSOCK_FLAG_NONE); + vTaskDelay(1000/portTICK_PERIOD_MS); + } +} + +//On reception of a message, send "You sent: " plus whatever the other side sent +static void myWebsocketRecv(Websock *ws, char *data, int len, int flags) { + int i; + char buff[128]; + sprintf(buff, "You sent: "); + for (i=0; irecvCb=myWebsocketRecv; + cgiWebsocketSend(ws, "Hi, Websocket!", 14, WEBSOCK_FLAG_NONE); +} + +//On reception of a message, echo it back verbatim +void myEchoWebsocketRecv(Websock *ws, char *data, int len, int flags) { + printf("EchoWs: echo, len=%d\n", len); + cgiWebsocketSend(ws, data, len, flags); +} + +//Echo websocket connected. Install reception handler. +void myEchoWebsocketConnect(Websock *ws) { + printf("EchoWs: connect\n"); + ws->recvCb=myEchoWebsocketRecv; +} + +CgiUploadFlashDef uploadParams={ + .type=CGIFLASH_TYPE_FW, + .fw1Pos=0x2000, + .fw2Pos=((FLASH_SIZE*1024*1024)/2)+0x2000, + .fwSize=((FLASH_SIZE*1024*1024)/2)-0x2000, + .tagName=LIBESPHTTPD_OTA_TAGNAME +}; + + +/* +This is the main url->function dispatching data struct. +In short, it's a struct with various URLs plus their handlers. The handlers can +be 'standard' CGI functions you wrote, or 'special' CGIs requiring an argument. +They can also be auth-functions. An asterisk will match any url starting with +everything before the asterisks; "*" matches everything. The list will be +handled top-down, so make sure to put more specific rules above the more +general ones. Authorization things (like authBasic) act as a 'barrier' and +should be placed above the URLs they protect. +*/ +HttpdBuiltInUrl builtInUrls[]={ + {"*", cgiRedirectApClientToHostname, "esp8266.nonet"}, + {"/", cgiRedirect, "/index.tpl"}, + {"/led.tpl", cgiEspFsTemplate, tplLed}, + {"/index.tpl", cgiEspFsTemplate, tplCounter}, + {"/led.cgi", cgiLed, NULL}, +#ifndef ESP32 + {"/flash/", cgiRedirect, "/flash/index.html"}, + {"/flash/next", cgiGetFirmwareNext, &uploadParams}, + {"/flash/upload", cgiUploadFirmware, &uploadParams}, + {"/flash/reboot", cgiRebootFirmware, NULL}, +#endif + //Routines to make the /wifi URL and everything beneath it work. + +//Enable the line below to protect the WiFi configuration with an username/password combo. +// {"/wifi/*", authBasic, myPassFn}, + + {"/wifi", cgiRedirect, "/wifi/wifi.tpl"}, + {"/wifi/", cgiRedirect, "/wifi/wifi.tpl"}, + {"/wifi/wifiscan.cgi", cgiWiFiScan, NULL}, + {"/wifi/wifi.tpl", cgiEspFsTemplate, tplWlan}, + {"/wifi/connect.cgi", cgiWiFiConnect, NULL}, + {"/wifi/connstatus.cgi", cgiWiFiConnStatus, NULL}, + {"/wifi/setmode.cgi", cgiWiFiSetMode, NULL}, + + {"/websocket/ws.cgi", cgiWebsocket, myWebsocketConnect}, + {"/websocket/echo.cgi", cgiWebsocket, myEchoWebsocketConnect}, + + {"/test", cgiRedirect, "/test/index.html"}, + {"/test/", cgiRedirect, "/test/index.html"}, + {"/test/test.cgi", cgiTestbed, NULL}, + + {"*", cgiEspFsHook, NULL}, //Catch-all cgi function for the filesystem + {NULL, NULL, NULL} +}; + +void wifiInit() { + struct ip_info ap_ip; + uint8_t sdk_wifi_get_opmode(); + switch(sdk_wifi_get_opmode()) { + case STATIONAP_MODE: + case SOFTAP_MODE: + IP4_ADDR(&ap_ip.ip, 172, 16, 0, 1); + IP4_ADDR(&ap_ip.gw, 0, 0, 0, 0); + IP4_ADDR(&ap_ip.netmask, 255, 255, 0, 0); + sdk_wifi_set_ip_info(1, &ap_ip); + + struct sdk_softap_config ap_config = { + .ssid = AP_SSID, + .ssid_hidden = 0, + .channel = 3, + .ssid_len = strlen(AP_SSID), + .authmode = AUTH_WPA_WPA2_PSK, + .password = AP_PSK, + .max_connection = 3, + .beacon_interval = 100, + }; + sdk_wifi_softap_set_config(&ap_config); + + ip_addr_t first_client_ip; + IP4_ADDR(&first_client_ip, 172, 16, 0, 2); + dhcpserver_start(&first_client_ip, 4); + dhcpserver_set_dns(&ap_ip.ip); + dhcpserver_set_router(&ap_ip.ip); + break; + case STATION_MODE: + break; + default: + break; + } +} + +//Main routine. Initialize stdout, the I/O, filesystem and the webserver and we're done. +void user_init(void) { + uart_set_baud(0, 115200); + + wifiInit(); + ioInit(); + captdnsInit(); + + espFsInit((void*)(_binary_build_web_espfs_bin_start)); + httpdInit(builtInUrls, 80); + + xTaskCreate(websocketBcast, "wsbcast", 300, NULL, 3, NULL); + + printf("\nReady\n"); +} diff --git a/extras/libesphttpd/component.mk b/extras/libesphttpd/component.mk new file mode 100644 index 0000000..22e433e --- /dev/null +++ b/extras/libesphttpd/component.mk @@ -0,0 +1,64 @@ +# Component makefile for extras/libesphttpd + +INC_DIRS += $(libesphttpd_ROOT)/libesphttpd/include $(libesphttpd_ROOT)/libesphttpd/espfs $(libesphttpd_ROOT)/libesphttpd/lib/heatshrink + +LIBESPHTTPD_MAX_CONNECTIONS ?= 4 +LIBESPHTTPD_STACKSIZE ?= 2048 +LIBESPHTTPD_OTA_TAGNAME ?= generic + +RBOOT_OTA ?= 1 +ESP_IP ?= 192.168.4.1 + +# args for passing into compile rule generation +libesphttpd_SRC_DIR = $(libesphttpd_ROOT)/libesphttpd/core $(libesphttpd_ROOT)/libesphttpd/espfs $(libesphttpd_ROOT)/libesphttpd/util +libesphttpd_CFLAGS += -DFREERTOS -DUSE_OPEN_SDK -DHTTPD_MAX_CONNECTIONS=$(LIBESPHTTPD_MAX_CONNECTIONS) -DHTTPD_STACKSIZE=$(LIBESPHTTPD_STACKSIZE) -DESPFS_HEATSHRINK -D__ets__ -DRBOOT_OTA=1 -std=gnu99 + +$(eval $(call component_compile_rules,libesphttpd)) + +rwildcard = $(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2)) + +LIBESPHTTPD_MKESPFSIMAGE_DIR = $(BUILD_DIR)mkespfsimage + +LIBESPHTTPD_MKESPFS = $(LIBESPHTTPD_MKESPFSIMAGE_DIR)/mkespfsimage +LIBESPHTTPD_HTML_DIR = html +LIBESPHTTPD_HTML_FILES = $(call rwildcard,$(LIBESPHTTPD_HTML_DIR),*) +LIBESPHTTPD_HTML_TINY_DIR = $(BUILD_DIR)html +LIBESPHTTPD_HTML_ESPFS = $(BUILD_DIR)web.espfs.bin +LIBESPHTTPD_HTML_ESPFS_PATH = $(PROGRAM_REAL_ROOT)/$(LIBESPHTTPD_HTML_ESPFS) +LIBESPHTTPD_HTML_ESPFS_OBJ = $(BUILD_DIR)web.espfs.o + +CROSS_BINARY_ARCH ?= xtensa +CROSS_OUTPUT_TARGET ?= elf32-xtensa-le + +LIBESPHTTPD_HTML_TINY ?= no + +CURL = curl +LIBESPHTTPD_CURL_OPTS = --connect-timeout 3 --max-time 60 -s + +$(LIBESPHTTPD_MKESPFSIMAGE_DIR): + $(Q)mkdir -p $(LIBESPHTTPD_MKESPFSIMAGE_DIR) + +$(PROGRAM_REAL_ROOT)/$(LIBESPHTTPD_MKESPFS): $(LIBESPHTTPD_MKESPFSIMAGE_DIR) + make -C $(libesphttpd_ROOT)/libesphttpd/espfs/mkespfsimage CC=gcc GZIP_COMPRESSION=yes USE_HEATSHRINK=yes BUILD_DIR=$(PROGRAM_REAL_ROOT)/$(BUILD_DIR) + +$(LIBESPHTTPD_HTML_ESPFS): $(PROGRAM_REAL_ROOT)/$(LIBESPHTTPD_MKESPFS) $(LIBESPHTTPD_HTML_FILES) + cd $(LIBESPHTTPD_HTML_DIR) && find . | $< > $(LIBESPHTTPD_HTML_ESPFS_PATH) || rm -f $(LIBESPHTTPD_HTML_ESPFS_PATH) + +$(LIBESPHTTPD_HTML_ESPFS_OBJ): $(LIBESPHTTPD_HTML_ESPFS) + $(Q)$(OBJCOPY) -I binary -O $(CROSS_OUTPUT_TARGET) -B $(CROSS_BINARY_ARCH) --rename-section .data=.irom.espfs $^ $@ + +$(BUILD_DIR)libesphttpd.a: $(LIBESPHTTPD_HTML_ESPFS_OBJ) + +htmlfs: $(LIBESPHTTPD_HTML_ESPFS_OBJ) + +$(libesphttpd_ROOT)/libesphttpd/mkupgimg/mkupgimg: + make -C $(libesphttpd_ROOT)/libesphttpd/mkupgimg CC=gcc RBOOT_OTA=$(RBOOT_OTA) + +$(FIRMWARE_DIR)ota_$(PROGRAM).bin: $(FW_FILE) $(libesphttpd_ROOT)/libesphttpd/mkupgimg/mkupgimg + $(libesphttpd_ROOT)/libesphttpd/mkupgimg/mkupgimg $(FW_FILE) "$(LIBESPHTTPD_OTA_TAGNAME)" $(FIRMWARE_DIR)ota_$(PROGRAM).bin + +ota: $(FIRMWARE_DIR)ota_$(PROGRAM).bin $(libesphttpd_ROOT)/libesphttpd/mkupgimg/mkupgimg + +webflash: $(FIRMWARE_DIR)ota_$(PROGRAM).bin + $(CURL) $(LIBESPHTTPD_CURL_OPTS) --data-binary "@$(FIRMWARE_DIR)ota_$(PROGRAM).bin" http://$(ESP_IP)/flash/upload && $(CURL) $(LIBESPHTTPD_CURL_OPTS) http://$(ESP_IP)/flash/reboot + diff --git a/extras/libesphttpd/libesphttpd b/extras/libesphttpd/libesphttpd new file mode 160000 index 0000000..c329aee --- /dev/null +++ b/extras/libesphttpd/libesphttpd @@ -0,0 +1 @@ +Subproject commit c329aeef0469a40152e1630dbd0f0b34bcebd4d5