/*-------------------------------------------------- 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 const char* ssid = "LeWe-mobil"; const char* password = "XXXXXXXXX"; 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) { 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 it /////////////////////////////////////////////////////////////////////////////// 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="404 Not Found

Not Found

The requested URL was not found on this server.

"; sHeader = "HTTP/1.1 404 Not found\r\n"; sHeader += "Content-Length: "; sHeader += sResponse.length(); sHeader += "\r\n"; sHeader += "Content-Type: text/html\r\n"; sHeader += "Connection: close\r\n"; sHeader += "\r\n"; } /////////////////////// // format the html page /////////////////////// else { ulReqcount++; sResponse = "Demo für ESP8266 Steuerung"; sResponse += ""; sResponse += ""; sResponse += "

Demo für ESP8266 Steuerung

"; sResponse += "Funktion 1 schaltet GPIO2 und erzeugt eine serielle Ausgabe.
"; sResponse += "Funktion 2 erzeugt nur eine serielle Ausgabe.
"; sResponse += ""; sResponse += "

Funktion 1  

"; sResponse += "

Funktion 2  

"; ////////////////////// // react on parameters ////////////////////// if (sCmd.length()>0) { // write received command to html page sResponse += "Kommando:" + sCmd + "
"; // switch GPIO if(sCmd.indexOf("FUNCTION1ON")>=0) { digitalWrite(2, 1); } else if(sCmd.indexOf("FUNCTION1OFF")>=0) { digitalWrite(2, 0); } } sResponse += ""; sResponse += "
Aufrufzähler="; sResponse += ulReqcount; sResponse += " - Verbindungszähler="; sResponse += ulReconncount; sResponse += "
"; sResponse += "Stefan Thesen 04/2015
"; sResponse += ""; sHeader = "HTTP/1.1 200 OK\r\n"; sHeader += "Content-Length: "; sHeader += sResponse.length(); sHeader += "\r\n"; sHeader += "Content-Type: text/html\r\n"; sHeader += "Connection: close\r\n"; sHeader += "\r\n"; } // Send the response to the client client.print(sHeader); client.print(sResponse); // and stop the client client.stop(); Serial.println("Client disonnected"); }