parent
082d5e7cc0
commit
5a0ee0ad4a
@ -0,0 +1,21 @@ |
||||
The MIT License (MIT) |
||||
|
||||
Copyright (c) 2016 Ondřej Hruška |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
of this software and associated documentation files (the "Software"), to deal |
||||
in the Software without restriction, including without limitation the rights |
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
copies of the Software, and to permit persons to whom the Software is |
||||
furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included in all |
||||
copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
SOFTWARE. |
@ -1,96 +1,12 @@ |
||||
# esp-httpd README # |
||||
Appliance Health Monitor / Current Analyzer |
||||
=========================================== |
||||
|
||||
This is the demonstration project for the small but powerful libesphttpd webserver |
||||
for ESP8266(EX) chips. It is an example of how to make a module that can have |
||||
the AP it connects to configured over a webbrowser. It also illustrates multiple |
||||
flash layouts and some OTA update functionality. |
||||
Ondřej Hruška, 2016 |
||||
|
||||
## ABOUT THE WEBSERVER ## |
||||
Project based on ESP8266 IoT SDK, libesphttpd and esphttpclient. |
||||
|
||||
The Good (aka: what's awesome) |
||||
- Supports multiple connections, for eg simultaneous html/css/js/images downloading |
||||
- Static files stored in flash, in an (optionally compressed) RO filesystem |
||||
- Pluggable using external cgi routines |
||||
- Simple template engine for mixed c and html things |
||||
- Usable as an embedded library - should be easy to drop into your existing projects |
||||
- Includes websocket support |
||||
|
||||
The Bad (aka: what can be improved) |
||||
- Not built for speediness, although it's reasonable fast. |
||||
- Built according to what I remember of the HTTP protocol, not according to the |
||||
RFCs. Should work with most modern browsers, though. |
||||
- No support for https. |
||||
|
||||
The Ugly (aka: bugs, misbehaviour) |
||||
- Possible buffer overflows (usually not remotely exploitable) due to no os_snprintf |
||||
This can be theoretically remedied by either Espressif including an os_snprintf in |
||||
their libs or by using some alternate printf lib, like elm-chans xprintf |
||||
|
||||
## SOURCE OF THIS CODE ## |
||||
The official esphttpd repo lives at http://git.spritesserver.nl/esphttpd.git/ and |
||||
http://git.spritesserver.nl/libesphttpd.git/ . If you're a fan of Github, you can also |
||||
peruse the official mirror at https://github.com/Spritetm/esphttpd and https://github.com/Spritetm/libesphttpd . If |
||||
you want to discuss this code, there is a subforum at esp8266.com: http://www.esp8266.com/viewforum.php?f=34 . |
||||
|
||||
|
||||
## ABOUT THE EXAMPLE ## |
||||
|
||||
When you flash the example into an ESP8266(EX) module, you get a small webserver with a few example |
||||
pages. If you've already connected your module to your WLAN before, it'll keep those settings. When |
||||
you haven't or the settings are wrong, keep GPIO0 for >5 seconds. The module will reboot into |
||||
its STA+AP mode. Connect a computer to the newly formed access point and browse to |
||||
http://192.168.4.1/wifi in order to connect the module to your WiFi network. The example also |
||||
allows you to control a LED that's connected to GPIO2. |
||||
|
||||
## BUILDING EVERYTHING ## |
||||
|
||||
For this, you need an environment that can compile ESP8266 firmware. Environments for this still |
||||
are in flux at the moment, but I'm using esp-open-sdk: https://github.com/pfalcon/esp-open-sdk . |
||||
You probably also need an UNIX-like system; I'm working on Debian Linux myself. |
||||
|
||||
To manage the paths to all this, you can source a small shell fragment into your current session. For |
||||
example, I source a file with these contents: |
||||
|
||||
export PATH=${PWD}/esp-open-sdk/xtensa-lx106-elf/bin:$PATH |
||||
export SDK_BASE=${PWD}/esp-open-sdk/sdk |
||||
export ESPTOOL=${PWD}/esptool/esptool.py |
||||
export ESPPORT=/dev/ttyUSB0 |
||||
export ESPBAUD=460800 |
||||
|
||||
Actual setup of the SDK and toolchain is out of the scope of this document, so I hope this helps you |
||||
enough to set up your own if you haven't already. |
||||
|
||||
If you have that, you can clone out the source code: |
||||
git clone http://git.spritesserver.nl/esphttpd.git/ |
||||
|
||||
This project makes use of heatshrink, which is a git submodule. To fetch the code: |
||||
|
||||
cd esphttpd |
||||
git submodule init |
||||
git submodule update |
||||
|
||||
Now, build the code: |
||||
|
||||
make |
||||
|
||||
Depending on the way you built it, esp-open-sdk sometimes patches Espressifs SDK, needing a slightly different |
||||
compiling process. If this is needed, you will get errors during compiling complaining about uint8_t being |
||||
undeclared. If this happens, try building like this: |
||||
|
||||
make USE_OPENSDK=yes |
||||
|
||||
You can also edit the Makefile to change this more permanently. |
||||
|
||||
After the compile process, flash the code happens in 2 steps. First the code itself gets flashed. Reset the module into bootloader |
||||
mode and enter 'make flash'. |
||||
|
||||
The 2nd step is to pack the static files the webserver will serve and flash that. Reset the module into |
||||
bootloader mode again and enter `make htmlflash`. |
||||
|
||||
You should have a working webserver now. |
||||
|
||||
## WRITING CODE FOR THE WEBSERVER ## |
||||
|
||||
Please see the README.md of the libesphttpd project for the programming manual. |
||||
Website in `html_src/` is compiled to `html/` static files using the `web-build.sh` script. |
||||
|
||||
You need Linux to work with this project. |
||||
|
||||
Make sure you have **esp-open-sdk** installed and the Xtensa GCC is in your $PATH. |
||||
|
@ -0,0 +1,9 @@ |
||||
---------------------------------------------------------------------------- |
||||
"THE BEER-WARE LICENSE" (Revision 42): |
||||
Martin d'Allens <martin.dallens@gmail.com> 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. |
||||
---------------------------------------------------------------------------- |
||||
|
||||
Upstream: https://github.com/Caerbannog/esphttpclient |
||||
|
@ -1,90 +0,0 @@ |
||||
/*
|
||||
* ---------------------------------------------------------------------------- |
||||
* "THE BEER-WARE LICENSE" (Revision 42): |
||||
* Martin d'Allens <martin.dallens@gmail.com> 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 <esp8266.h> |
||||
#include "httpclient.h" |
||||
|
||||
|
||||
static int test_count = 0; |
||||
static ETSTimer test_timer; |
||||
|
||||
static void ICACHE_FLASH_ATTR test_timer_cb() |
||||
{ |
||||
dbg("\nTEST %d ", test_count); |
||||
|
||||
switch(test_count) { |
||||
case 0: |
||||
dbg("=> IP address before network ready\n"); |
||||
http_get("http://173.194.45.65", "", http_callback_example); |
||||
// This test will fail. The DHCP request returns directly, but the TCP connection hangs.
|
||||
// FIXME: wait for network to be ready before connecting?
|
||||
break; |
||||
case 1: |
||||
dbg("=> Simple GET\n"); |
||||
http_get("http://wtfismyip.com/text", "", http_callback_example); |
||||
break; |
||||
case 2: |
||||
dbg("=> Response too long\n"); |
||||
http_get("http://www.wikipedia.org/", "", http_callback_example); |
||||
break; |
||||
case 3: |
||||
dbg("=> Connection refused\n"); |
||||
http_get("http://att.com:1234/", "", http_callback_example); |
||||
break; |
||||
case 4: |
||||
dbg("=> Empty response, wrong protocol\n"); |
||||
http_get("http://google.com:443/", "", http_callback_example); |
||||
break; |
||||
case 5: |
||||
dbg("=> Invalid DNS\n"); |
||||
http_get("http://invalid.dns/", "", http_callback_example); |
||||
break; |
||||
case 6: |
||||
dbg("=> Connection time out\n"); |
||||
http_get("http://google.com:1234/", "", http_callback_example); |
||||
break; |
||||
case 7: |
||||
dbg("=> Simple POST\n"); |
||||
http_post("http://httpbin.org/post", "first_word=hello&second_word=world", "Content-Type: application/x-www-form-urlencoded\r\n", http_callback_example); |
||||
break; |
||||
case 8: |
||||
dbg("=> Moved\n"); |
||||
http_get("http://wikipedia.org/", "", http_callback_example); |
||||
break; |
||||
case 9: |
||||
dbg("=> IP address, 404\n"); |
||||
http_get("http://54.200.182.206/", "", http_callback_example); |
||||
break; |
||||
case 10: |
||||
dbg("=> Concurrent requests\n"); |
||||
http_get("http://wtfismyip.com/text", "", http_callback_example); |
||||
http_post("http://httpbin.org/post", "first_word=hello&second_word=world", "Content-Type: application/x-www-form-urlencoded\r\n", http_callback_example); |
||||
http_get("http://wtfismyip.com/text", "", http_callback_example); |
||||
http_post("http://httpbin.org/post", "first_word=hello&second_word=world", "Content-Type: application/x-www-form-urlencoded\r\n", http_callback_example); |
||||
http_get("http://wtfismyip.com/text", "", http_callback_example); |
||||
http_post("http://httpbin.org/post", "first_word=hello&second_word=world", "Content-Type: application/x-www-form-urlencoded\r\n", http_callback_example); |
||||
http_get("http://wtfismyip.com/text", "", http_callback_example); |
||||
// FIXME: this test sometimes fails with "DNS error code -1"
|
||||
break; |
||||
default: |
||||
dbg("=> DONE\n"); |
||||
return; |
||||
} |
||||
test_count++; |
||||
os_timer_arm(&test_timer, 3000, 0); |
||||
} |
||||
|
||||
void ICACHE_FLASH_ATTR http_test() |
||||
{ |
||||
// FIXME: what happens when no Wifi network is available?
|
||||
|
||||
os_timer_disarm(&test_timer); |
||||
os_timer_setfn(&test_timer, test_timer_cb, NULL); |
||||
os_timer_arm(&test_timer, 0, 0); // Start immediately.
|
||||
} |
@ -0,0 +1,96 @@ |
||||
# esp-httpd README # |
||||
|
||||
This is the demonstration project for the small but powerful libesphttpd webserver |
||||
for ESP8266(EX) chips. It is an example of how to make a module that can have |
||||
the AP it connects to configured over a webbrowser. It also illustrates multiple |
||||
flash layouts and some OTA update functionality. |
||||
|
||||
## ABOUT THE WEBSERVER ## |
||||
|
||||
The Good (aka: what's awesome) |
||||
- Supports multiple connections, for eg simultaneous html/css/js/images downloading |
||||
- Static files stored in flash, in an (optionally compressed) RO filesystem |
||||
- Pluggable using external cgi routines |
||||
- Simple template engine for mixed c and html things |
||||
- Usable as an embedded library - should be easy to drop into your existing projects |
||||
- Includes websocket support |
||||
|
||||
The Bad (aka: what can be improved) |
||||
- Not built for speediness, although it's reasonable fast. |
||||
- Built according to what I remember of the HTTP protocol, not according to the |
||||
RFCs. Should work with most modern browsers, though. |
||||
- No support for https. |
||||
|
||||
The Ugly (aka: bugs, misbehaviour) |
||||
- Possible buffer overflows (usually not remotely exploitable) due to no os_snprintf |
||||
This can be theoretically remedied by either Espressif including an os_snprintf in |
||||
their libs or by using some alternate printf lib, like elm-chans xprintf |
||||
|
||||
## SOURCE OF THIS CODE ## |
||||
The official esphttpd repo lives at http://git.spritesserver.nl/esphttpd.git/ and |
||||
http://git.spritesserver.nl/libesphttpd.git/ . If you're a fan of Github, you can also |
||||
peruse the official mirror at https://github.com/Spritetm/esphttpd and https://github.com/Spritetm/libesphttpd . If |
||||
you want to discuss this code, there is a subforum at esp8266.com: http://www.esp8266.com/viewforum.php?f=34 . |
||||
|
||||
|
||||
## ABOUT THE EXAMPLE ## |
||||
|
||||
When you flash the example into an ESP8266(EX) module, you get a small webserver with a few example |
||||
pages. If you've already connected your module to your WLAN before, it'll keep those settings. When |
||||
you haven't or the settings are wrong, keep GPIO0 for >5 seconds. The module will reboot into |
||||
its STA+AP mode. Connect a computer to the newly formed access point and browse to |
||||
http://192.168.4.1/wifi in order to connect the module to your WiFi network. The example also |
||||
allows you to control a LED that's connected to GPIO2. |
||||
|
||||
## BUILDING EVERYTHING ## |
||||
|
||||
For this, you need an environment that can compile ESP8266 firmware. Environments for this still |
||||
are in flux at the moment, but I'm using esp-open-sdk: https://github.com/pfalcon/esp-open-sdk . |
||||
You probably also need an UNIX-like system; I'm working on Debian Linux myself. |
||||
|
||||
To manage the paths to all this, you can source a small shell fragment into your current session. For |
||||
example, I source a file with these contents: |
||||
|
||||
export PATH=${PWD}/esp-open-sdk/xtensa-lx106-elf/bin:$PATH |
||||
export SDK_BASE=${PWD}/esp-open-sdk/sdk |
||||
export ESPTOOL=${PWD}/esptool/esptool.py |
||||
export ESPPORT=/dev/ttyUSB0 |
||||
export ESPBAUD=460800 |
||||
|
||||
Actual setup of the SDK and toolchain is out of the scope of this document, so I hope this helps you |
||||
enough to set up your own if you haven't already. |
||||
|
||||
If you have that, you can clone out the source code: |
||||
git clone http://git.spritesserver.nl/esphttpd.git/ |
||||
|
||||
This project makes use of heatshrink, which is a git submodule. To fetch the code: |
||||
|
||||
cd esphttpd |
||||
git submodule init |
||||
git submodule update |
||||
|
||||
Now, build the code: |
||||
|
||||
make |
||||
|
||||
Depending on the way you built it, esp-open-sdk sometimes patches Espressifs SDK, needing a slightly different |
||||
compiling process. If this is needed, you will get errors during compiling complaining about uint8_t being |
||||
undeclared. If this happens, try building like this: |
||||
|
||||
make USE_OPENSDK=yes |
||||
|
||||
You can also edit the Makefile to change this more permanently. |
||||
|
||||
After the compile process, flash the code happens in 2 steps. First the code itself gets flashed. Reset the module into bootloader |
||||
mode and enter 'make flash'. |
||||
|
||||
The 2nd step is to pack the static files the webserver will serve and flash that. Reset the module into |
||||
bootloader mode again and enter `make htmlflash`. |
||||
|
||||
You should have a working webserver now. |
||||
|
||||
## WRITING CODE FOR THE WEBSERVER ## |
||||
|
||||
Please see the README.md of the libesphttpd project for the programming manual. |
||||
|
||||
|
@ -0,0 +1,11 @@ |
||||
---------------------------------------------------------------------------- |
||||
"THE BEER-WARE LICENSE" (Revision 42): |
||||
Jeroen Domburg <jeroen@spritesmods.com> 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. |
||||
---------------------------------------------------------------------------- |
||||
|
||||
Upstream: https://github.com/Spritetm/libesphttpd |
||||
|
||||
Code heavily modified by Ondřej Hruška <ondra@ondrovo.com>. |
||||
Improvements will (possibly) be offered for merge later. |
Loading…
Reference in new issue