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