Clinton Lee Taylor / Mbed 2 deprecated WiFiLamp

Dependencies:   ESP8266_WebServer mbed

Fork of WiFiLamp by Sebastian Schocke

Committer:
sschocke
Date:
Mon Dec 29 11:42:53 2014 +0000
Revision:
13:1e8f27da036a
Parent:
11:3ab606a42227
Child:
18:cdfe5eb7d3ad
Updated revision after ESP8266 Firmware upgrade

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 9:319aeb6e0123 3 #include <map>
sschocke 7:f15c81074400 4
sschocke 7:f15c81074400 5 ESP8266_WebServer::ESP8266_WebServer(Serial *espUART) {
sschocke 7:f15c81074400 6 serial = espUART;
sschocke 7:f15c81074400 7 rxptr = buffer;
sschocke 7:f15c81074400 8 debugSerial = NULL;
sschocke 7:f15c81074400 9 }
sschocke 7:f15c81074400 10
sschocke 7:f15c81074400 11 void ESP8266_WebServer::rxint(void) {
sschocke 7:f15c81074400 12 char c = serial->getc();
sschocke 13:1e8f27da036a 13 if( (c != 0x0A) && (c != 0x0D) && ((c < 0x20) || (c > 0x80)) ) return;
sschocke 13:1e8f27da036a 14
sschocke 7:f15c81074400 15 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 16 debugSerial->putc(c);
sschocke 7:f15c81074400 17 }
sschocke 7:f15c81074400 18 *rxptr = c;
sschocke 7:f15c81074400 19 rxptr++;
sschocke 7:f15c81074400 20 *rxptr = 0;
sschocke 7:f15c81074400 21 }
sschocke 7:f15c81074400 22
sschocke 7:f15c81074400 23 void ESP8266_WebServer::readBuffer(void) {
sschocke 7:f15c81074400 24 strncpy(reply, buffer, 1024);
sschocke 7:f15c81074400 25 rxptr = buffer;
sschocke 7:f15c81074400 26 *rxptr = 0;
sschocke 7:f15c81074400 27 }
sschocke 7:f15c81074400 28
sschocke 7:f15c81074400 29 short ESP8266_WebServer::data_waiting(void)
sschocke 7:f15c81074400 30 {
sschocke 7:f15c81074400 31 char* ok = strstr(buffer, "OK\r\n");
sschocke 7:f15c81074400 32 char* error = strstr(buffer, "ERROR\r\n");
sschocke 7:f15c81074400 33 char* nochange = strstr(buffer, "no change\r\n");
sschocke 7:f15c81074400 34
sschocke 7:f15c81074400 35 if( (ok != NULL) || (error != NULL ) || (nochange != NULL ) )
sschocke 7:f15c81074400 36 {
sschocke 7:f15c81074400 37 return 1;
sschocke 7:f15c81074400 38 }
sschocke 7:f15c81074400 39
sschocke 7:f15c81074400 40 return 0;
sschocke 7:f15c81074400 41 }
sschocke 7:f15c81074400 42
sschocke 7:f15c81074400 43 short ESP8266_WebServer::string_waiting(const char* str)
sschocke 7:f15c81074400 44 {
sschocke 7:f15c81074400 45 char* pr = strstr(buffer, str);
sschocke 7:f15c81074400 46 char* error = strstr(buffer, "ERROR\r\n");
sschocke 7:f15c81074400 47
sschocke 7:f15c81074400 48 if( (pr != NULL) || (error != NULL ) )
sschocke 7:f15c81074400 49 {
sschocke 7:f15c81074400 50 return 1;
sschocke 7:f15c81074400 51 }
sschocke 7:f15c81074400 52
sschocke 7:f15c81074400 53 return 0;
sschocke 7:f15c81074400 54 }
sschocke 5:42c6f9d916bc 55
sschocke 7:f15c81074400 56 void ESP8266_WebServer::Initialize(void) {
sschocke 7:f15c81074400 57 readBuffer();
sschocke 13:1e8f27da036a 58 serial->printf("AT+RST\r\n");
sschocke 13:1e8f27da036a 59 wait_ms(1000);
sschocke 7:f15c81074400 60 while( string_waiting("\r\nready\r\n") == 0 ) {
sschocke 13:1e8f27da036a 61 wait_ms(100);
sschocke 13:1e8f27da036a 62 }
sschocke 13:1e8f27da036a 63 readBuffer();
sschocke 13:1e8f27da036a 64 serial->printf("ATE0\r\n");
sschocke 13:1e8f27da036a 65 while( data_waiting() == 0 ) {
sschocke 7:f15c81074400 66 wait_ms(10);
sschocke 7:f15c81074400 67 }
sschocke 7:f15c81074400 68 readBuffer();
sschocke 7:f15c81074400 69
sschocke 7:f15c81074400 70 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 71 debugSerial->printf("Done\r\nSetting operating mode...");
sschocke 7:f15c81074400 72 }
sschocke 7:f15c81074400 73 serial->printf("AT+CWMODE=3\r\n");
sschocke 7:f15c81074400 74 while( data_waiting() == 0 ) {
sschocke 7:f15c81074400 75 wait_ms(10);
sschocke 7:f15c81074400 76 }
sschocke 7:f15c81074400 77 readBuffer();
sschocke 7:f15c81074400 78
sschocke 7:f15c81074400 79 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 80 debugSerial->printf("Done\r\nAccept Multiple connections...");
sschocke 7:f15c81074400 81 }
sschocke 7:f15c81074400 82 serial->printf("AT+CIPMUX=1\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 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 89 debugSerial->printf("Done\r\nStarting Web Server...");
sschocke 7:f15c81074400 90 }
sschocke 7:f15c81074400 91
sschocke 7:f15c81074400 92 serial->printf("AT+CIPSERVER=1,80\r\n");
sschocke 7:f15c81074400 93 while( data_waiting() == 0 ) {
sschocke 7:f15c81074400 94 wait_ms(10);
sschocke 7:f15c81074400 95 }
sschocke 7:f15c81074400 96 readBuffer();
sschocke 7:f15c81074400 97 }
sschocke 7:f15c81074400 98
sschocke 9:319aeb6e0123 99 ESP8266_WebRequest* ESP8266_WebServer::GetRequest(void)
sschocke 5:42c6f9d916bc 100 {
sschocke 7:f15c81074400 101 if( (string_waiting("+IPD") == 1) && (string_waiting("\r\nOK\r\n") == 1) ) {
sschocke 7:f15c81074400 102 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 103 debugSerial->printf("\r\nGot Data\r\n");
sschocke 7:f15c81074400 104 }
sschocke 7:f15c81074400 105 readBuffer();
sschocke 7:f15c81074400 106
sschocke 7:f15c81074400 107 char* ipdPacket = strstr(reply, "+IPD");
sschocke 9:319aeb6e0123 108 int bytesRecv, ipdLen, linkID;
sschocke 9:319aeb6e0123 109 int numMatched = sscanf(ipdPacket,"+IPD,%d,%d:%n", &linkID, &bytesRecv, &ipdLen);
sschocke 7:f15c81074400 110 if( numMatched != 2 ) {
sschocke 7:f15c81074400 111 if( debugSerial != NULL ) {
sschocke 9:319aeb6e0123 112 debugSerial->printf("IPD ERROR : Matched %d, LinkID=%d, BytesRecv=%d, IPD Header Len=%d\r\n", numMatched, linkID, bytesRecv, ipdLen);
sschocke 7:f15c81074400 113 }
sschocke 7:f15c81074400 114 return false;
sschocke 7:f15c81074400 115 }
sschocke 7:f15c81074400 116
sschocke 7:f15c81074400 117 if( debugSerial != NULL ) {
sschocke 9:319aeb6e0123 118 debugSerial->printf("IPD Data: LinkID=%d, BytesRecv=%d, IPD Header Len=%d\r\n", linkID, bytesRecv, ipdLen);
sschocke 7:f15c81074400 119 }
sschocke 7:f15c81074400 120 if( strstr(ipdPacket, "HTTP") != NULL ) {
sschocke 7:f15c81074400 121 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 122 debugSerial->printf("Got HTTP Request\r\n");
sschocke 7:f15c81074400 123 }
sschocke 7:f15c81074400 124 char* httpPacket = ipdPacket + ipdLen;
sschocke 7:f15c81074400 125 if( debugSerial != NULL ) {
sschocke 7:f15c81074400 126 debugSerial->printf("HTTP Packet: %s\r\n", httpPacket);
sschocke 7:f15c81074400 127 }
sschocke 9:319aeb6e0123 128 ESP8266_WebRequest* request = new ESP8266_WebRequest(linkID, httpPacket, debugSerial);
sschocke 7:f15c81074400 129
sschocke 9:319aeb6e0123 130 return request;
sschocke 7:f15c81074400 131 }
sschocke 7:f15c81074400 132 }
sschocke 7:f15c81074400 133
sschocke 9:319aeb6e0123 134 return NULL;
sschocke 7:f15c81074400 135 }
sschocke 7:f15c81074400 136
sschocke 11:3ab606a42227 137 void ESP8266_WebServer::sendResponse(int linkID, int numBytes) {
sschocke 7:f15c81074400 138 if( debugSerial != NULL ) {
sschocke 11:3ab606a42227 139 debugSerial->printf("HTTP Reply Packet(%d bytes): %s\r\n", numBytes, response);
sschocke 7:f15c81074400 140 }
sschocke 11:3ab606a42227 141 serial->printf("AT+CIPSEND=%d,%d\r\n", linkID, numBytes);
sschocke 13:1e8f27da036a 142 wait_ms(100);
sschocke 13:1e8f27da036a 143 if( (string_waiting(">") == 1) ) {
sschocke 11:3ab606a42227 144 for( int i=0; i<numBytes; i++ ) {
sschocke 11:3ab606a42227 145 serial->putc(response[i]);
sschocke 11:3ab606a42227 146 }
sschocke 13:1e8f27da036a 147 while( string_waiting("\r\nSEND OK\r\n") == 0 ) {
sschocke 13:1e8f27da036a 148 wait_ms(10);
sschocke 13:1e8f27da036a 149 }
sschocke 7:f15c81074400 150 }
sschocke 7:f15c81074400 151 }
sschocke 7:f15c81074400 152
sschocke 11:3ab606a42227 153 void ESP8266_WebServer::SendError(int linkID, std::string error) {
sschocke 11:3ab606a42227 154 SendError(linkID, error.c_str());
sschocke 11:3ab606a42227 155 }
sschocke 11:3ab606a42227 156 void ESP8266_WebServer::SendError(int linkID, const char* error) {
sschocke 11:3ab606a42227 157 sprintf(response, "HTTP/1.1 %s\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n%s", error, strlen(error), error);
sschocke 11:3ab606a42227 158 sendResponse(linkID, strlen(response));
sschocke 11:3ab606a42227 159 }
sschocke 11:3ab606a42227 160 void ESP8266_WebServer::Send404Error(int linkID) {
sschocke 11:3ab606a42227 161 SendError(linkID, "404 Not Found");
sschocke 7:f15c81074400 162 }
sschocke 7:f15c81074400 163
sschocke 11:3ab606a42227 164 void ESP8266_WebServer::SendReply(int linkID, std::string reply, const char* mimeType) {
sschocke 11:3ab606a42227 165 SendReply(linkID, reply.c_str(), reply.length(), mimeType);
sschocke 11:3ab606a42227 166 }
sschocke 11:3ab606a42227 167
sschocke 11:3ab606a42227 168 void ESP8266_WebServer::SendReply(int linkID, const char* reply, int replySize, const char* mimeType) {
sschocke 13:1e8f27da036a 169 sprintf(response, "HTTP/1.1 200 OK\r\nContent-Type:%s\r\nContent-Length: %d\r\n\r\n", mimeType, replySize);
sschocke 13:1e8f27da036a 170 sendResponse(linkID, strlen(response));
sschocke 13:1e8f27da036a 171 strncpy(response, reply, replySize);
sschocke 11:3ab606a42227 172 sendResponse(linkID, strlen(response));
sschocke 7:f15c81074400 173 }
sschocke 9:319aeb6e0123 174
sschocke 9:319aeb6e0123 175 ESP8266_WebRequest::ESP8266_WebRequest(int linkID, const char* httpPacket, Serial* debugSerial) {
sschocke 9:319aeb6e0123 176 int numMatched = sscanf(httpPacket, "%s %s HTTP/%*c.%*c", httpMethod, httpURI);
sschocke 9:319aeb6e0123 177 if( numMatched != 2 ) {
sschocke 9:319aeb6e0123 178 if( debugSerial != NULL ) {
sschocke 9:319aeb6e0123 179 debugSerial->printf("HTTP ERROR : Matched %d, Method=%s, URI=%s\r\n", numMatched, httpMethod, httpURI);
sschocke 9:319aeb6e0123 180 }
sschocke 9:319aeb6e0123 181 return;
sschocke 9:319aeb6e0123 182 }
sschocke 9:319aeb6e0123 183 if( debugSerial != NULL ) {
sschocke 9:319aeb6e0123 184 debugSerial->printf("HTTP %s %s\r\n", httpMethod, httpURI);
sschocke 9:319aeb6e0123 185 }
sschocke 9:319aeb6e0123 186
sschocke 9:319aeb6e0123 187 LinkID = linkID;
sschocke 9:319aeb6e0123 188 Method = httpMethod;
sschocke 9:319aeb6e0123 189 URI = httpURI;
sschocke 9:319aeb6e0123 190 int pos = URI.find('?');
sschocke 9:319aeb6e0123 191 if(pos != string::npos ) {
sschocke 9:319aeb6e0123 192 string params = URI.substr(pos+1);
sschocke 9:319aeb6e0123 193 URI = URI.substr(0,pos);
sschocke 9:319aeb6e0123 194 if( debugSerial != NULL ) {
sschocke 9:319aeb6e0123 195 debugSerial->printf("HTTP %s %s\r\n", URI.c_str(), params.c_str());
sschocke 9:319aeb6e0123 196 }
sschocke 9:319aeb6e0123 197 pos = params.find('=');
sschocke 9:319aeb6e0123 198 while( pos != string::npos ) {
sschocke 9:319aeb6e0123 199 string name = params.substr(0,pos);
sschocke 9:319aeb6e0123 200 string value = params.substr(pos+1);
sschocke 9:319aeb6e0123 201 pos = params.find('&');
sschocke 9:319aeb6e0123 202 if( pos == string::npos )
sschocke 9:319aeb6e0123 203 {
sschocke 9:319aeb6e0123 204 if( debugSerial != NULL ) {
sschocke 9:319aeb6e0123 205 debugSerial->printf("HTTP GET Parameter %s=%s\r\n", name.c_str(), value.c_str());
sschocke 9:319aeb6e0123 206 }
sschocke 9:319aeb6e0123 207 Parameters[name] = value;
sschocke 9:319aeb6e0123 208 break;
sschocke 9:319aeb6e0123 209 }
sschocke 9:319aeb6e0123 210
sschocke 9:319aeb6e0123 211 value = value.substr(0,value.find('&'));
sschocke 9:319aeb6e0123 212 params = params.substr(pos+1);
sschocke 9:319aeb6e0123 213 pos = params.find('=');
sschocke 9:319aeb6e0123 214 if( debugSerial != NULL ) {
sschocke 9:319aeb6e0123 215 debugSerial->printf("HTTP GET Parameter %s=%s\r\n", name.c_str(), value.c_str());
sschocke 9:319aeb6e0123 216 }
sschocke 9:319aeb6e0123 217 Parameters[name] = value;
sschocke 9:319aeb6e0123 218 }
sschocke 9:319aeb6e0123 219 }
sschocke 9:319aeb6e0123 220 }