0% found this document useful (0 votes)
156 views

ESP Webserver HTTP

This document describes an HTTP 1.1 web server for ESP8266 that runs stably and handles requests correctly. It allows switching between two functions - one that toggles an GPIO pin and outputs to serial, and one that just outputs to serial. The server code includes WiFi connection, handling client requests, and responding with HTML pages that can trigger the functions.

Uploaded by

Chris Toph
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
156 views

ESP Webserver HTTP

This document describes an HTTP 1.1 web server for ESP8266 that runs stably and handles requests correctly. It allows switching between two functions - one that toggles an GPIO pin and outputs to serial, and one that just outputs to serial. The server code includes WiFi connection, handling client requests, and responding with HTML pages that can trigger the functions.

Uploaded by

Chris Toph
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 5

/*-------------------------------------------------HTTP 1.

1 Webserver for ESP8266


for ESP8266 adapted Arduino IDE
Stefan Thesen 04/2015
Running stable for days
(in difference to all samples I tried)
Does HTTP 1.1 with defined connection closing.
Reconnects in case of lost WiFi.
Handles empty requests in a defined manner.
Handle requests for non-exisiting pages correctly.
This demo allows to switch two functions:
Function 1 creates serial output and toggels GPIO2
Function 2 just creates serial output.
Serial output can e.g. be used to steer an attached
Arduino, Raspberry etc.
--------------------------------------------------*/
#include <ESP8266WiFi.h>
const char* ssid = "SSID_OF_YOUR_NETWORK_HERE";
const char* password = "WIFI_PASSWORD_GOES_HERE";
unsigned long ulReqcount;
unsigned long ulReconncount;
// Create an instance of the server on Port 80
WiFiServer server(80);
void setup()
{
// setup globals
ulReqcount=0;
ulReconncount=0;
// prepare GPIO2
pinMode(2, OUTPUT);
digitalWrite(2, 0);
// start serial
Serial.begin(9600);
delay(1);
// inital connect
WiFi.mode(WIFI_STA);
WiFiStart();
}
void WiFiStart()
{
ulReconncount++;
// Connect to WiFi network
Serial.println();
Serial.println();

Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.println(WiFi.localIP());
}
void loop()
{
// check if WLAN is connected
if (WiFi.status() != WL_CONNECTED)
{
WiFiStart();
}
// Check if a client has connected
WiFiClient client = server.available();
if (!client)
{
return;
}
// Wait until the client sends some data
Serial.println("new client");
unsigned long ultimeout = millis()+250;
while(!client.available() && (millis()<ultimeout) )
{
delay(1);
}
if(millis()>ultimeout)
{
Serial.println("client connection time-out!");
return;
}
// Read the first line of the request
String sRequest = client.readStringUntil('\r');
//Serial.println(sRequest);
client.flush();
// stop client, if request is empty
if(sRequest=="")
{
Serial.println("empty request! - stopping client");
client.stop();
return;
}

// get path; end of path is either space or ?


// Syntax is e.g. GET /?pin=MOTOR1STOP HTTP/1.1
String sPath="",sParam="", sCmd="";
String sGetstart="GET ";
int iStart,iEndSpace,iEndQuest;
iStart = sRequest.indexOf(sGetstart);
if (iStart>=0)
{
iStart+=+sGetstart.length();
iEndSpace = sRequest.indexOf(" ",iStart);
iEndQuest = sRequest.indexOf("?",iStart);
// are there parameters?
if(iEndSpace>0)
{
if(iEndQuest>0)
{
// there are parameters
sPath = sRequest.substring(iStart,iEndQuest);
sParam = sRequest.substring(iEndQuest,iEndSpace);
}
else
{
// NO parameters
sPath = sRequest.substring(iStart,iEndSpace);
}
}
}
//////////////////////////////////////////////////////////////////////////////
/
// output parameters to serial, you may connect e.g. an Arduino and react on i
t
//////////////////////////////////////////////////////////////////////////////
/
if(sParam.length()>0)
{
int iEqu=sParam.indexOf("=");
if(iEqu>=0)
{
sCmd = sParam.substring(iEqu+1,sParam.length());
Serial.println(sCmd);
}
}
///////////////////////////
// format the html response
///////////////////////////
String sResponse,sHeader;
////////////////////////////
// 404 for non-matching path
////////////////////////////
if(sPath!="/")
{
sResponse="<html><head><title>404 Not Found</title></head><body><h1>Not Foun
d</h1><p>The requested URL was not found on this server.</p></body></html>";

sHeader
sHeader
sHeader
sHeader
sHeader
sHeader
sHeader

=
+=
+=
+=
+=
+=
+=

"HTTP/1.1 404 Not found\r\n";


"Content-Length: ";
sResponse.length();
"\r\n";
"Content-Type: text/html\r\n";
"Connection: close\r\n";
"\r\n";

}
///////////////////////
// format the html page
///////////////////////
else
{
ulReqcount++;
sResponse = "<html><head><title>Demo f&uumlr ESP8266 Steuerung</title></hea
d><body>";
sResponse += "<font color=\"#000000\"><body bgcolor=\"#d0d0f0\">";
sResponse += "<meta name=\"viewport\" content=\"width=device-width, initialscale=1.0, user-scalable=yes\">";
sResponse += "<h1>Demo f&uumlr ESP8266 Steuerung</h1>";
sResponse += "Funktion 1 schaltet GPIO2 und erzeugt eine serielle Ausgabe.<B
R>";
sResponse += "Funktion 2 erzeugt nur eine serielle Ausgabe.<BR>";
sResponse += "<FONT SIZE=+1>";
sResponse += "<p>Funktion 1 <a href=\"?pin=FUNCTION1ON\"><button>einschalten
</button></a>&nbsp;<a href=\"?pin=FUNCTION1OFF\"><button>ausschalten</button></a
></p>";
sResponse += "<p>Funktion 2 <a href=\"?pin=FUNCTION2ON\"><button>einschalten
</button></a>&nbsp;<a href=\"?pin=FUNCTION2OFF\"><button>ausschalten</button></a
></p>";
//////////////////////
// react on parameters
//////////////////////
if (sCmd.length()>0)
{
// write received command to html page
sResponse += "Kommando:" + sCmd + "<BR>";
// switch GPIO
if(sCmd.indexOf("FUNCTION1ON")>=0)
{
digitalWrite(2, 1);
}
else if(sCmd.indexOf("FUNCTION1OFF")>=0)
{
digitalWrite(2, 0);
}
}
sResponse
sResponse
sResponse
sResponse
sResponse
sResponse
sResponse
sResponse

+=
+=
+=
+=
+=
+=
+=
+=

"<FONT SIZE=-2>";
"<BR>Aufrufz&auml;hler=";
ulReqcount;
" - Verbindungsz&auml;hler=";
ulReconncount;
"<BR>";
"Stefan Thesen 04/2015<BR>";
"</body></html>";

sHeader = "HTTP/1.1 200 OK\r\n";

sHeader
sHeader
sHeader
sHeader
sHeader
sHeader

+=
+=
+=
+=
+=
+=

"Content-Length: ";
sResponse.length();
"\r\n";
"Content-Type: text/html\r\n";
"Connection: close\r\n";
"\r\n";

}
// Send the response to the client
client.print(sHeader);
client.print(sResponse);
// and stop the client
client.stop();
Serial.println("Client disonnected");
}

You might also like