Simple HTTP Server with one page index.html stored inside MBED as char vector and javascript to update a table content

Fork of HTTP_SERVER by Akifumi Takahashi

Committer:
mmdonatti
Date:
Thu May 10 20:24:03 2018 +0000
Revision:
14:f21da0acc9f6
Parent:
10:4a48594c2f44
Simple server GET and POST for one index.html page and javascript

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 0:cc483bea4fe3 1 #include "HTTP_SERVER.h"
mmdonatti 14:f21da0acc9f6 2
aktk 8:b013075de2e4 3 #ifndef DEBUG
aktk 10:4a48594c2f44 4 //#define DEBUG
aktk 8:b013075de2e4 5 #endif
aktk 1:3a1fe94c6e42 6
mmdonatti 14:f21da0acc9f6 7 //HTML file - with Javascript
mmdonatti 14:f21da0acc9f6 8 const char *index_html = "<html><head><title>DCM Heaters Driver</title><link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"http://cnpem.br/wp-content/uploads/2018/01/LNLS_Sirius-02-293x300.png\" />\n\
mmdonatti 14:f21da0acc9f6 9 <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script></head>\n\
mmdonatti 14:f21da0acc9f6 10 <script language=\"javascript\" type=\"text/javascript\">\n\
mmdonatti 14:f21da0acc9f6 11 function loop(){\n\
mmdonatti 14:f21da0acc9f6 12 $.post(\"read_data\", function(data){\n\
mmdonatti 14:f21da0acc9f6 13 if(data.length >0)\n\
mmdonatti 14:f21da0acc9f6 14 {\n\
mmdonatti 14:f21da0acc9f6 15 var str = data;\n\
mmdonatti 14:f21da0acc9f6 16 var res = str.split(\" \");\n\
mmdonatti 14:f21da0acc9f6 17 if(res.length == 97){\n\
mmdonatti 14:f21da0acc9f6 18 var table = '<div id=\"data_table\">'+\n\
mmdonatti 14:f21da0acc9f6 19 '<table width=\"100%\" border=\"1\" cellpadding=\"3\" cellspacing=\"1\" bgcolor=\"#E3EBFB\">'+\n\
mmdonatti 14:f21da0acc9f6 20 '<tr align=\"center\" valign=\"middle\">'+\n\
mmdonatti 14:f21da0acc9f6 21 '<td width=\"50\" height=\"40\"><strong>Channel</font></strong></td>'+\n\
mmdonatti 14:f21da0acc9f6 22 '<td width=\"96\" height=\"40\"><strong>Voltage (V)</font></strong></td>'+\n\
mmdonatti 14:f21da0acc9f6 23 '<td width=\"96\" height=\"40\"><strong>Current (A)</font></strong></td>'+\n\
mmdonatti 14:f21da0acc9f6 24 '<td width=\"96\" height=\"40\"><strong>Control (%)</font></strong></td>'+\n\
mmdonatti 14:f21da0acc9f6 25 '<td width=\"96\" height=\"40\"><strong>Current Limit (A)</font></strong></td>'+\n\
mmdonatti 14:f21da0acc9f6 26 '<td width=\"96\" height=\"40\"><strong>Failure</font></strong></td>'+\n\
mmdonatti 14:f21da0acc9f6 27 '<td width=\"96\" height=\"40\"><strong>Overload</font></strong></td>'+\n\
mmdonatti 14:f21da0acc9f6 28 '<td width=\"96\" height=\"40\"><strong>No Load</font></strong></td>'+\n\
mmdonatti 14:f21da0acc9f6 29 '<td width=\"96\" height=\"40\"><strong>Enable</font></strong></td></tr>';\n\
mmdonatti 14:f21da0acc9f6 30 for(var i=0;i<8;i++){\n\
mmdonatti 14:f21da0acc9f6 31 table = table + '<tr align=\"center\" valign=\"middle\">'+\n\
mmdonatti 14:f21da0acc9f6 32 '<td width=\"50\" height=\"31\"bgcolor=\"#FFFFFF\"><span style=\"font-weight:bold;\">'+(i+1)+'</span></td>'+\n\
mmdonatti 14:f21da0acc9f6 33 '<td width=\"96\" height=\"28\"bgcolor=\"#FFFFFF\"><span style=\"font-weight:bold;\">'+res[i*12]+'</span></td>'+\n\
mmdonatti 14:f21da0acc9f6 34 '<td width=\"96\" height=\"28\"bgcolor=\"#FFFFFF\"><span style=\"font-weight:bold;\">'+res[i*12+1]+'</span></td>'+\n\
mmdonatti 14:f21da0acc9f6 35 '<td width=\"96\" height=\"28\"bgcolor=\"#FFFFFF\"><span style=\"font-weight:bold;\">'+res[i*12+2]+'</span></td>'+\n\
mmdonatti 14:f21da0acc9f6 36 '<td width=\"96\" height=\"28\"bgcolor=\"#FFFFFF\"><span style=\"font-weight:bold;\">'+res[i*12+3]+'</span></td>'+\n\
mmdonatti 14:f21da0acc9f6 37 '<td width=\"96\" height=\"28\"bgcolor=\"'+res[i*12+4]+'\"><span style=\"font-weight:bold;\">'+res[i*12+5]+'</span></td>'+\n\
mmdonatti 14:f21da0acc9f6 38 '<td width=\"96\" height=\"28\"bgcolor=\"'+res[i*12+6]+'\"><span style=\"font-weight:bold;\">'+res[i*12+7]+'</span></td>'+\n\
mmdonatti 14:f21da0acc9f6 39 '<td width=\"96\" height=\"28\"bgcolor=\"'+res[i*12+8]+'\"><span style=\"font-weight:bold;\">'+res[i*12+9]+'</span></td>'+\n\
mmdonatti 14:f21da0acc9f6 40 '<td width=\"96\" height=\"28\"bgcolor=\"'+res[i*12+10]+'\"><span style=\"font-weight:bold;\">'+res[i*12+11]+'</span></td>'+\n\
mmdonatti 14:f21da0acc9f6 41 '</tr>';\n\
mmdonatti 14:f21da0acc9f6 42 }\n\
mmdonatti 14:f21da0acc9f6 43 table = table + '</table></div>';\n\
mmdonatti 14:f21da0acc9f6 44 document.getElementById(\"data_table\").innerHTML = table;\n\
mmdonatti 14:f21da0acc9f6 45 }}\n\
mmdonatti 14:f21da0acc9f6 46 });\n\
mmdonatti 14:f21da0acc9f6 47 setTimeout(function(){ loop() }, 2000);\n\
mmdonatti 14:f21da0acc9f6 48 }\n\
mmdonatti 14:f21da0acc9f6 49 </script>\n\
mmdonatti 14:f21da0acc9f6 50 <body onLoad=\"loop()\">\n\
mmdonatti 14:f21da0acc9f6 51 <table width=\"100%\"border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"font-weight:normal;\">\n\
mmdonatti 14:f21da0acc9f6 52 <tr>\n\
mmdonatti 14:f21da0acc9f6 53 <td width=\"25%\" height=\"142\" align=\"center\" valign=\"middle\" style=\"border-bottom: #000000 solid 1px;\">\n\
mmdonatti 14:f21da0acc9f6 54 <a href=\"http://www.lnls.cnpem.br/\"><img src=\"http://lnls.cnpem.br/wp-content/themes/lnls-v2/assets/images/logo-header.svg\" alt=\"LNLS\" width=\"305\" height=\"142\" /></a></td>\n\
mmdonatti 14:f21da0acc9f6 55 <td colspan=\"5\" height=\"142\" align=\"center\" scope=\"col\" style=\"border-bottom: #000000 solid 1px;\"><p><span class=\"style7\">DCM HEATERS DRIVER<br /><br/>\n\
mmdonatti 14:f21da0acc9f6 56 <strong>DIAGNOSTICS<br/></strong></span></p>\n\
mmdonatti 14:f21da0acc9f6 57 <p><span class=\"style7\"><strong><em> <a href=\"http://www.lnls.cnpem.br\">LNLS</a></em></strong></span></p></td>\n\
mmdonatti 14:f21da0acc9f6 58 <td width=\"25%\" height=\"142\" align=\"center\" style=\"border-bottom: #000000 solid 1px;\">\n\
mmdonatti 14:f21da0acc9f6 59 <a href=\"http://www.lnls.cnpem.br/grupos/gae/\"><img src=\"http://www.gae.agency/wp-content/uploads/2016/03/Logo_gae_hp_blue.png\" alt=\"GAE\" width=\"305\" height=\"99\" /></a></td>\n\
mmdonatti 14:f21da0acc9f6 60 </tr>\n\
mmdonatti 14:f21da0acc9f6 61 </table>\n<div id=\"data_table\"></div></body></html>\0";
mmdonatti 14:f21da0acc9f6 62
mmdonatti 14:f21da0acc9f6 63 //table colors vector
mmdonatti 14:f21da0acc9f6 64 const char *color[] = {"#C8FFC8\0","#FF0000\0"};
mmdonatti 14:f21da0acc9f6 65
mmdonatti 14:f21da0acc9f6 66 int index_html_len; //index with html length
mmdonatti 14:f21da0acc9f6 67
mmdonatti 14:f21da0acc9f6 68 char buffer[MAX_BUFFER_SIZE]; //receive and transmit buffer
mmdonatti 14:f21da0acc9f6 69 char tmp_buffer[200]; //aux buffer
mmdonatti 14:f21da0acc9f6 70 int status_code; //http status code
mmdonatti 14:f21da0acc9f6 71 char reason_phrase[30]; //http reason phrase
mmdonatti 14:f21da0acc9f6 72
mmdonatti 14:f21da0acc9f6 73 char httpmethod[20]; //http method
mmdonatti 14:f21da0acc9f6 74 char filepath[20]; //file requested
mmdonatti 14:f21da0acc9f6 75 char http_ver[20]; //http version
mmdonatti 14:f21da0acc9f6 76
mmdonatti 14:f21da0acc9f6 77 int idx_buffer; //index buffer
mmdonatti 14:f21da0acc9f6 78
mmdonatti 14:f21da0acc9f6 79 //Debug functions
aktk 10:4a48594c2f44 80 namespace HTTP_SERVER
aktk 10:4a48594c2f44 81 {
aktk 1:3a1fe94c6e42 82 void DEBUG_PRINT_LINE(const char* arg_line)
aktk 1:3a1fe94c6e42 83 {
aktk 1:3a1fe94c6e42 84 #ifdef DEBUG
aktk 10:4a48594c2f44 85 printf("(HTTP_SERVER) ")
aktk 10:4a48594c2f44 86 printf(arg_line);
aktk 10:4a48594c2f44 87 printf("\r\n");
aktk 1:3a1fe94c6e42 88 #endif
aktk 1:3a1fe94c6e42 89 }
aktk 10:4a48594c2f44 90 template<typename T>
aktk 10:4a48594c2f44 91 void DEBUG_PRINT_LINE(const char* arg_line, T arg_t)
aktk 10:4a48594c2f44 92 {
aktk 10:4a48594c2f44 93 #ifdef DEBUG
aktk 10:4a48594c2f44 94 printf("(HTTP_SERVER) ");
aktk 10:4a48594c2f44 95 printf(arg_line, arg_t);
aktk 10:4a48594c2f44 96 printf("\r\n");
aktk 10:4a48594c2f44 97 #endif
aktk 10:4a48594c2f44 98 }
aktk 10:4a48594c2f44 99 template<typename T1, typename T2>
aktk 10:4a48594c2f44 100 void DEBUG_PRINT_LINE(const char* arg_line, T1 arg_t1, T2 arg_t2)
aktk 10:4a48594c2f44 101 {
aktk 10:4a48594c2f44 102 #ifdef DEBUG
aktk 10:4a48594c2f44 103 printf("(HTTP_SERVER) ");
aktk 10:4a48594c2f44 104 printf(arg_line, arg_t1, arg_t2);
aktk 10:4a48594c2f44 105 printf("\r\n");
aktk 10:4a48594c2f44 106 #endif
aktk 10:4a48594c2f44 107 }
aktk 10:4a48594c2f44 108 }
aktk 10:4a48594c2f44 109 using namespace HTTP_SERVER;
aktk 1:3a1fe94c6e42 110
aktk 0:cc483bea4fe3 111 HttpServer::HttpServer()
aktk 0:cc483bea4fe3 112 {
mmdonatti 14:f21da0acc9f6 113 buffer[0] = '\0'; //constructor
aktk 0:cc483bea4fe3 114 }
aktk 0:cc483bea4fe3 115
aktk 0:cc483bea4fe3 116 HttpServer::~HttpServer()
aktk 0:cc483bea4fe3 117 {
aktk 0:cc483bea4fe3 118 }
aktk 0:cc483bea4fe3 119 bool HttpServer::init()
aktk 0:cc483bea4fe3 120 {
aktk 0:cc483bea4fe3 121 // TCP Socket setup
aktk 0:cc483bea4fe3 122 // To open Server-side PORT
aktk 0:cc483bea4fe3 123 if(tcpsvr.bind(TCP_PORT)< 0) {
aktk 0:cc483bea4fe3 124 return false;
mmdonatti 14:f21da0acc9f6 125 }
mmdonatti 14:f21da0acc9f6 126 tcpsvr.set_blocking(true,1500); //set blocking socket
mmdonatti 14:f21da0acc9f6 127
aktk 0:cc483bea4fe3 128 // Server start listening Request from a web browser.
mmdonatti 14:f21da0acc9f6 129
mmdonatti 14:f21da0acc9f6 130 if(tcpsvr.listen(5) < 0) {
aktk 0:cc483bea4fe3 131 return false;
aktk 0:cc483bea4fe3 132 }
mmdonatti 14:f21da0acc9f6 133
mmdonatti 14:f21da0acc9f6 134 index_html_len = strlen(index_html); //calculate string length
aktk 0:cc483bea4fe3 135
aktk 0:cc483bea4fe3 136 return true;
aktk 0:cc483bea4fe3 137 }
aktk 0:cc483bea4fe3 138
mmdonatti 14:f21da0acc9f6 139 bool HttpServer::run(channel *CH)
mmdonatti 14:f21da0acc9f6 140 {
mmdonatti 14:f21da0acc9f6 141 if(tcpsvr.accept(tcpcon) < 0) {
mmdonatti 14:f21da0acc9f6 142 //printf("(HTTP_SERVER) failed to accept connection.\r\n");
mmdonatti 14:f21da0acc9f6 143 return -1;
mmdonatti 14:f21da0acc9f6 144 }
mmdonatti 14:f21da0acc9f6 145 // When conected
mmdonatti 14:f21da0acc9f6 146 while(tcpcon.is_connected())
mmdonatti 14:f21da0acc9f6 147 {
mmdonatti 14:f21da0acc9f6 148 tcpcon.set_blocking(false,100);
mmdonatti 14:f21da0acc9f6 149 //
mmdonatti 14:f21da0acc9f6 150 // Request Analysis
mmdonatti 14:f21da0acc9f6 151 //
mmdonatti 14:f21da0acc9f6 152
mmdonatti 14:f21da0acc9f6 153 DEBUG_PRINT_LINE("DEBUG MODE");
mmdonatti 14:f21da0acc9f6 154 switch(tcpcon.receive(buffer, 1023)) {
mmdonatti 14:f21da0acc9f6 155 case 0:
mmdonatti 14:f21da0acc9f6 156 //DEBUG_PRINT_LINE("received buffer is empty.");
mmdonatti 14:f21da0acc9f6 157 status_code = 400;
mmdonatti 14:f21da0acc9f6 158 sprintf(reason_phrase,"No Request\0");
mmdonatti 14:f21da0acc9f6 159 httpmethod[0] = '\0';
mmdonatti 14:f21da0acc9f6 160 filepath[0] = '\0';
mmdonatti 14:f21da0acc9f6 161 http_ver[0] = '\0';
mmdonatti 14:f21da0acc9f6 162 break;
mmdonatti 14:f21da0acc9f6 163 case -1:
mmdonatti 14:f21da0acc9f6 164 DEBUG_PRINT_LINE("failed to read data from client.");
mmdonatti 14:f21da0acc9f6 165 status_code = 500;
mmdonatti 14:f21da0acc9f6 166 sprintf(reason_phrase,"Internal Server Error\0");
mmdonatti 14:f21da0acc9f6 167 httpmethod[0] = '\0';
mmdonatti 14:f21da0acc9f6 168 filepath[0] = '\0';
mmdonatti 14:f21da0acc9f6 169 http_ver[0] = '\0';
mmdonatti 14:f21da0acc9f6 170 break;
mmdonatti 14:f21da0acc9f6 171 default:
mmdonatti 14:f21da0acc9f6 172 DEBUG_PRINT_LINE("Received Data: %d",strlen(buffer));
mmdonatti 14:f21da0acc9f6 173 DEBUG_PRINT_LINE("-->\r\n");
mmdonatti 14:f21da0acc9f6 174 DEBUG_PRINT_LINE("%.*s[End of Request]",strlen(buffer),buffer);
mmdonatti 14:f21da0acc9f6 175 // get HTTP method, File path, HTTP version
mmdonatti 14:f21da0acc9f6 176 sprintf(httpmethod,strtok(buffer," "));
mmdonatti 14:f21da0acc9f6 177 filepath[0] = '\0';
mmdonatti 14:f21da0acc9f6 178 sprintf(http_ver,"HTTP/1.1\0");
mmdonatti 14:f21da0acc9f6 179 DEBUG_PRINT_LINE("httpmethod: %s", httpmethod);
mmdonatti 14:f21da0acc9f6 180 DEBUG_PRINT_LINE("file path: %s", filepath);
mmdonatti 14:f21da0acc9f6 181 DEBUG_PRINT_LINE("http ver : %s", http_ver);
mmdonatti 14:f21da0acc9f6 182 break;
aktk 0:cc483bea4fe3 183 }
mmdonatti 14:f21da0acc9f6 184
mmdonatti 14:f21da0acc9f6 185 if (httpmethod[0] == '\0') {
mmdonatti 14:f21da0acc9f6 186 buffer[MAX_BUFFER_SIZE - 1] = '\0';
mmdonatti 14:f21da0acc9f6 187 sprintf(buffer,"%s %d %s\r\nConnection: Close\r\n\r\n\0", http_ver, status_code, reason_phrase);
mmdonatti 14:f21da0acc9f6 188 DEBUG_PRINT_LINE("echo back done.");
mmdonatti 14:f21da0acc9f6 189 break;
mmdonatti 14:f21da0acc9f6 190 }
mmdonatti 14:f21da0acc9f6 191
mmdonatti 14:f21da0acc9f6 192 // Response
mmdonatti 14:f21da0acc9f6 193 if (strcmp(httpmethod,"GET") == 0 ) //GET request - always index.html stoed in index_html
mmdonatti 14:f21da0acc9f6 194 {
mmdonatti 14:f21da0acc9f6 195 DEBUG_PRINT_LINE("GET request incomming.");
mmdonatti 14:f21da0acc9f6 196
mmdonatti 14:f21da0acc9f6 197 buffer[MAX_BUFFER_SIZE-1] = '\0';
mmdonatti 14:f21da0acc9f6 198 status_code = 200;
mmdonatti 14:f21da0acc9f6 199 sprintf(reason_phrase,"OK\0");
aktk 1:3a1fe94c6e42 200
mmdonatti 14:f21da0acc9f6 201 sprintf(buffer,"%s %d %s\r\nConnection: Close\r\nContent-Type: text/html\r\nKeep-Alive: timeout=15\r\n\r\n\0", http_ver, status_code, reason_phrase);
mmdonatti 14:f21da0acc9f6 202 tcpcon.send_all(buffer,strlen(buffer));
mmdonatti 14:f21da0acc9f6 203 tcpcon.send_all((char*)index_html,index_html_len);
mmdonatti 14:f21da0acc9f6 204
mmdonatti 14:f21da0acc9f6 205 break;
mmdonatti 14:f21da0acc9f6 206 }
mmdonatti 14:f21da0acc9f6 207 if (strcmp(httpmethod,"POST") == 0 ) //POST request - javascript request
mmdonatti 14:f21da0acc9f6 208 {
mmdonatti 14:f21da0acc9f6 209 DEBUG_PRINT_LINE("POST request incomming.");
mmdonatti 14:f21da0acc9f6 210 status_code = 200;
mmdonatti 14:f21da0acc9f6 211 sprintf(reason_phrase,"OK\0");
mmdonatti 14:f21da0acc9f6 212
mmdonatti 14:f21da0acc9f6 213 sprintf(buffer,"%s %d %s\r\nConnection: Close\r\n\r\n\0", http_ver, status_code, reason_phrase);
aktk 0:cc483bea4fe3 214
mmdonatti 14:f21da0acc9f6 215 for(idx_buffer=0;idx_buffer<=7;idx_buffer++)
mmdonatti 14:f21da0acc9f6 216 {
mmdonatti 14:f21da0acc9f6 217 sprintf(tmp_buffer,"%4.2f %3.2f %d %3.2f %s %d %s %d %s %d %s %d \0",CH[idx_buffer].voltage,CH[idx_buffer].current,CH[idx_buffer].control,CH[idx_buffer].limit,\
mmdonatti 14:f21da0acc9f6 218 color[CH[idx_buffer].failure>0],CH[idx_buffer].failure,\
mmdonatti 14:f21da0acc9f6 219 color[CH[idx_buffer].overload>ERROR_REP],CH[idx_buffer].overload>ERROR_REP,\
mmdonatti 14:f21da0acc9f6 220 color[CH[idx_buffer].noload>ERROR_REP],CH[idx_buffer].noload>ERROR_REP,\
mmdonatti 14:f21da0acc9f6 221 color[CH[idx_buffer].enable==0],CH[idx_buffer].enable);
mmdonatti 14:f21da0acc9f6 222 strcat(buffer,tmp_buffer);
aktk 0:cc483bea4fe3 223
mmdonatti 14:f21da0acc9f6 224 }
mmdonatti 14:f21da0acc9f6 225 tcpcon.send_all(buffer,strlen(buffer));
mmdonatti 14:f21da0acc9f6 226 break;
mmdonatti 14:f21da0acc9f6 227
aktk 0:cc483bea4fe3 228
mmdonatti 14:f21da0acc9f6 229 }
aktk 0:cc483bea4fe3 230 }
mmdonatti 14:f21da0acc9f6 231 tcpcon.close(); //always close the connection
aktk 0:cc483bea4fe3 232 return 0;
aktk 0:cc483bea4fe3 233 }