Clinton Lee Taylor / Mbed 2 deprecated WiFiLamp

Dependencies:   ESP8266_WebServer mbed

Fork of WiFiLamp by Sebastian Schocke

Committer:
sschocke
Date:
Thu Dec 18 16:06:10 2014 +0000
Revision:
7:f15c81074400
Parent:
5:42c6f9d916bc
Child:
9:319aeb6e0123
Moved all current WebServer functionality to ESP8266_WebServer class

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sschocke 5:42c6f9d916bc 1 #include "ESP8266_WebServer.h"
sschocke 7:f15c81074400 2 #include <string>
sschocke 7:f15c81074400 3
sschocke 7:f15c81074400 4 ESP8266_WebServer::ESP8266_WebServer(Serial *espUART) {
sschocke 7:f15c81074400 5 serial = espUART;
sschocke 7:f15c81074400 6 rxptr = buffer;
sschocke 7:f15c81074400 7 debugSerial = NULL;
sschocke 7:f15c81074400 8 }
sschocke 7:f15c81074400 9
sschocke 7:f15c81074400 10 void ESP8266_WebServer::rxint(void) {
sschocke 7:f15c81074400 11 char c = serial->getc();
sschocke 7:f15c81074400 12 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 13 debugSerial->putc(c);
sschocke 7:f15c81074400 14 }
sschocke 7:f15c81074400 15 *rxptr = c;
sschocke 7:f15c81074400 16 rxptr++;
sschocke 7:f15c81074400 17 *rxptr = 0;
sschocke 7:f15c81074400 18 }
sschocke 7:f15c81074400 19
sschocke 7:f15c81074400 20 void ESP8266_WebServer::readBuffer(void) {
sschocke 7:f15c81074400 21 strncpy(reply, buffer, 1024);
sschocke 7:f15c81074400 22 rxptr = buffer;
sschocke 7:f15c81074400 23 *rxptr = 0;
sschocke 7:f15c81074400 24 }
sschocke 7:f15c81074400 25
sschocke 7:f15c81074400 26 short ESP8266_WebServer::data_waiting(void)
sschocke 7:f15c81074400 27 {
sschocke 7:f15c81074400 28 char* ok = strstr(buffer, "OK\r\n");
sschocke 7:f15c81074400 29 char* error = strstr(buffer, "ERROR\r\n");
sschocke 7:f15c81074400 30 char* nochange = strstr(buffer, "no change\r\n");
sschocke 7:f15c81074400 31
sschocke 7:f15c81074400 32 if( (ok != NULL) || (error != NULL ) || (nochange != NULL ) )
sschocke 7:f15c81074400 33 {
sschocke 7:f15c81074400 34 return 1;
sschocke 7:f15c81074400 35 }
sschocke 7:f15c81074400 36
sschocke 7:f15c81074400 37 return 0;
sschocke 7:f15c81074400 38 }
sschocke 7:f15c81074400 39
sschocke 7:f15c81074400 40 short ESP8266_WebServer::string_waiting(const char* str)
sschocke 7:f15c81074400 41 {
sschocke 7:f15c81074400 42 char* pr = strstr(buffer, str);
sschocke 7:f15c81074400 43 char* error = strstr(buffer, "ERROR\r\n");
sschocke 7:f15c81074400 44
sschocke 7:f15c81074400 45 if( (pr != NULL) || (error != NULL ) )
sschocke 7:f15c81074400 46 {
sschocke 7:f15c81074400 47 return 1;
sschocke 7:f15c81074400 48 }
sschocke 7:f15c81074400 49
sschocke 7:f15c81074400 50 return 0;
sschocke 7:f15c81074400 51 }
sschocke 5:42c6f9d916bc 52
sschocke 7:f15c81074400 53 void ESP8266_WebServer::Initialize(void) {
sschocke 7:f15c81074400 54 readBuffer();
sschocke 7:f15c81074400 55 while( string_waiting("\r\nready\r\n") == 0 ) {
sschocke 7:f15c81074400 56 wait_ms(10);
sschocke 7:f15c81074400 57 }
sschocke 7:f15c81074400 58 readBuffer();
sschocke 7:f15c81074400 59
sschocke 7:f15c81074400 60 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 61 debugSerial->printf("Done\r\nSetting operating mode...");
sschocke 7:f15c81074400 62 }
sschocke 7:f15c81074400 63 serial->printf("AT+CWMODE=3\r\n");
sschocke 7:f15c81074400 64 while( data_waiting() == 0 ) {
sschocke 7:f15c81074400 65 wait_ms(10);
sschocke 7:f15c81074400 66 }
sschocke 7:f15c81074400 67 readBuffer();
sschocke 7:f15c81074400 68
sschocke 7:f15c81074400 69 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 70 debugSerial->printf("Done\r\nAccept Multiple connections...");
sschocke 7:f15c81074400 71 }
sschocke 7:f15c81074400 72 serial->printf("AT+CIPMUX=1\r\n");
sschocke 7:f15c81074400 73 while( data_waiting() == 0 ) {
sschocke 7:f15c81074400 74 wait_ms(10);
sschocke 7:f15c81074400 75 }
sschocke 7:f15c81074400 76 readBuffer();
sschocke 7:f15c81074400 77
sschocke 7:f15c81074400 78 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 79 debugSerial->printf("Done\r\nStarting Web Server...");
sschocke 7:f15c81074400 80 }
sschocke 7:f15c81074400 81
sschocke 7:f15c81074400 82 serial->printf("AT+CIPSERVER=1,80\r\n");
sschocke 7:f15c81074400 83 while( data_waiting() == 0 ) {
sschocke 7:f15c81074400 84 wait_ms(10);
sschocke 7:f15c81074400 85 }
sschocke 7:f15c81074400 86 readBuffer();
sschocke 7:f15c81074400 87 }
sschocke 7:f15c81074400 88
sschocke 7:f15c81074400 89 bool ESP8266_WebServer::GetRequest(void)
sschocke 5:42c6f9d916bc 90 {
sschocke 7:f15c81074400 91 if( (string_waiting("+IPD") == 1) && (string_waiting("\r\nOK\r\n") == 1) ) {
sschocke 7:f15c81074400 92 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 93 debugSerial->printf("\r\nGot Data\r\n");
sschocke 7:f15c81074400 94 }
sschocke 7:f15c81074400 95 readBuffer();
sschocke 7:f15c81074400 96
sschocke 7:f15c81074400 97 char* ipdPacket = strstr(reply, "+IPD");
sschocke 7:f15c81074400 98 int bytesRecv, ipdLen;
sschocke 7:f15c81074400 99 int numMatched = sscanf(ipdPacket,"+IPD,%d,%d:%n", &LinkID, &bytesRecv, &ipdLen);
sschocke 7:f15c81074400 100 if( numMatched != 2 ) {
sschocke 7:f15c81074400 101 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 102 debugSerial->printf("IPD ERROR : Matched %d, LinkID=%d, BytesRecv=%d, IPD Header Len=%d\r\n", numMatched, LinkID, bytesRecv, ipdLen);
sschocke 7:f15c81074400 103 }
sschocke 7:f15c81074400 104 return false;
sschocke 7:f15c81074400 105 }
sschocke 7:f15c81074400 106
sschocke 7:f15c81074400 107 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 108 debugSerial->printf("IPD Data: LinkID=%d, BytesRecv=%d, IPD Header Len=%d\r\n", LinkID, bytesRecv, ipdLen);
sschocke 7:f15c81074400 109 }
sschocke 7:f15c81074400 110 if( strstr(ipdPacket, "HTTP") != NULL ) {
sschocke 7:f15c81074400 111 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 112 debugSerial->printf("Got HTTP Request\r\n");
sschocke 7:f15c81074400 113 }
sschocke 7:f15c81074400 114 char* httpPacket = ipdPacket + ipdLen;
sschocke 7:f15c81074400 115 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 116 debugSerial->printf("HTTP Packet: %s\r\n", httpPacket);
sschocke 7:f15c81074400 117 }
sschocke 7:f15c81074400 118
sschocke 7:f15c81074400 119 numMatched = sscanf(httpPacket, "%s %s HTTP/%*c.%*c", httpMethod, httpURI);
sschocke 7:f15c81074400 120 if( numMatched != 2 ) {
sschocke 7:f15c81074400 121 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 122 debugSerial->printf("HTTP ERROR : Matched %d, Method=%s, URI=%s\r\n", numMatched, httpMethod, httpURI);
sschocke 7:f15c81074400 123 }
sschocke 7:f15c81074400 124 return false;
sschocke 7:f15c81074400 125 }
sschocke 7:f15c81074400 126 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 127 debugSerial->printf("HTTP %s %s\r\n", httpMethod, httpURI);
sschocke 7:f15c81074400 128 }
sschocke 7:f15c81074400 129
sschocke 7:f15c81074400 130 Method = httpMethod;
sschocke 7:f15c81074400 131 URI = httpURI;
sschocke 7:f15c81074400 132
sschocke 7:f15c81074400 133 return true;
sschocke 7:f15c81074400 134 }
sschocke 7:f15c81074400 135 }
sschocke 7:f15c81074400 136
sschocke 7:f15c81074400 137 return false;
sschocke 7:f15c81074400 138 }
sschocke 7:f15c81074400 139
sschocke 7:f15c81074400 140 void ESP8266_WebServer::sendResponse(int linkID) {
sschocke 7:f15c81074400 141 int bytes = strlen(response);
sschocke 7:f15c81074400 142 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 143 debugSerial->printf("HTTP Reply Packet(%d bytes): %s\r\n", bytes, response);
sschocke 7:f15c81074400 144 }
sschocke 7:f15c81074400 145 serial->printf("AT+CIPSEND=%d,%d\r\n", linkID, bytes);
sschocke 7:f15c81074400 146 wait_ms(500);
sschocke 7:f15c81074400 147 if( (string_waiting("\r\n>") == 1) ) {
sschocke 7:f15c81074400 148 serial->printf(response);
sschocke 7:f15c81074400 149 }
sschocke 7:f15c81074400 150 while( string_waiting("\r\nSEND OK\r\n") == 0 ) {
sschocke 7:f15c81074400 151 wait_ms(10);
sschocke 7:f15c81074400 152 }
sschocke 7:f15c81074400 153 }
sschocke 7:f15c81074400 154
sschocke 7:f15c81074400 155 void ESP8266_WebServer::Send404Reply(int linkID) {
sschocke 7:f15c81074400 156 sprintf(response, "HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\nContent-Length: 13\r\n\r\n404 Not Found");
sschocke 7:f15c81074400 157 sendResponse(linkID);
sschocke 7:f15c81074400 158 }
sschocke 7:f15c81074400 159
sschocke 7:f15c81074400 160 void ESP8266_WebServer::SendHTMLReply(int linkID, std::string reply) {
sschocke 7:f15c81074400 161 sprintf(response, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n%s", reply.length(), reply.c_str());
sschocke 7:f15c81074400 162 sendResponse(linkID);
sschocke 7:f15c81074400 163 }