HTTP Server serving a simple webpage which enables to remotely turn LED1 on/off. Compile, download, run and type 'IP_address/secret/' (don't forget the last '/') into your web browser and hit ENTER.

Dependencies:   EthernetInterface mbed-rtos mbed-dev

Turn LED1, or other digital output, on/off using a web browser.

In this example we create a HTTP server that will serve a simple Web page to remotely turn LED1, or other digital output, on/off by using a web browser.

/media/uploads/hudakz/webswitch_desktop.png/media/uploads/hudakz/webswitch_mobile01.jpg

Notice that DHCP is turned on by default. The IP address assigned to the WebSwitch server along with an instruction how to use it is printed to the connected PC's serial terminal window during program start up.

The project was inspired by the Tuxgraphics Web Switch. Thank you Guido!

For a Web Switch using

Committer:
hudakz
Date:
Thu Apr 06 18:56:06 2017 +0000
Revision:
0:da3404d26549
Child:
1:c024e74b3a75
Initial release.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:da3404d26549 1 #include "mbed.h"
hudakz 0:da3404d26549 2 #include "EthernetInterface.h"
hudakz 0:da3404d26549 3 #include <stdio.h>
hudakz 0:da3404d26549 4 #include <string>
hudakz 0:da3404d26549 5
hudakz 0:da3404d26549 6 using namespace std;
hudakz 0:da3404d26549 7
hudakz 0:da3404d26549 8 #define PORT 80
hudakz 0:da3404d26549 9
hudakz 0:da3404d26549 10 EthernetInterface ethernet;
hudakz 0:da3404d26549 11
hudakz 0:da3404d26549 12 TCPSocketServer server;
hudakz 0:da3404d26549 13 bool serverIsListening = false;
hudakz 0:da3404d26549 14
hudakz 0:da3404d26549 15 TCPSocketConnection client;
hudakz 0:da3404d26549 16 bool clientIsConnected = false;
hudakz 0:da3404d26549 17
hudakz 0:da3404d26549 18 const int OFF = 0;
hudakz 0:da3404d26549 19 const int ON = 1;
hudakz 0:da3404d26549 20
hudakz 0:da3404d26549 21 DigitalOut sw(LED1);
hudakz 0:da3404d26549 22
hudakz 0:da3404d26549 23 const string PASSWORD = "secret"; // change as you like
hudakz 0:da3404d26549 24 const string HTTP_OK = "HTTP/1.0 200 OK";
hudakz 0:da3404d26549 25 const string MOVED_PERM = "HTTP/1.0 301 Moved Permanently\r\nLocation: ";
hudakz 0:da3404d26549 26 const string UNAUTHORIZED = "HTTP/1.0 401 Unauthorized";
hudakz 0:da3404d26549 27 string httpHeader; // HTTP header
hudakz 0:da3404d26549 28 string httpContent; // HTTP content
hudakz 0:da3404d26549 29 /**
hudakz 0:da3404d26549 30 * @brief
hudakz 0:da3404d26549 31 * @note
hudakz 0:da3404d26549 32 * @param
hudakz 0:da3404d26549 33 * @retval
hudakz 0:da3404d26549 34 */
hudakz 0:da3404d26549 35 //extern "C" void mbed_mac_address(char* mac) {
hudakz 0:da3404d26549 36 // // define your own MAC Address
hudakz 0:da3404d26549 37 // mac[0] = 0x00;
hudakz 0:da3404d26549 38 // mac[1] = 0x01;
hudakz 0:da3404d26549 39 // mac[2] = 0x02;
hudakz 0:da3404d26549 40 // mac[3] = 0x03;
hudakz 0:da3404d26549 41 // mac[4] = 0x04;
hudakz 0:da3404d26549 42 // mac[5] = 0x05;
hudakz 0:da3404d26549 43 //};
hudakz 0:da3404d26549 44 // analyse the url given
hudakz 0:da3404d26549 45 // return values: -1 invalid password
hudakz 0:da3404d26549 46 // -2 no command given but password valid
hudakz 0:da3404d26549 47 // -3 just refresh page
hudakz 0:da3404d26549 48 // 0 switch off
hudakz 0:da3404d26549 49 // 1 switch on
hudakz 0:da3404d26549 50 //
hudakz 0:da3404d26549 51 // The string passed to this function will look like this:
hudakz 0:da3404d26549 52 // GET /password HTTP/1.....
hudakz 0:da3404d26549 53 // GET /password/ HTTP/1.....
hudakz 0:da3404d26549 54 // GET /password/?sw=1 HTTP/1.....
hudakz 0:da3404d26549 55
hudakz 0:da3404d26549 56 // GET /password/?sw=0 HTTP/1.....
hudakz 0:da3404d26549 57 int8_t analyseURL(string& str) {
hudakz 0:da3404d26549 58 if(str.substr(5, PASSWORD.size()) != PASSWORD)
hudakz 0:da3404d26549 59 return(-1);
hudakz 0:da3404d26549 60
hudakz 0:da3404d26549 61 uint8_t pos = 5 + PASSWORD.size();
hudakz 0:da3404d26549 62
hudakz 0:da3404d26549 63 if(str.substr(pos, 1) == " ")
hudakz 0:da3404d26549 64 return(-2);
hudakz 0:da3404d26549 65
hudakz 0:da3404d26549 66 if(str.substr(pos++, 1) != "/")
hudakz 0:da3404d26549 67 return(-1);
hudakz 0:da3404d26549 68
hudakz 0:da3404d26549 69 string cmd(str.substr(pos, 5));
hudakz 0:da3404d26549 70
hudakz 0:da3404d26549 71 if(cmd == "?sw=0")
hudakz 0:da3404d26549 72 return(OFF);
hudakz 0:da3404d26549 73
hudakz 0:da3404d26549 74 if(cmd == "?sw=1")
hudakz 0:da3404d26549 75 return(ON);
hudakz 0:da3404d26549 76
hudakz 0:da3404d26549 77 return(-3);
hudakz 0:da3404d26549 78 }
hudakz 0:da3404d26549 79
hudakz 0:da3404d26549 80 /**
hudakz 0:da3404d26549 81 * @brief
hudakz 0:da3404d26549 82 * @note
hudakz 0:da3404d26549 83 * @param
hudakz 0:da3404d26549 84 * @retval
hudakz 0:da3404d26549 85 */
hudakz 0:da3404d26549 86 string& movedPermanently(uint8_t flag) {
hudakz 0:da3404d26549 87 if(flag == 1)
hudakz 0:da3404d26549 88 httpContent = "/" + PASSWORD + "/";
hudakz 0:da3404d26549 89 else
hudakz 0:da3404d26549 90 httpContent = "";
hudakz 0:da3404d26549 91
hudakz 0:da3404d26549 92 httpContent += "<h1>301 Moved Permanently</h1>\r\n";
hudakz 0:da3404d26549 93
hudakz 0:da3404d26549 94 return(httpContent);
hudakz 0:da3404d26549 95 }
hudakz 0:da3404d26549 96
hudakz 0:da3404d26549 97 /**
hudakz 0:da3404d26549 98 * @brief
hudakz 0:da3404d26549 99 * @note
hudakz 0:da3404d26549 100 * @param
hudakz 0:da3404d26549 101 * @retval
hudakz 0:da3404d26549 102 */
hudakz 0:da3404d26549 103 string& showWebPage(uint8_t status) {
hudakz 0:da3404d26549 104 httpContent = "<h2>WebSwitch - Smart Home</h2>\r\n";
hudakz 0:da3404d26549 105
hudakz 0:da3404d26549 106 httpContent += "<pre>Temperature:\t21.8&deg;C\r\n</pre>";
hudakz 0:da3404d26549 107
hudakz 0:da3404d26549 108 if(status == ON) {
hudakz 0:da3404d26549 109 httpContent += "<pre>\r\nHeating:\t<font color=#FF0000>ON </font>";
hudakz 0:da3404d26549 110 httpContent += " <a href=\"./?sw=0\">[Turn off]</a>\r\n";
hudakz 0:da3404d26549 111 }
hudakz 0:da3404d26549 112 else {
hudakz 0:da3404d26549 113 httpContent += "<pre>\r\nHeating:\t<font color=#BBBBBB>OFF</font>";
hudakz 0:da3404d26549 114 httpContent += " <a href=\"./?sw=1\">[Turn on]</a>\r\n";
hudakz 0:da3404d26549 115 }
hudakz 0:da3404d26549 116
hudakz 0:da3404d26549 117 // httpContent += " \r\n";
hudakz 0:da3404d26549 118 // httpContent += " <a href=\".\">Refresh status]</a>\r\n";
hudakz 0:da3404d26549 119 httpContent += "</pre>\r\n";
hudakz 0:da3404d26549 120 httpContent += "<hr>\r\n";
hudakz 0:da3404d26549 121 httpContent += "<pre>2017 ARMmbed Open Source</pre>";
hudakz 0:da3404d26549 122 return httpContent;
hudakz 0:da3404d26549 123 }
hudakz 0:da3404d26549 124
hudakz 0:da3404d26549 125 /**
hudakz 0:da3404d26549 126 * @brief
hudakz 0:da3404d26549 127 * @note
hudakz 0:da3404d26549 128 * @param
hudakz 0:da3404d26549 129 * @retval
hudakz 0:da3404d26549 130 */
hudakz 0:da3404d26549 131 void sendHTTP(TCPSocketConnection& client, string& header, string& content) {
hudakz 0:da3404d26549 132 char content_length[5] = { };
hudakz 0:da3404d26549 133
hudakz 0:da3404d26549 134 header += "\r\nContent-Type: text/html\r\n";
hudakz 0:da3404d26549 135 header += "Content-Length: ";
hudakz 0:da3404d26549 136 sprintf(content_length, "%d", content.length());
hudakz 0:da3404d26549 137 header += string(content_length) + "\r\n";
hudakz 0:da3404d26549 138 header += "Pragma: no-cache\r\n";
hudakz 0:da3404d26549 139 header += "Connection: About to close\r\n";
hudakz 0:da3404d26549 140 header += "\r\n";
hudakz 0:da3404d26549 141
hudakz 0:da3404d26549 142 string webpage = header + content;
hudakz 0:da3404d26549 143 client.send((char*)webpage.c_str(), webpage.length());
hudakz 0:da3404d26549 144 clientIsConnected = false;
hudakz 0:da3404d26549 145 printf("HTTP sent.\n\r");
hudakz 0:da3404d26549 146 }
hudakz 0:da3404d26549 147
hudakz 0:da3404d26549 148 /**
hudakz 0:da3404d26549 149 * @brief
hudakz 0:da3404d26549 150 * @note
hudakz 0:da3404d26549 151 * @param
hudakz 0:da3404d26549 152 * @retval
hudakz 0:da3404d26549 153 */
hudakz 0:da3404d26549 154 int main(void) {
hudakz 0:da3404d26549 155
hudakz 0:da3404d26549 156 //setup ethernet interface
hudakz 0:da3404d26549 157
hudakz 0:da3404d26549 158 ethernet.init(); //Use DHCP
hudakz 0:da3404d26549 159 //ethernet.init("192.168.1.36", "255.255.255.0", "192.168.1.1"); // static IP
hudakz 0:da3404d26549 160 ethernet.connect();
hudakz 0:da3404d26549 161 printf("Usage: Type %s/%s/ into your web browser and hit ENTER\r\n\r\n", ethernet.getIPAddress(), PASSWORD);
hudakz 0:da3404d26549 162
hudakz 0:da3404d26549 163 //setup tcp socket
hudakz 0:da3404d26549 164 if(server.bind(PORT) < 0) {
hudakz 0:da3404d26549 165 printf("HTTP server bind failed.\n\r");
hudakz 0:da3404d26549 166 return -1;
hudakz 0:da3404d26549 167 }
hudakz 0:da3404d26549 168 else {
hudakz 0:da3404d26549 169 printf("HTTP server bind successed.\n\r");
hudakz 0:da3404d26549 170 serverIsListening = true;
hudakz 0:da3404d26549 171 }
hudakz 0:da3404d26549 172
hudakz 0:da3404d26549 173 if(server.listen(1) < 0) {
hudakz 0:da3404d26549 174 printf("HTTP server listen failed.\n\r");
hudakz 0:da3404d26549 175 return -1;
hudakz 0:da3404d26549 176 }
hudakz 0:da3404d26549 177 else {
hudakz 0:da3404d26549 178 printf("HTTP server is listening...\n\r");
hudakz 0:da3404d26549 179 }
hudakz 0:da3404d26549 180
hudakz 0:da3404d26549 181 //listening for http GET request
hudakz 0:da3404d26549 182 while(serverIsListening) {
hudakz 0:da3404d26549 183
hudakz 0:da3404d26549 184 if(server.accept(client) < 0) {
hudakz 0:da3404d26549 185 printf("Failed to accept connection.\n\r");
hudakz 0:da3404d26549 186 }
hudakz 0:da3404d26549 187 else {
hudakz 0:da3404d26549 188 printf("\r\n=========================================\r\n");
hudakz 0:da3404d26549 189 printf("Connection succeeded!\n\rIP: %s\n\r", client.get_address());
hudakz 0:da3404d26549 190 clientIsConnected = true;
hudakz 0:da3404d26549 191
hudakz 0:da3404d26549 192 while(clientIsConnected) {
hudakz 0:da3404d26549 193 char buffer[1024] = { };
hudakz 0:da3404d26549 194 switch(client.receive(buffer, 1023)) {
hudakz 0:da3404d26549 195 case 0:
hudakz 0:da3404d26549 196 printf("Recieved buffer is empty.\n\r");
hudakz 0:da3404d26549 197 clientIsConnected = false;
hudakz 0:da3404d26549 198 break;
hudakz 0:da3404d26549 199
hudakz 0:da3404d26549 200 case -1:
hudakz 0:da3404d26549 201 printf("Failed to read data from client.\n\r");
hudakz 0:da3404d26549 202 clientIsConnected = false;
hudakz 0:da3404d26549 203 break;
hudakz 0:da3404d26549 204
hudakz 0:da3404d26549 205 default:
hudakz 0:da3404d26549 206 printf("Recieved Data: %d\n\r\n\r%.*s\n\r", strlen(buffer), strlen(buffer), buffer);
hudakz 0:da3404d26549 207
hudakz 0:da3404d26549 208 string received(buffer);
hudakz 0:da3404d26549 209 if(received.substr(0, 3) != "GET") {
hudakz 0:da3404d26549 210 httpHeader = HTTP_OK;
hudakz 0:da3404d26549 211 httpContent = "<h1>200 OK</h1>";
hudakz 0:da3404d26549 212 sendHTTP(client, httpHeader, httpContent);
hudakz 0:da3404d26549 213 continue;
hudakz 0:da3404d26549 214 }
hudakz 0:da3404d26549 215
hudakz 0:da3404d26549 216 if(received.substr(0, 6) == "GET / ") {
hudakz 0:da3404d26549 217 httpHeader = HTTP_OK;
hudakz 0:da3404d26549 218 httpContent = "<p>Usage: Type http://ip_address/password/ into your web browser and hit ENTER</p>\r\n";
hudakz 0:da3404d26549 219 sendHTTP(client, httpHeader, httpContent);
hudakz 0:da3404d26549 220 continue;
hudakz 0:da3404d26549 221 }
hudakz 0:da3404d26549 222
hudakz 0:da3404d26549 223 int cmd = analyseURL(received);
hudakz 0:da3404d26549 224
hudakz 0:da3404d26549 225 if(cmd == -2) {
hudakz 0:da3404d26549 226
hudakz 0:da3404d26549 227 // redirect to the right base url
hudakz 0:da3404d26549 228 httpHeader = MOVED_PERM;
hudakz 0:da3404d26549 229 sendHTTP(client, httpHeader, movedPermanently(1));
hudakz 0:da3404d26549 230 continue;
hudakz 0:da3404d26549 231 }
hudakz 0:da3404d26549 232
hudakz 0:da3404d26549 233 if(cmd == -1) {
hudakz 0:da3404d26549 234 httpHeader = UNAUTHORIZED;
hudakz 0:da3404d26549 235 httpContent = "<h1>401 Unauthorized</h1>";
hudakz 0:da3404d26549 236 sendHTTP(client, httpHeader, httpContent);
hudakz 0:da3404d26549 237 continue;
hudakz 0:da3404d26549 238 }
hudakz 0:da3404d26549 239
hudakz 0:da3404d26549 240 if(cmd == ON) {
hudakz 0:da3404d26549 241 sw = ON; // turn the switch on
hudakz 0:da3404d26549 242 }
hudakz 0:da3404d26549 243
hudakz 0:da3404d26549 244 if(cmd == OFF) {
hudakz 0:da3404d26549 245 sw = OFF; // turn the switch off
hudakz 0:da3404d26549 246 }
hudakz 0:da3404d26549 247
hudakz 0:da3404d26549 248 httpHeader = HTTP_OK;
hudakz 0:da3404d26549 249 sendHTTP(client, httpHeader, showWebPage(sw));
hudakz 0:da3404d26549 250 break;
hudakz 0:da3404d26549 251 }
hudakz 0:da3404d26549 252 }
hudakz 0:da3404d26549 253
hudakz 0:da3404d26549 254 printf("Closing connection.\n\rHTTP server is listening...\n\r");
hudakz 0:da3404d26549 255 client.close();
hudakz 0:da3404d26549 256 }
hudakz 0:da3404d26549 257 }
hudakz 0:da3404d26549 258 }