LRSD stephane / Mbed 2 deprecated WEBserverv1

Dependencies:   mbed

Committer:
geiineuville
Date:
Sat Sep 03 09:42:32 2011 +0000
Revision:
0:4570f87afab6
v1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geiineuville 0:4570f87afab6 1 // original Written by IVA2K
geiineuville 0:4570f87afab6 2 //
geiineuville 0:4570f87afab6 3 // Example of HTTPServer with additional features:
geiineuville 0:4570f87afab6 4 // * SNTP Client (Simple NTP)
geiineuville 0:4570f87afab6 5 // * Link status indication (LED4 or RJ45 socket LED on MBED-BoB2-mod)
geiineuville 0:4570f87afab6 6 // * Local file system (create index.htm page on MBED!)
geiineuville 0:4570f87afab6 7 // * SD-based WebServer
geiineuville 0:4570f87afab6 8 // * Static HTML page
geiineuville 0:4570f87afab6 9 // * Dynamic HTML page
geiineuville 0:4570f87afab6 10 // modification fron LRSD from the pub-iva2k-ethsntp project
geiineuville 0:4570f87afab6 11 // i am not a specialist , stil bugs , but that works
geiineuville 0:4570f87afab6 12 // Instructions:
geiineuville 0:4570f87afab6 13 // 2 Plug ETH connector into your network(with a switch for direct pc, needs DHCP to get IP address and Internet connection)
geiineuville 0:4570f87afab6 14 // 3 Plug MBED using USB cable
geiineuville 0:4570f87afab6 15 // 4 need to have Installed MBED serial driver (http://mbed.org/handbook/SerialPC)
geiineuville 0:4570f87afab6 16 // 5 Copy compiled .bin to your MBED (make sure target device selected in the compiler is correct)
geiineuville 0:4570f87afab6 17 // 6 Open terminal on the mbed serial port
geiineuville 0:4570f87afab6 18 // 7 Push MBED reset button
geiineuville 0:4570f87afab6 19 // 8 Terminal will display info message with mac address, followed by IP address
geiineuville 0:4570f87afab6 20 // in the following items, i put 192.168.1.77 line 144 : IPv4(192,168,1,77),
geiineuville 0:4570f87afab6 21 // 9 Open browser and enter the following URL:
geiineuville 0:4570f87afab6 22 // http://192,168,1,77 /
geiineuville 0:4570f87afab6 23 // !!
geiineuville 0:4570f87afab6 24 // 13 Open browser and enter the following URL:
geiineuville 0:4570f87afab6 25 // http://192.168.1.77/static.htm
geiineuville 0:4570f87afab6 26 // 14 The browser will show static HTML page
geiineuville 0:4570f87afab6 27 // 15 Open browser and enter the following URL:
geiineuville 0:4570f87afab6 28 // http://192,168,1,77/dynamic.htm
geiineuville 0:4570f87afab6 29 // 16 The browser will show dynamic HTML page
geiineuville 0:4570f87afab6 30 // 17 Create a simple index.htm page on the MBED
geiineuville 0:4570f87afab6 31 // 18 Open browser and enter the following URL:
geiineuville 0:4570f87afab6 32 // http://192,168,1,77
geiineuville 0:4570f87afab6 33 // 19 The browser will show index HTM page not HTML! ( 3 char extension , no directorie)
geiineuville 0:4570f87afab6 34 // 20 Create a simple index.htm page on a micro SD card, plug the card into MBED-BoB2
geiineuville 0:4570f87afab6 35 // 22 The browser will show index HTM page from SD card
geiineuville 0:4570f87afab6 36 // 23 Optionally, create file "sntp.ini" on MBED or SD card. Copy-paste SNTP configuration from the terminal into this file and modify to your needs.
geiineuville 0:4570f87afab6 37 //
geiineuville 0:4570f87afab6 38 int aip4,aip3,aip2,aip1;
geiineuville 0:4570f87afab6 39 #include "mbed.h"
geiineuville 0:4570f87afab6 40 #include "NewTextLCD.h"
geiineuville 0:4570f87afab6 41 #include "SDFileSystem.h"
geiineuville 0:4570f87afab6 42 #include "HTTPServer.h"
geiineuville 0:4570f87afab6 43 #include "HTTPFS.h"
geiineuville 0:4570f87afab6 44 #include "HTTPStaticPage.h"
geiineuville 0:4570f87afab6 45 #include "HTTPDynamicPage.h"
geiineuville 0:4570f87afab6 46 #include "HTTPLinkStatus.h"
geiineuville 0:4570f87afab6 47 #include "SNTPClient.h"
geiineuville 0:4570f87afab6 48 #define CLS "\033[2J"
geiineuville 0:4570f87afab6 49
geiineuville 0:4570f87afab6 50
geiineuville 0:4570f87afab6 51
geiineuville 0:4570f87afab6 52 AnalogIn Potm(p15); //var. resistor
geiineuville 0:4570f87afab6 53 TextLCD lcd(p26, p25, p24, p23, p22, p20, p19, TextLCD::LCD20x4); // rs, rw, e, d4-d7
geiineuville 0:4570f87afab6 54
geiineuville 0:4570f87afab6 55 #define MAX_DYNAMIC_CONTENT_LEN 2048 // a finir
geiineuville 0:4570f87afab6 56 char dynamic_content[MAX_DYNAMIC_CONTENT_LEN];
geiineuville 0:4570f87afab6 57
geiineuville 0:4570f87afab6 58 const char content_fmt[] =
geiineuville 0:4570f87afab6 59 "<HTML>"
geiineuville 0:4570f87afab6 60 "<HEAD>"
geiineuville 0:4570f87afab6 61 "<title>Dynamic Page</title>"
geiineuville 0:4570f87afab6 62 "</HEAD>"
geiineuville 0:4570f87afab6 63 "<BODY>" //
geiineuville 0:4570f87afab6 64 "<H1>Helo World</H1>" // "<H1>Hello World</H1>"
geiineuville 0:4570f87afab6 65 "<p>Page generated dynamically from code.</p>"
geiineuville 0:4570f87afab6 66 "<p>URL=%s</p>"
geiineuville 0:4570f87afab6 67 "<p>Header Fields=%s</p>"
geiineuville 0:4570f87afab6 68 "</BODY></HTML>"
geiineuville 0:4570f87afab6 69 ;
geiineuville 0:4570f87afab6 70
geiineuville 0:4570f87afab6 71 DigitalOut led1(LED1, "led1");
geiineuville 0:4570f87afab6 72 DigitalOut led2(LED2, "led2");
geiineuville 0:4570f87afab6 73 DigitalOut led3(LED3, "led3");
geiineuville 0:4570f87afab6 74 DigitalOut led4(LED4, "led4");
geiineuville 0:4570f87afab6 75 DigitalIn sw1(p9, "sw1");
geiineuville 0:4570f87afab6 76 DigitalIn sw2(p10, "sw2");
geiineuville 0:4570f87afab6 77 LocalFileSystem local("local");
geiineuville 0:4570f87afab6 78 SDFileSystem sd(p11, p12, p13, p14, "sd"); // MBED-BoB2
geiineuville 0:4570f87afab6 79
geiineuville 0:4570f87afab6 80
geiineuville 0:4570f87afab6 81 extern Ethernet eth; // eth is defined elsewhere, avoid compiler error.
geiineuville 0:4570f87afab6 82 Serial pc(USBTX, USBRX);
geiineuville 0:4570f87afab6 83 int gDebug=1;
geiineuville 0:4570f87afab6 84 float ana = 1.0;
geiineuville 0:4570f87afab6 85 float gWait = 0.05; // Main loop wait timeout
geiineuville 0:4570f87afab6 86
geiineuville 0:4570f87afab6 87
geiineuville 0:4570f87afab6 88
geiineuville 0:4570f87afab6 89 HTTPStatus myDynamicPage(HTTPConnection *con, HTTPDynamicPageData *pd) {
geiineuville 0:4570f87afab6 90 #if 0
geiineuville 0:4570f87afab6 91 // Static example. With this, we don't really need HTTPStaticPage
geiineuville 0:4570f87afab6 92 pd->size = 0; // let it measure our page
geiineuville 0:4570f87afab6 93 pd->page = (char*)content; // Nothing dynamic about that yet, but we can now get loose here.
geiineuville 0:4570f87afab6 94 pd->page_free = NULL; // No mem free() needed
geiineuville 0:4570f87afab6 95 #elif 0
geiineuville 0:4570f87afab6 96 // Dynamic example, static buffer
geiineuville 0:4570f87afab6 97 pd->size = sprintf(dynamic_content, content_fmt, con->getURL(), con->getHeaderFields());
geiineuville 0:4570f87afab6 98 pd->page = (char*)dynamic_content;
geiineuville 0:4570f87afab6 99 pd->page_free = NULL; // No mem free() needed
geiineuville 0:4570f87afab6 100 if(pd->size > sizeof(dynamic_content)) printf("ASSERTION FAILED: %s:%d\r\n", __FILE__, __LINE__); // Buffer overrun
geiineuville 0:4570f87afab6 101 #else
geiineuville 0:4570f87afab6 102 // Dynamic example, dynamic buffer
geiineuville 0:4570f87afab6 103 int size = sizeof(content_fmt) + 512; // Just guess how much the data will expand
geiineuville 0:4570f87afab6 104 char *buf = (char *)malloc(size);
geiineuville 0:4570f87afab6 105 if (buf) {
geiineuville 0:4570f87afab6 106 pd->size = sprintf(buf, content_fmt, con->getURL(), con->getHeaderFields());
geiineuville 0:4570f87afab6 107 pd->page = buf;
geiineuville 0:4570f87afab6 108 pd->page_free = &free; // Use free() when done
geiineuville 0:4570f87afab6 109 if(pd->size > size) printf("ASSERTION FAILED: %s:%d\r\n", __FILE__, __LINE__); // Buffer overrun
geiineuville 0:4570f87afab6 110 #endif
geiineuville 0:4570f87afab6 111 }
geiineuville 0:4570f87afab6 112 return HTTP_OK;
geiineuville 0:4570f87afab6 113 }
geiineuville 0:4570f87afab6 114 //*******************************************MAIN***************************
geiineuville 0:4570f87afab6 115 //****************************************************************************
geiineuville 0:4570f87afab6 116 int main(void)
geiineuville 0:4570f87afab6 117 {
geiineuville 0:4570f87afab6 118 lcd.cls();
geiineuville 0:4570f87afab6 119 pc.baud(115200);
geiineuville 0:4570f87afab6 120 lcd.printf("LRSD web SERVER .!.\n");
geiineuville 0:4570f87afab6 121 printf("LRSD debout !!\n");
geiineuville 0:4570f87afab6 122 char tab[] = // ce tableau est mis en ram
geiineuville 0:4570f87afab6 123 "<HTML>" // il stock un fichier htm , qui sera ré écrit dans BOUCLE POLL
geiineuville 0:4570f87afab6 124 "<HEAD>"
geiineuville 0:4570f87afab6 125 "<title>Static Page</title>"
geiineuville 0:4570f87afab6 126 "</HEAD>"
geiineuville 0:4570f87afab6 127 "<BODY>" //V le v pointe en dessous le lieu
geiineuville 0:4570f87afab6 128 "<H1> tension sur le potentiomètre= volt </H1>" // lieu de l'insertion
geiineuville 0:4570f87afab6 129 "</BODY></HTML>";
geiineuville 0:4570f87afab6 130 char mac[6];
geiineuville 0:4570f87afab6 131 bool use_sd = false;
geiineuville 0:4570f87afab6 132 char res[10]= "1234000";
geiineuville 0:4570f87afab6 133 int pt = 85;
geiineuville 0:4570f87afab6 134 led1=1;
geiineuville 0:4570f87afab6 135 led2=1;
geiineuville 0:4570f87afab6 136 led3=1;
geiineuville 0:4570f87afab6 137 led4=1;
geiineuville 0:4570f87afab6 138
geiineuville 0:4570f87afab6 139 // Start RTC
geiineuville 0:4570f87afab6 140 time_t seconds = time(NULL);
geiineuville 0:4570f87afab6 141 if (seconds == (unsigned)-1 || seconds == 0) {
geiineuville 0:4570f87afab6 142 seconds = 1256729737; // Set RTC time to Wed, 28 Oct 2009 11:35:37
geiineuville 0:4570f87afab6 143 set_time(seconds);
geiineuville 0:4570f87afab6 144 printf("RTC initialized, start time %d seconds\r\n", seconds);
geiineuville 0:4570f87afab6 145 }
geiineuville 0:4570f87afab6 146 aip4 = 192; aip3 = 168 ; aip2 = 1 ; aip1 = 77; // pour plus tard les changer par le clavier
geiineuville 0:4570f87afab6 147 lcd.locate(0,1);
geiineuville 0:4570f87afab6 148 lcd.printf("IP:%hhu.%hhu.%hhu.%hhu\n",
geiineuville 0:4570f87afab6 149 aip4, aip3, aip2, aip1);
geiineuville 0:4570f87afab6 150 HTTPServer http("mbed", // static IP address and domain name.
geiineuville 0:4570f87afab6 151 IPv4(aip4,aip3,aip2,aip1), // IPv4 is a helper function which allows to rtype ipaddresses direct
geiineuville 0:4570f87afab6 152 IPv4(255,255,0,0),
geiineuville 0:4570f87afab6 153 IPv4(192,168,1,0),
geiineuville 0:4570f87afab6 154 IPv4(192,168,1,0),
geiineuville 0:4570f87afab6 155 80); // port 80 généralement
geiineuville 0:4570f87afab6 156 char *hostname = "mbed";
geiineuville 0:4570f87afab6 157 // HTTPServer http(hostname); // Use DHCP
geiineuville 0:4570f87afab6 158 http.timeout(10000); // Sets the timout for a HTTP request. The timout is the time which is allowed to spent between two incomming TCP packets. If the time is passed the connection will be closed.
geiineuville 0:4570f87afab6 159
geiineuville 0:4570f87afab6 160 eth.address(mac);
geiineuville 0:4570f87afab6 161 pc.printf(CLS "\r\n\r\nHTTPServer \"%s\" started\r\nMAC %02X:%02X:%02X:%02X:%02X:%02X\r\n%s",
geiineuville 0:4570f87afab6 162 hostname, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
geiineuville 0:4570f87afab6 163 gDebug?"Debug is ON\r\n":""
geiineuville 0:4570f87afab6 164 );
geiineuville 0:4570f87afab6 165
geiineuville 0:4570f87afab6 166
geiineuville 0:4570f87afab6 167 //
geiineuville 0:4570f87afab6 168
geiineuville 0:4570f87afab6 169 // Check if we can use SD card for the web server
geiineuville 0:4570f87afab6 170 FILE *fp = fopen("/sd/index.htm", "r");
geiineuville 0:4570f87afab6 171 if (fp == NULL) {
geiineuville 0:4570f87afab6 172 if (gDebug) printf("DEBUG: No SD card found or no index.htm file - using LocalFilesystem for WebServer.\r\n");
geiineuville 0:4570f87afab6 173 } else {
geiineuville 0:4570f87afab6 174 use_sd = true;
geiineuville 0:4570f87afab6 175 fclose(fp);
geiineuville 0:4570f87afab6 176 if (gDebug) printf("DEBUG: Found SD card with index.htm file - using SD for WebServer.\r\n");
geiineuville 0:4570f87afab6 177 }
geiineuville 0:4570f87afab6 178
geiineuville 0:4570f87afab6 179 if (0 != SNTPReadIniFile("/sd/sntp.ini") )
geiineuville 0:4570f87afab6 180 SNTPReadIniFile("/local/sntp.ini");
geiineuville 0:4570f87afab6 181 SNTPWriteIniFile(stdout);
geiineuville 0:4570f87afab6 182
geiineuville 0:4570f87afab6 183
geiineuville 0:4570f87afab6 184 http.addHandler(new HTTPLinkStatus("/",
geiineuville 0:4570f87afab6 185 #if MBED_BOB2
geiineuville 0:4570f87afab6 186 p25, p26, // MBED-BoB2-mods
geiineuville 0:4570f87afab6 187 #else
geiineuville 0:4570f87afab6 188 LED3, LED4,
geiineuville 0:4570f87afab6 189 #endif
geiineuville 0:4570f87afab6 190 0.1,
geiineuville 0:4570f87afab6 191 /*do_urlfile*/ true, /*do_link_printf*/ true, /*do_log_printf*/ false,
geiineuville 0:4570f87afab6 192 /*log_file*/ ( (gDebug>1) ? (use_sd ? "/sd/httpd.log" : "/local/httpd.log") : NULL)
geiineuville 0:4570f87afab6 193 )); // Should be the first handler to get a preview of all requests
geiineuville 0:4570f87afab6 194 led2=0;
geiineuville 0:4570f87afab6 195
geiineuville 0:4570f87afab6 196 // Static/Dynamic pages must be installed before FileSystem on /
geiineuville 0:4570f87afab6 197 // http.addHandler(new HTTPStaticPage("/static.htm", content, strlen(content))); // moi
geiineuville 0:4570f87afab6 198 http.addHandler(new HTTPStaticPage("/static.htm", tab, strlen(tab)));
geiineuville 0:4570f87afab6 199 http.addHandler(new HTTPDynamicPage("/dynamic.htm", &myDynamicPage));
geiineuville 0:4570f87afab6 200 http.addHandler(new HTTPFileSystemHandler("/", use_sd ? "/sd/" : "/local/"));
geiineuville 0:4570f87afab6 201 led3=0;
geiineuville 0:4570f87afab6 202
geiineuville 0:4570f87afab6 203 // FIXME: BUG If eth is not plugged, http.bind() hangs!
geiineuville 0:4570f87afab6 204 http.bind();
geiineuville 0:4570f87afab6 205
geiineuville 0:4570f87afab6 206 SNTPClientInit();
geiineuville 0:4570f87afab6 207 led4 = 0;
geiineuville 0:4570f87afab6 208 // pc.printf("\r"); // Add linefeed for stupid Hyperterminal
geiineuville 0:4570f87afab6 209
geiineuville 0:4570f87afab6 210 while(1) { //BOUCLE POLL
geiineuville 0:4570f87afab6 211 http.poll(); // Have to call this method at least every 250ms to let the http server run.
geiineuville 0:4570f87afab6 212 wait(gWait);
geiineuville 0:4570f87afab6 213
geiineuville 0:4570f87afab6 214 ana = Potm.read(); // mon travail en temps reel like ( gWait)
geiineuville 0:4570f87afab6 215 lcd.locate(0,2); //ligne 2 lcd
geiineuville 0:4570f87afab6 216 ana = 3.2*ana; // mise au niveau 3v2
geiineuville 0:4570f87afab6 217 lcd.printf("Value: %1.2f", ana);
geiineuville 0:4570f87afab6 218 sprintf(res, "%f", ana); // met ana en chaine dans res[]
geiineuville 0:4570f87afab6 219 // pt = pt +1 ; // change le pointage dans la ligne htm au cas ou
geiineuville 0:4570f87afab6 220 tab[pt+1] = res[0]; // met 4 char de la chaine
geiineuville 0:4570f87afab6 221 tab[pt+2] = res[1];
geiineuville 0:4570f87afab6 222 tab[pt+3] = res[2];
geiineuville 0:4570f87afab6 223 tab[pt+4] = res[3];
geiineuville 0:4570f87afab6 224 }
geiineuville 0:4570f87afab6 225 }
geiineuville 0:4570f87afab6 226
geiineuville 0:4570f87afab6 227 //END