LRSD stephane / Mbed 2 deprecated WEBserver0-lrsd

Dependencies:   mbed

Committer:
geiineuville
Date:
Fri Sep 02 08:36:24 2011 +0000
Revision:
0:441400ffd086
V0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geiineuville 0:441400ffd086 1 // original Written by IVA2K
geiineuville 0:441400ffd086 2 //
geiineuville 0:441400ffd086 3 // Example of HTTPServer with additional features:
geiineuville 0:441400ffd086 4 // * SNTP Client (Simple NTP)
geiineuville 0:441400ffd086 5 // * Link status indication (LED4 or RJ45 socket LED on MBED-BoB2-mod)
geiineuville 0:441400ffd086 6 // * Local file system (create index.htm page on MBED!)
geiineuville 0:441400ffd086 7 // * SD-based WebServer
geiineuville 0:441400ffd086 8 // * ////RPC-able class (myrpc, allows remote function call that blinks LED1 N times)
geiineuville 0:441400ffd086 9 // * Static HTML page
geiineuville 0:441400ffd086 10 // * Dynamic HTML page
geiineuville 0:441400ffd086 11 // modification fron LRSD from the pub-iva2k-ethsntp project
geiineuville 0:441400ffd086 12 // i am not a specialist , stil bugs , but that works
geiineuville 0:441400ffd086 13 // Instructions:
geiineuville 0:441400ffd086 14 // 2 Plug ETH connector into your network(with a switch for direct pc, needs DHCP to get IP address and Internet connection)
geiineuville 0:441400ffd086 15 // 3 Plug MBED using USB cable
geiineuville 0:441400ffd086 16 // 4 need to have Installed MBED serial driver (http://mbed.org/handbook/SerialPC)
geiineuville 0:441400ffd086 17 // 5 Copy compiled .bin to your MBED (make sure target device selected in the compiler is correct)
geiineuville 0:441400ffd086 18 // 6 Open terminal on the mbed serial port
geiineuville 0:441400ffd086 19 // 7 Push MBED reset button
geiineuville 0:441400ffd086 20 // 8 Terminal will display info message with mac address, followed by IP address
geiineuville 0:441400ffd086 21 // in the following items, i put 192.168.1.77 line 144 : IPv4(192,168,1,77),
geiineuville 0:441400ffd086 22 // 9 Open browser and enter the following URL:
geiineuville 0:441400ffd086 23 // http://192,168,1,77 /
geiineuville 0:441400ffd086 24 // !!
geiineuville 0:441400ffd086 25 // 13 Open browser and enter the following URL:
geiineuville 0:441400ffd086 26 // http://192.168.1.77/static.htm
geiineuville 0:441400ffd086 27 // 14 The browser will show static HTML page
geiineuville 0:441400ffd086 28 // 15 Open browser and enter the following URL:
geiineuville 0:441400ffd086 29 // http://192,168,1,77/dynamic.htm
geiineuville 0:441400ffd086 30 // 16 The browser will show dynamic HTML page
geiineuville 0:441400ffd086 31 // 17 Create a simple index.htm page on the MBED
geiineuville 0:441400ffd086 32 // 18 Open browser and enter the following URL:
geiineuville 0:441400ffd086 33 // http://192,168,1,77
geiineuville 0:441400ffd086 34 // 19 The browser will show index HTM page not HTML! ( 3 char extension , no directorie)
geiineuville 0:441400ffd086 35 // 20 Create a simple index.htm page on a micro SD card, plug the card into MBED-BoB2
geiineuville 0:441400ffd086 36 // 22 The browser will show index HTM page from SD card
geiineuville 0:441400ffd086 37 // 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:441400ffd086 38 //
geiineuville 0:441400ffd086 39
geiineuville 0:441400ffd086 40 #include "mbed.h"
geiineuville 0:441400ffd086 41 #include "SDFileSystem.h"
geiineuville 0:441400ffd086 42 #include "HTTPServer.h"
geiineuville 0:441400ffd086 43 #include "HTTPRPC.h"
geiineuville 0:441400ffd086 44 #include "HTTPFS.h"
geiineuville 0:441400ffd086 45 #include "HTTPStaticPage.h"
geiineuville 0:441400ffd086 46 #include "HTTPDynamicPage.h"
geiineuville 0:441400ffd086 47 #include "HTTPLinkStatus.h"
geiineuville 0:441400ffd086 48 #include "SNTPClient.h"
geiineuville 0:441400ffd086 49
geiineuville 0:441400ffd086 50 #define CLS "\033[2J"
geiineuville 0:441400ffd086 51
geiineuville 0:441400ffd086 52 const char content[] =
geiineuville 0:441400ffd086 53 "<HTML>"
geiineuville 0:441400ffd086 54 "<HEAD>"
geiineuville 0:441400ffd086 55 "<title>Static Page</title>"
geiineuville 0:441400ffd086 56 "</HEAD>"
geiineuville 0:441400ffd086 57 "<BODY>"
geiineuville 0:441400ffd086 58 "<H1>Hello World</H1>"
geiineuville 0:441400ffd086 59 "<p>Page generated statically from code.</p>"
geiineuville 0:441400ffd086 60 "</BODY></HTML>"
geiineuville 0:441400ffd086 61 ;
geiineuville 0:441400ffd086 62
geiineuville 0:441400ffd086 63 #define MAX_DYNAMIC_CONTENT_LEN 2048
geiineuville 0:441400ffd086 64 char dynamic_content[MAX_DYNAMIC_CONTENT_LEN];
geiineuville 0:441400ffd086 65
geiineuville 0:441400ffd086 66 const char content_fmt[] =
geiineuville 0:441400ffd086 67 "<HTML>"
geiineuville 0:441400ffd086 68 "<HEAD>"
geiineuville 0:441400ffd086 69 "<title>Dynamic Page</title>"
geiineuville 0:441400ffd086 70 "</HEAD>"
geiineuville 0:441400ffd086 71 "<BODY>"
geiineuville 0:441400ffd086 72 "<H1>Hello World</H1>"
geiineuville 0:441400ffd086 73 "<p>Page generated dynamically from code.</p>"
geiineuville 0:441400ffd086 74 "<p>URL=%s</p>"
geiineuville 0:441400ffd086 75 "<p>Header Fields=%s</p>"
geiineuville 0:441400ffd086 76 "</BODY></HTML>"
geiineuville 0:441400ffd086 77 ;
geiineuville 0:441400ffd086 78
geiineuville 0:441400ffd086 79 DigitalOut led1(LED1, "led1");
geiineuville 0:441400ffd086 80 DigitalOut led2(LED2, "led2");
geiineuville 0:441400ffd086 81 DigitalOut led3(LED3, "led3");
geiineuville 0:441400ffd086 82 DigitalOut led4(LED4, "led4");
geiineuville 0:441400ffd086 83 DigitalIn sw1(p9, "sw1");
geiineuville 0:441400ffd086 84 DigitalIn sw2(p10, "sw2");
geiineuville 0:441400ffd086 85 LocalFileSystem local("local");
geiineuville 0:441400ffd086 86 SDFileSystem sd(p11, p12, p13, p14, "sd"); // MBED-BoB2
geiineuville 0:441400ffd086 87
geiineuville 0:441400ffd086 88 #include "myrpc.h"
geiineuville 0:441400ffd086 89 myrpc myrpc1(LED1, "myrpc1");
geiineuville 0:441400ffd086 90
geiineuville 0:441400ffd086 91 extern Ethernet eth; // eth is defined elsewhere, avoid compiler error.
geiineuville 0:441400ffd086 92 Serial pc(USBTX, USBRX);
geiineuville 0:441400ffd086 93 int gDebug=1;
geiineuville 0:441400ffd086 94 float gWait = 0.005; // Main loop wait timeout
geiineuville 0:441400ffd086 95
geiineuville 0:441400ffd086 96 HTTPStatus myDynamicPage(HTTPConnection *con, HTTPDynamicPageData *pd) {
geiineuville 0:441400ffd086 97 #if 0
geiineuville 0:441400ffd086 98 // Static example. With this, we don't really need HTTPStaticPage
geiineuville 0:441400ffd086 99 pd->size = 0; // let it measure our page
geiineuville 0:441400ffd086 100 pd->page = (char*)content; // Nothing dynamic about that yet, but we can now get loose here.
geiineuville 0:441400ffd086 101 pd->page_free = NULL; // No mem free() needed
geiineuville 0:441400ffd086 102 #elif 0
geiineuville 0:441400ffd086 103 // Dynamic example, static buffer
geiineuville 0:441400ffd086 104 pd->size = sprintf(dynamic_content, content_fmt, con->getURL(), con->getHeaderFields());
geiineuville 0:441400ffd086 105 pd->page = (char*)dynamic_content;
geiineuville 0:441400ffd086 106 pd->page_free = NULL; // No mem free() needed
geiineuville 0:441400ffd086 107 if(pd->size > sizeof(dynamic_content)) printf("ASSERTION FAILED: %s:%d\r\n", __FILE__, __LINE__); // Buffer overrun
geiineuville 0:441400ffd086 108 #else
geiineuville 0:441400ffd086 109 // Dynamic example, dynamic buffer
geiineuville 0:441400ffd086 110 int size = sizeof(content_fmt) + 512; // Just guess how much the data will expand
geiineuville 0:441400ffd086 111 char *buf = (char *)malloc(size);
geiineuville 0:441400ffd086 112 if (buf) {
geiineuville 0:441400ffd086 113 pd->size = sprintf(buf, content_fmt, con->getURL(), con->getHeaderFields());
geiineuville 0:441400ffd086 114 pd->page = buf;
geiineuville 0:441400ffd086 115 pd->page_free = &free; // Use free() when done
geiineuville 0:441400ffd086 116 if(pd->size > size) printf("ASSERTION FAILED: %s:%d\r\n", __FILE__, __LINE__); // Buffer overrun
geiineuville 0:441400ffd086 117 #endif
geiineuville 0:441400ffd086 118 }
geiineuville 0:441400ffd086 119 return HTTP_OK;
geiineuville 0:441400ffd086 120 }
geiineuville 0:441400ffd086 121
geiineuville 0:441400ffd086 122 int main(void) {
geiineuville 0:441400ffd086 123 pc.baud(115200);
geiineuville 0:441400ffd086 124 printf("Aum Sri Ganeshay Namh !!\n");
geiineuville 0:441400ffd086 125
geiineuville 0:441400ffd086 126 char mac[6];
geiineuville 0:441400ffd086 127 int sw1_old=0, sw2_old=0;
geiineuville 0:441400ffd086 128 bool use_sd = false;
geiineuville 0:441400ffd086 129
geiineuville 0:441400ffd086 130 led1=1;
geiineuville 0:441400ffd086 131 led2=1;
geiineuville 0:441400ffd086 132 led3=1;
geiineuville 0:441400ffd086 133 led4=1;
geiineuville 0:441400ffd086 134
geiineuville 0:441400ffd086 135 // Start RTC
geiineuville 0:441400ffd086 136 time_t seconds = time(NULL);
geiineuville 0:441400ffd086 137 if (seconds == (unsigned)-1 || seconds == 0) {
geiineuville 0:441400ffd086 138 seconds = 1256729737; // Set RTC time to Wed, 28 Oct 2009 11:35:37
geiineuville 0:441400ffd086 139 set_time(seconds);
geiineuville 0:441400ffd086 140 printf("RTC initialized, start time %d seconds\r\n", seconds);
geiineuville 0:441400ffd086 141 }
geiineuville 0:441400ffd086 142 HTTPServer http("mbed", // Brings up the device with static IP address and domain name.
geiineuville 0:441400ffd086 143 IPv4(192,168,1,77), // IPv4 is a helper function which allows to rtype ipaddresses direct
geiineuville 0:441400ffd086 144 IPv4(255,255,0,0), // as numbers in C++.
geiineuville 0:441400ffd086 145 IPv4(192,168,1,0), // the device address is set to 192.168.0.44, netmask 255.255.255.0
geiineuville 0:441400ffd086 146 IPv4(192,168,1,0), // default gateway is 192.168.0.1 and dns to 192.168.0.1 as well.
geiineuville 0:441400ffd086 147 80); // And port is on 8080. Default port is 80.
geiineuville 0:441400ffd086 148 char *hostname = "mbed";
geiineuville 0:441400ffd086 149 // HTTPServer http(hostname); // Use DHCP
geiineuville 0:441400ffd086 150 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:441400ffd086 151
geiineuville 0:441400ffd086 152 eth.address(mac);
geiineuville 0:441400ffd086 153 pc.printf(CLS "\r\n\r\nHTTPServer \"%s\" started\r\nMAC %02X:%02X:%02X:%02X:%02X:%02X\r\n%s",
geiineuville 0:441400ffd086 154 hostname, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5],
geiineuville 0:441400ffd086 155 gDebug?"Debug is ON\r\n":""
geiineuville 0:441400ffd086 156 );
geiineuville 0:441400ffd086 157
geiineuville 0:441400ffd086 158 Base::add_rpc_class<AnalogIn>();
geiineuville 0:441400ffd086 159 Base::add_rpc_class<AnalogOut>();
geiineuville 0:441400ffd086 160 Base::add_rpc_class<DigitalIn>();
geiineuville 0:441400ffd086 161 Base::add_rpc_class<DigitalOut>();
geiineuville 0:441400ffd086 162 Base::add_rpc_class<PwmOut>();
geiineuville 0:441400ffd086 163 Base::add_rpc_class<Timer>();
geiineuville 0:441400ffd086 164 Base::add_rpc_class<SPI>();
geiineuville 0:441400ffd086 165 Base::add_rpc_class<BusOut>();
geiineuville 0:441400ffd086 166 Base::add_rpc_class<BusIn>();
geiineuville 0:441400ffd086 167 Base::add_rpc_class<myrpc>();
geiineuville 0:441400ffd086 168 led1=0;
geiineuville 0:441400ffd086 169
geiineuville 0:441400ffd086 170 // Check if we can use SD card for the web server
geiineuville 0:441400ffd086 171 FILE *fp = fopen("/sd/index.htm", "r");
geiineuville 0:441400ffd086 172 if (fp == NULL) {
geiineuville 0:441400ffd086 173 if (gDebug) printf("DEBUG: No SD card found or no index.htm file - using LocalFilesystem for WebServer.\r\n");
geiineuville 0:441400ffd086 174 } else {
geiineuville 0:441400ffd086 175 use_sd = true;
geiineuville 0:441400ffd086 176 fclose(fp);
geiineuville 0:441400ffd086 177 if (gDebug) printf("DEBUG: Found SD card with index.htm file - using SD for WebServer.\r\n");
geiineuville 0:441400ffd086 178 }
geiineuville 0:441400ffd086 179
geiineuville 0:441400ffd086 180 if (0 != SNTPReadIniFile("/sd/sntp.ini") )
geiineuville 0:441400ffd086 181 SNTPReadIniFile("/local/sntp.ini");
geiineuville 0:441400ffd086 182 SNTPWriteIniFile(stdout);
geiineuville 0:441400ffd086 183
geiineuville 0:441400ffd086 184
geiineuville 0:441400ffd086 185 http.addHandler(new HTTPLinkStatus("/",
geiineuville 0:441400ffd086 186 #if MBED_BOB2
geiineuville 0:441400ffd086 187 p25, p26, // MBED-BoB2-mods
geiineuville 0:441400ffd086 188 #else
geiineuville 0:441400ffd086 189 LED3, LED4,
geiineuville 0:441400ffd086 190 #endif
geiineuville 0:441400ffd086 191 0.1,
geiineuville 0:441400ffd086 192 /*do_urlfile*/ true, /*do_link_printf*/ true, /*do_log_printf*/ false,
geiineuville 0:441400ffd086 193 /*log_file*/ ( (gDebug>1) ? (use_sd ? "/sd/httpd.log" : "/local/httpd.log") : NULL)
geiineuville 0:441400ffd086 194 )); // Should be the first handler to get a preview of all requests
geiineuville 0:441400ffd086 195 http.addHandler(new HTTPRPC());
geiineuville 0:441400ffd086 196 led2=0;
geiineuville 0:441400ffd086 197
geiineuville 0:441400ffd086 198 // Static/Dynamic pages must be installed before FileSystem on /
geiineuville 0:441400ffd086 199 http.addHandler(new HTTPStaticPage("/static.htm", content, strlen(content)));
geiineuville 0:441400ffd086 200 http.addHandler(new HTTPDynamicPage("/dynamic.htm", &myDynamicPage));
geiineuville 0:441400ffd086 201 http.addHandler(new HTTPFileSystemHandler("/", use_sd ? "/sd/" : "/local/"));
geiineuville 0:441400ffd086 202 led3=0;
geiineuville 0:441400ffd086 203
geiineuville 0:441400ffd086 204 // FIXME: BUG If eth is not plugged, http.bind() hangs!
geiineuville 0:441400ffd086 205 http.bind();
geiineuville 0:441400ffd086 206
geiineuville 0:441400ffd086 207 SNTPClientInit();
geiineuville 0:441400ffd086 208 led4 = 0;
geiineuville 0:441400ffd086 209
geiineuville 0:441400ffd086 210 pc.printf("\r"); // Add linefeed for stupid Hyperterminal
geiineuville 0:441400ffd086 211 while(1) {
geiineuville 0:441400ffd086 212 http.poll(); // Have to call this method at least every 250ms to let the http server run.
geiineuville 0:441400ffd086 213 if (sw1 & !sw1_old) {
geiineuville 0:441400ffd086 214 printf("SW1\r\n");
geiineuville 0:441400ffd086 215 }
geiineuville 0:441400ffd086 216 if (sw2 && !sw2_old) {
geiineuville 0:441400ffd086 217 printf(CLS "SW2\r\n");
geiineuville 0:441400ffd086 218 }
geiineuville 0:441400ffd086 219 sw1_old = sw1;
geiineuville 0:441400ffd086 220 sw2_old = sw2;
geiineuville 0:441400ffd086 221 wait(gWait);
geiineuville 0:441400ffd086 222 }
geiineuville 0:441400ffd086 223 }
geiineuville 0:441400ffd086 224
geiineuville 0:441400ffd086 225 //END