创建mbed

Dependencies:   EthernetInterface SDFileSystem mbed-rtos mbed

Committer:
sunyiming
Date:
Mon Mar 05 14:58:17 2018 +0000
Revision:
0:610235504baa
Child:
1:6465a3f5c58a
??

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sunyiming 0:610235504baa 1 #include "mbed.h"
sunyiming 0:610235504baa 2 #include "EthernetInterface.h"
sunyiming 0:610235504baa 3 #include "SDFileSystem.h"
sunyiming 0:610235504baa 4 #include "rtos.h"
sunyiming 0:610235504baa 5
sunyiming 0:610235504baa 6 #define EnDebugMSG false //true-> print debug message to PC USB terminal, false->not print
sunyiming 0:610235504baa 7 #include "filelib.h"
sunyiming 0:610235504baa 8
sunyiming 0:610235504baa 9 #define IP "192.168.100.100"
sunyiming 0:610235504baa 10 #define MASK "255.255.255.0"
sunyiming 0:610235504baa 11 #define GATEWAY "192.168.100.1"
sunyiming 0:610235504baa 12 #define PORT 80
sunyiming 0:610235504baa 13
sunyiming 0:610235504baa 14 Serial pc (USBTX,USBRX); // tx, rx
sunyiming 0:610235504baa 15 SDFileSystem sd(SD_MOSI, SD_MISO, SD_SCK, SD_CS, "wfs"); // the pinout on the mbed
sunyiming 0:610235504baa 16
sunyiming 0:610235504baa 17 char sMethod[7];
sunyiming 0:610235504baa 18 char sURL[250];
sunyiming 0:610235504baa 19 char sProtocol[8];
sunyiming 0:610235504baa 20
sunyiming 0:610235504baa 21 EthernetInterface eth;
sunyiming 0:610235504baa 22
sunyiming 0:610235504baa 23 TCPSocketServer svr;
sunyiming 0:610235504baa 24 bool serverIsListened = false;
sunyiming 0:610235504baa 25
sunyiming 0:610235504baa 26 TCPSocketConnection client;
sunyiming 0:610235504baa 27 bool clientIsConnected = false;
sunyiming 0:610235504baa 28
sunyiming 0:610235504baa 29 char sentBuffer[1608] = {}; // 2*536=1072, 3*536=1608, 4*536=2144 !1500
sunyiming 0:610235504baa 30 char line_response[256]= {0};
sunyiming 0:610235504baa 31 char file_path[256] = {0};
sunyiming 0:610235504baa 32
sunyiming 0:610235504baa 33 DigitalOut led1(LED1); //server listning status
sunyiming 0:610235504baa 34 DigitalOut led2(LED2); //socket connecting status
sunyiming 0:610235504baa 35
sunyiming 0:610235504baa 36 Ticker ledTick;
sunyiming 0:610235504baa 37
sunyiming 0:610235504baa 38 void ledTickfunc()
sunyiming 0:610235504baa 39 {
sunyiming 0:610235504baa 40 if(serverIsListened) {
sunyiming 0:610235504baa 41 led1 = !led1;
sunyiming 0:610235504baa 42 } else {
sunyiming 0:610235504baa 43 led1 = false;
sunyiming 0:610235504baa 44 }
sunyiming 0:610235504baa 45 }
sunyiming 0:610235504baa 46
sunyiming 0:610235504baa 47 void send_HTTP_header(char* protocol, int code, char* title, char* mime_type, long long lengthBody)
sunyiming 0:610235504baa 48 {
sunyiming 0:610235504baa 49 snprintf(line_response, sizeof(line_response),"%s %d %s\r\n", protocol, code, title );
sunyiming 0:610235504baa 50 snprintf(sentBuffer, sizeof(sentBuffer),"%s",line_response);
sunyiming 0:610235504baa 51
sunyiming 0:610235504baa 52 if ( mime_type != NULL ) {
sunyiming 0:610235504baa 53 snprintf(line_response, sizeof(line_response), "Content-Type: %s\r\n", mime_type );
sunyiming 0:610235504baa 54 snprintf(sentBuffer, sizeof(sentBuffer), "%s%s",sentBuffer,line_response); //append to sentBuffer
sunyiming 0:610235504baa 55 }
sunyiming 0:610235504baa 56 if ( lengthBody >= 0 ) {
sunyiming 0:610235504baa 57 snprintf(line_response, sizeof(line_response), "Content-Length: %lld\r\n", lengthBody );
sunyiming 0:610235504baa 58 snprintf(sentBuffer, sizeof(sentBuffer), "%s%s",sentBuffer,line_response); //append to sentBuffer
sunyiming 0:610235504baa 59 }
sunyiming 0:610235504baa 60 snprintf(line_response, sizeof(line_response), "Connection: close\r\n" );
sunyiming 0:610235504baa 61 snprintf(sentBuffer, sizeof(sentBuffer),"%s%s\r\n",sentBuffer,line_response); //append to sentBuffer
sunyiming 0:610235504baa 62
sunyiming 0:610235504baa 63 if (EnDebugMSG)
sunyiming 0:610235504baa 64 printf("\n-->sent Header--\n");
sunyiming 0:610235504baa 65
sunyiming 0:610235504baa 66 client.send_all(sentBuffer,strlen(sentBuffer));
sunyiming 0:610235504baa 67 if (EnDebugMSG) {
sunyiming 0:610235504baa 68 printf(sentBuffer);
sunyiming 0:610235504baa 69 printf("\n--end Header-- bytes:%d",strlen(sentBuffer));
sunyiming 0:610235504baa 70 }
sunyiming 0:610235504baa 71 Thread::wait(200); //200ms important for browser!
sunyiming 0:610235504baa 72 }
sunyiming 0:610235504baa 73
sunyiming 0:610235504baa 74 void send_HTML_line(char* line, unsigned int length_line)
sunyiming 0:610235504baa 75 {
sunyiming 0:610235504baa 76 client.send_all(line,length_line);
sunyiming 0:610235504baa 77 if (EnDebugMSG)
sunyiming 0:610235504baa 78 printf("\n-->send HTML line:\n%s ...Ok!",line);
sunyiming 0:610235504baa 79 Thread::wait(10);
sunyiming 0:610235504baa 80 }
sunyiming 0:610235504baa 81
sunyiming 0:610235504baa 82 void send_HTML_error( int status_code, char* title, char* body_text)
sunyiming 0:610235504baa 83 {
sunyiming 0:610235504baa 84 send_HTTP_header("HTTP/1.1", status_code, title, "text/html", -1);
sunyiming 0:610235504baa 85 if (EnDebugMSG)
sunyiming 0:610235504baa 86 printf("\n-->send_error...\n");
sunyiming 0:610235504baa 87 sentBuffer[0]=NULL; //clear buffer
sunyiming 0:610235504baa 88 sprintf(line_response, "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<title>%d %s</title>\r\n</head>\r\n", status_code, title);
sunyiming 0:610235504baa 89 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 90 sprintf(line_response, "<body><center><h2><center>%d %s</center></h2>\r\n",status_code, title );
sunyiming 0:610235504baa 91 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 92 sprintf(line_response, "%s\r\n", body_text );
sunyiming 0:610235504baa 93 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 94 sprintf(line_response, "<p>mbed HTTP File Server</p>\r\n</center></body></html>\r\n");
sunyiming 0:610235504baa 95 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 96 send_HTML_line(sentBuffer, strlen(sentBuffer));
sunyiming 0:610235504baa 97 }
sunyiming 0:610235504baa 98
sunyiming 0:610235504baa 99 int send_file(char *path_file)
sunyiming 0:610235504baa 100 {
sunyiming 0:610235504baa 101 char *mime_type = {0};
sunyiming 0:610235504baa 102 unsigned int bytes_for_send=0;
sunyiming 0:610235504baa 103 long long filesize, all_send_bytes = 0;
sunyiming 0:610235504baa 104
sunyiming 0:610235504baa 105 mime_type = get_mime_type( path_file );
sunyiming 0:610235504baa 106 snprintf(file_path, sizeof(file_path),"/wfs/%s",path_file);
sunyiming 0:610235504baa 107 if (EnDebugMSG) {
sunyiming 0:610235504baa 108 printf("\n-->from send_file:%s",file_path);
sunyiming 0:610235504baa 109 printf("\n-->from send_file mime type:%s",mime_type);
sunyiming 0:610235504baa 110 }
sunyiming 0:610235504baa 111
sunyiming 0:610235504baa 112 if (Mystat(path_file, &myStatBuf)) { //fault with file
sunyiming 0:610235504baa 113 send_HTML_error( 403, "Forbidden", "403 - File access forbidden.");
sunyiming 0:610235504baa 114 return 403;
sunyiming 0:610235504baa 115 }
sunyiming 0:610235504baa 116 FILE* fp = NULL;
sunyiming 0:610235504baa 117 fp = fopen(file_path,"r");
sunyiming 0:610235504baa 118 if (fp==NULL ) {
sunyiming 0:610235504baa 119 send_HTML_error( 403, "Forbidden", "403 - File access forbidden.");
sunyiming 0:610235504baa 120 return 403;
sunyiming 0:610235504baa 121 }
sunyiming 0:610235504baa 122
sunyiming 0:610235504baa 123 filesize = myStatBuf.st_size;
sunyiming 0:610235504baa 124 send_HTTP_header("HTTP/1.1", 200, "Ok", mime_type, myStatBuf.st_size);
sunyiming 0:610235504baa 125 //binary send
sunyiming 0:610235504baa 126 all_send_bytes=0;
sunyiming 0:610235504baa 127 while(filesize) { //check for EOF !feof(fp)
sunyiming 0:610235504baa 128 bytes_for_send = filesize;
sunyiming 0:610235504baa 129 if (bytes_for_send > sizeof(sentBuffer)) {
sunyiming 0:610235504baa 130 bytes_for_send = sizeof(sentBuffer);
sunyiming 0:610235504baa 131 }
sunyiming 0:610235504baa 132 fread (sentBuffer,1,bytes_for_send,fp);
sunyiming 0:610235504baa 133 filesize -= bytes_for_send;
sunyiming 0:610235504baa 134 if (EnDebugMSG)
sunyiming 0:610235504baa 135 printf("\n---bytes_for_send...%d",bytes_for_send);
sunyiming 0:610235504baa 136 client.send_all(sentBuffer,bytes_for_send);
sunyiming 0:610235504baa 137 //Thread::wait(10);
sunyiming 0:610235504baa 138 all_send_bytes += bytes_for_send;
sunyiming 0:610235504baa 139 }
sunyiming 0:610235504baa 140 if (EnDebugMSG)
sunyiming 0:610235504baa 141 printf("\n---buffer fill end - all ...%lld", all_send_bytes);
sunyiming 0:610235504baa 142 //binary send
sunyiming 0:610235504baa 143
sunyiming 0:610235504baa 144 sprintf(line_response, "\r\n");
sunyiming 0:610235504baa 145 client.send_all(line_response,strlen(line_response));
sunyiming 0:610235504baa 146 if ( fp != NULL )
sunyiming 0:610235504baa 147 fclose(fp);
sunyiming 0:610235504baa 148 //Thread::wait(10);
sunyiming 0:610235504baa 149 return 0;
sunyiming 0:610235504baa 150 }
sunyiming 0:610235504baa 151
sunyiming 0:610235504baa 152 int send_directory(char *path)
sunyiming 0:610235504baa 153 {
sunyiming 0:610235504baa 154 char process_name[64]= {0};
sunyiming 0:610235504baa 155
sunyiming 0:610235504baa 156 char posOfLastSlash;
sunyiming 0:610235504baa 157 char *pLS;
sunyiming 0:610235504baa 158
sunyiming 0:610235504baa 159 struct dirent *p;
sunyiming 0:610235504baa 160 struct sMystat sb;
sunyiming 0:610235504baa 161 struct tm *timeinfo;
sunyiming 0:610235504baa 162 char timeBuf[40];
sunyiming 0:610235504baa 163
sunyiming 0:610235504baa 164 if (EnDebugMSG)
sunyiming 0:610235504baa 165 printf("\n-->from send_directory:%s",path);
sunyiming 0:610235504baa 166 snprintf(file_path,sizeof(file_path),"/wfs%s",path);
sunyiming 0:610235504baa 167 DIR *d = opendir(file_path);
sunyiming 0:610235504baa 168 if (EnDebugMSG && d!=NULL)
sunyiming 0:610235504baa 169 printf("\n-->from send_directory:%s ...open OK",file_path);
sunyiming 0:610235504baa 170 if (d==NULL) { //error open dir
sunyiming 0:610235504baa 171 send_HTML_error( 403, "Forbidden", "403 - Directory access forbidden.");
sunyiming 0:610235504baa 172 return -1;
sunyiming 0:610235504baa 173 }
sunyiming 0:610235504baa 174 send_HTTP_header("HTTP/1.1", 200, "Ok",NULL, -1);
sunyiming 0:610235504baa 175 sentBuffer[0]=NULL;
sunyiming 0:610235504baa 176 sprintf(line_response,"<!DOCTYPE html>\r\n<html>\n<head><title>Index of %s</title>\n",path);
sunyiming 0:610235504baa 177 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 178
sunyiming 0:610235504baa 179 sprintf(line_response,"<meta content=\"text/html; charset=iso-8859-1\" http-equiv=\"Content-Type\"></head>\n");
sunyiming 0:610235504baa 180 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 181
sunyiming 0:610235504baa 182
sunyiming 0:610235504baa 183 sprintf(line_response,"<body><center>\n<h3>Index of %s</h3>\n", path);
sunyiming 0:610235504baa 184 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 185 send_HTML_line(sentBuffer, strlen(sentBuffer));
sunyiming 0:610235504baa 186 //begin table
sunyiming 0:610235504baa 187 sentBuffer[0]=NULL; //clear buffer
sunyiming 0:610235504baa 188 sprintf(line_response,"<table border=\"0\">\n");
sunyiming 0:610235504baa 189 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 190 sprintf(line_response,"<tr><th align=\"left\" width=\"200\">Name</th><th align=\"right\" width=\"100\">Size(bytes)</th><th align=\"right\" width=\"200\">Date/Time</th></tr>\n");
sunyiming 0:610235504baa 191 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 192 //begin table
sunyiming 0:610235504baa 193
sunyiming 0:610235504baa 194 pLS=strrchr(path,'/');
sunyiming 0:610235504baa 195 posOfLastSlash=pLS-path+1;
sunyiming 0:610235504baa 196 if (EnDebugMSG)
sunyiming 0:610235504baa 197 printf("\r\n>>posOfLastSlash=%d",posOfLastSlash);
sunyiming 0:610235504baa 198 snprintf(process_name,posOfLastSlash+1,"%s",path);
sunyiming 0:610235504baa 199 if (EnDebugMSG)
sunyiming 0:610235504baa 200 printf("\r\n>>process_name=%s",process_name);
sunyiming 0:610235504baa 201 sprintf(line_response,"<tr><td align=\"left\"><a href=\"%s\">../</a></td></tr>\n",process_name);
sunyiming 0:610235504baa 202 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 203 while((p = readdir(d)) != NULL) {
sunyiming 0:610235504baa 204 if (EnDebugMSG)
sunyiming 0:610235504baa 205 printf("\n :%s",p->d_name);
sunyiming 0:610235504baa 206 sprintf(file_path,"%s/%s",path,p->d_name);
sunyiming 0:610235504baa 207 Mystat( file_path, &sb );
sunyiming 0:610235504baa 208 if (get_dirInfo(file_path)==0 ) { //this is directory path
sunyiming 0:610235504baa 209 if (EnDebugMSG)
sunyiming 0:610235504baa 210 printf("\nDIR");
sunyiming 0:610235504baa 211 sprintf(line_response, "<tr><td align=\"left\"><a href=\"%s\">%s</a><br></td></tr>\n",file_path,p->d_name);
sunyiming 0:610235504baa 212 if (strlen(line_response)>(sizeof(sentBuffer)-strlen(sentBuffer))) { //buffer must be sent
sunyiming 0:610235504baa 213 send_HTML_line(sentBuffer, strlen(sentBuffer));
sunyiming 0:610235504baa 214 sentBuffer[0]=NULL; //clear buffer
sunyiming 0:610235504baa 215 }
sunyiming 0:610235504baa 216 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 217
sunyiming 0:610235504baa 218 } else { //this is file
sunyiming 0:610235504baa 219 if (EnDebugMSG)
sunyiming 0:610235504baa 220 printf("\nFILE");
sunyiming 0:610235504baa 221 timeinfo = localtime (&sb.st_mtime);
sunyiming 0:610235504baa 222 //strftime(timeBuf,40, "%I:%M:%S %p (%Y/%m/%d)\r\n", localtime(&sb.st_mtime));
sunyiming 0:610235504baa 223 strftime(timeBuf, 40, "%c", timeinfo);
sunyiming 0:610235504baa 224 sprintf(line_response, "<tr><td align=\"left\"><a href=\"%s\">%s</a></td><td align=\"right\">%lld</td><td align=\"right\">%s</td></tr>\n", file_path, p->d_name,(long long) sb.st_size,timeBuf); // asctime(timeinfo) );
sunyiming 0:610235504baa 225
sunyiming 0:610235504baa 226 if (strlen(line_response)>(sizeof(sentBuffer)-strlen(sentBuffer))) { //buffer must be sent
sunyiming 0:610235504baa 227 send_HTML_line(sentBuffer, strlen(sentBuffer));
sunyiming 0:610235504baa 228 sentBuffer[0]=NULL; //clear buffer
sunyiming 0:610235504baa 229 }
sunyiming 0:610235504baa 230 snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer
sunyiming 0:610235504baa 231 }
sunyiming 0:610235504baa 232 }
sunyiming 0:610235504baa 233 send_HTML_line(sentBuffer, strlen(sentBuffer));
sunyiming 0:610235504baa 234 closedir(d);
sunyiming 0:610235504baa 235
sunyiming 0:610235504baa 236 sprintf(line_response, "</table>\n<br><h4>mbed HTTP File Server</h4>\n</center></body></html>\n");
sunyiming 0:610235504baa 237 send_HTML_line(line_response, strlen(line_response));
sunyiming 0:610235504baa 238
sunyiming 0:610235504baa 239 return 0;
sunyiming 0:610235504baa 240 }
sunyiming 0:610235504baa 241
sunyiming 0:610235504baa 242 void parseHTTPRequest(char* buffer)
sunyiming 0:610235504baa 243 {
sunyiming 0:610235504baa 244 char spacePos;
sunyiming 0:610235504baa 245 char *tmpBuffer;
sunyiming 0:610235504baa 246 spacePos = strcspn(buffer, " ") + 1; //position of first space character
sunyiming 0:610235504baa 247 snprintf(sMethod, spacePos,"%s", buffer);
sunyiming 0:610235504baa 248
sunyiming 0:610235504baa 249 //get Protocol
sunyiming 0:610235504baa 250 tmpBuffer=&(buffer[spacePos]); //move pointer to buffer (delete Method)
sunyiming 0:610235504baa 251 spacePos = strcspn(tmpBuffer, "\r\n") + 1;
sunyiming 0:610235504baa 252 tmpBuffer[spacePos]='\0'; //set end of string ...cut
sunyiming 0:610235504baa 253 sprintf(sProtocol, "%s", strrchr(tmpBuffer,' ')); //get string after last (space )
sunyiming 0:610235504baa 254 printf("\r\nsProtocol:%s", tmpBuffer);
sunyiming 0:610235504baa 255 buffer = &(sProtocol[1]); //cut first character (space)
sunyiming 0:610235504baa 256 sprintf(sProtocol, "%s", buffer);
sunyiming 0:610235504baa 257
sunyiming 0:610235504baa 258 //get URL
sunyiming 0:610235504baa 259 snprintf(sURL,strlen(tmpBuffer)-strlen(sProtocol),"%s\r\n", tmpBuffer); //URL is between Method and Protocol
sunyiming 0:610235504baa 260
sunyiming 0:610235504baa 261 printf("\nParse Method:%s",sMethod);
sunyiming 0:610235504baa 262 printf("\nParse URL:%s",sURL);
sunyiming 0:610235504baa 263 printf("\nParse PROTOCOL:%s",sProtocol);
sunyiming 0:610235504baa 264 printf("\n\r\n");
sunyiming 0:610235504baa 265 }
sunyiming 0:610235504baa 266
sunyiming 0:610235504baa 267 int processHTTP(char* sMethod, char* sURL, char* sProtocol)
sunyiming 0:610235504baa 268 {
sunyiming 0:610235504baa 269 int gdi, gfi; //status of get_dir_info(xxx), and get_file_info(xxx)
sunyiming 0:610235504baa 270
sunyiming 0:610235504baa 271 if (strcmp(sMethod,"GET")!=0) {
sunyiming 0:610235504baa 272 send_HTML_error( 501, "501 Not Implemented", "501 - The server either does not recognize the request method");
sunyiming 0:610235504baa 273 return 501;
sunyiming 0:610235504baa 274 }
sunyiming 0:610235504baa 275 if (sURL[0]!= '/') {
sunyiming 0:610235504baa 276 send_HTML_error( 400, "Bad Request", "400 - The request cannot be fulfilled due to bad syntax.");
sunyiming 0:610235504baa 277 return 400;
sunyiming 0:610235504baa 278 }
sunyiming 0:610235504baa 279 if (sURL[strlen(sURL)-1]=='/') {
sunyiming 0:610235504baa 280 sURL[strlen(sURL)-1]=sURL[strlen(sURL)]; //delete last symbol
sunyiming 0:610235504baa 281 if (EnDebugMSG)
sunyiming 0:610235504baa 282 printf("\n delete last:%s",sURL);
sunyiming 0:610235504baa 283 }
sunyiming 0:610235504baa 284 gdi= get_dirInfo(sURL);
sunyiming 0:610235504baa 285 gfi= get_fileInfo(sURL);
sunyiming 0:610235504baa 286 if (gfi!=0) { //!=0 file not found
sunyiming 0:610235504baa 287 if (gdi==0) { //0-ok this is directory
sunyiming 0:610235504baa 288 return send_directory(sURL);
sunyiming 0:610235504baa 289 }
sunyiming 0:610235504baa 290 if (EnDebugMSG)
sunyiming 0:610235504baa 291 printf("\n404-br File not found or...(Fresult is:%d)",gfi);
sunyiming 0:610235504baa 292 send_HTML_error( 404, "Not Found","404 - The requested resource could not be found.");
sunyiming 0:610235504baa 293 return 404;
sunyiming 0:610235504baa 294 } else { //==0 found
sunyiming 0:610235504baa 295 if (gdi==0) //0-ok this is directory
sunyiming 0:610235504baa 296 return send_directory(sURL);
sunyiming 0:610235504baa 297 else
sunyiming 0:610235504baa 298 return send_file(sURL);
sunyiming 0:610235504baa 299 }
sunyiming 0:610235504baa 300 }
sunyiming 0:610235504baa 301
sunyiming 0:610235504baa 302 int main()
sunyiming 0:610235504baa 303 {
sunyiming 0:610235504baa 304 printf("\r\n---- HTTP Server ----\r\n");
sunyiming 0:610235504baa 305
sunyiming 0:610235504baa 306 ledTick.attach(&ledTickfunc,0.5);
sunyiming 0:610235504baa 307 //ledTick.detach();
sunyiming 0:610235504baa 308 //setup ethernet interface
sunyiming 0:610235504baa 309 eth.init(); //Use DHCP
sunyiming 0:610235504baa 310 // eth.init(IP,MASK,GATEWAY); //IP,mask,Gateway
sunyiming 0:610235504baa 311 eth.connect();
sunyiming 0:610235504baa 312 printf("IP Address is %s\n\r", eth.getIPAddress());
sunyiming 0:610235504baa 313
sunyiming 0:610235504baa 314 //setup tcp socket
sunyiming 0:610235504baa 315 if(svr.bind(PORT)< 0) {
sunyiming 0:610235504baa 316 printf("tcp server bind failed.\n\r");
sunyiming 0:610235504baa 317 return -1;
sunyiming 0:610235504baa 318 } else {
sunyiming 0:610235504baa 319 printf("tcp server bind successed.\n\r");
sunyiming 0:610235504baa 320 serverIsListened = true;
sunyiming 0:610235504baa 321 }
sunyiming 0:610235504baa 322
sunyiming 0:610235504baa 323 if(svr.listen(1) < 0) {
sunyiming 0:610235504baa 324 printf("tcp server listen failed.\n\r");
sunyiming 0:610235504baa 325 return -1;
sunyiming 0:610235504baa 326 } else {
sunyiming 0:610235504baa 327 printf("tcp server is listening...\n\r");
sunyiming 0:610235504baa 328 }
sunyiming 0:610235504baa 329
sunyiming 0:610235504baa 330 //listening for http GET request
sunyiming 0:610235504baa 331 while (serverIsListened) {
sunyiming 0:610235504baa 332 //blocking mode(never timeout)
sunyiming 0:610235504baa 333 if(svr.accept(client)<0) {
sunyiming 0:610235504baa 334 printf("failed to accept connection.\n\r");
sunyiming 0:610235504baa 335 } else {
sunyiming 0:610235504baa 336 //client.set_blocking(false,5000); //5000=5sec
sunyiming 0:610235504baa 337 printf("connection success!\n\rIP: %s\n\r",client.get_address());
sunyiming 0:610235504baa 338 clientIsConnected = true;
sunyiming 0:610235504baa 339 led2 = true;
sunyiming 0:610235504baa 340 while(clientIsConnected) {
sunyiming 0:610235504baa 341 char buffer[1024] = {};
sunyiming 0:610235504baa 342 switch(client.receive(buffer, 1023)) {
sunyiming 0:610235504baa 343 case 0:
sunyiming 0:610235504baa 344 printf("recieved buffer is empty.\n\r");
sunyiming 0:610235504baa 345 clientIsConnected = false;
sunyiming 0:610235504baa 346 break;
sunyiming 0:610235504baa 347 case -1:
sunyiming 0:610235504baa 348 printf("failed to read data from client.\n\r");
sunyiming 0:610235504baa 349 clientIsConnected = false;
sunyiming 0:610235504baa 350 break;
sunyiming 0:610235504baa 351 default:
sunyiming 0:610235504baa 352 printf("Recieved Data: %d\n\r\n\r%.*s\n\r",strlen(buffer),strlen(buffer),buffer);
sunyiming 0:610235504baa 353 parseHTTPRequest(buffer);
sunyiming 0:610235504baa 354 //if(buffer[0] == 'G' && buffer[1] == 'E' && buffer[2] == 'T' ) {
sunyiming 0:610235504baa 355 if (strcmp(sMethod, "GET" ) == 0 ) {
sunyiming 0:610235504baa 356 printf("GET request incomming.\n\r");
sunyiming 0:610235504baa 357 processHTTP(sMethod, sURL, sProtocol);
sunyiming 0:610235504baa 358 clientIsConnected = false;
sunyiming 0:610235504baa 359 }//if get
sunyiming 0:610235504baa 360 break;
sunyiming 0:610235504baa 361 } //switch
sunyiming 0:610235504baa 362 //ledTick.attach(&ledTickfunc,0.5);
sunyiming 0:610235504baa 363 }//while
sunyiming 0:610235504baa 364 printf("close connection.\n\rHTTP server is listening...\n\r\n");
sunyiming 0:610235504baa 365 client.close();
sunyiming 0:610235504baa 366 Thread::wait(50);
sunyiming 0:610235504baa 367 led2 = false;
sunyiming 0:610235504baa 368 }
sunyiming 0:610235504baa 369 }
sunyiming 0:610235504baa 370
sunyiming 0:610235504baa 371 }