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.

Fork of WebSwitch_mbed-os by Zoltan Hudak

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/webswitch03.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.
To use static IP address uncomment and adjust line #221 in main.cpp.

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

For a Web Switch using

Revision:
8:47b0cb4b5b7d
Parent:
7:02a0635aeeac
Child:
9:161bed13b17e
--- a/main.cpp	Tue Jan 16 08:21:04 2018 +0000
+++ b/main.cpp	Tue Oct 30 16:41:15 2018 +0000
@@ -4,35 +4,36 @@
 #include "TCPSocket.h"
 #include <stdio.h>
 #include <string>
-
+ 
 using namespace     std;
-
+ 
 #define IP         "192.168.1.181"
 #define GATEWAY    "192.168.1.1"
-#define MASK       "255.255.255.0"
-
+#define NETMASK    "255.255.255.0"
+ 
+ 
+#define PORT        80
+ 
+EthernetInterface*  net;
 
-#define PORT        80
-
-EthernetInterface   ethernet;
 TCPServer           server;
 TCPSocket           clientSocket;
 SocketAddress       clientAddress;
 char                receiveBuf[1024] = { };
-
+ 
 const int           OFF = 0;
 const int           ON = 1;
-
+ 
 DigitalOut          sw(LED1);
 float               roomTemp = 21.8;    // A temperature sensor output
-
+ 
 const string        PASSWORD     = "secret";    // change as you like
 const string        HTTP_OK      = "HTTP/1.0 200 OK";
 const string        MOVED_PERM   = "HTTP/1.0 301 Moved Permanently\r\nLocation: ";
 const string        UNAUTHORIZED = "HTTP/1.0 401 Unauthorized";
 string              httpHeader;     // HTTP header
 string              httpContent;    // HTTP content
-
+ 
 /**
  * @brief   Defines a custom MAC address
  * @note    Uncomment the code below to define a unique MAC address.
@@ -48,7 +49,7 @@
 //    mac[4] = 0x04;
 //    mac[5] = 0x05;
 //};
-
+ 
 /**
  * @brief   Analyses the received URL
  * @note    The string passed to this function will look like this:
@@ -66,26 +67,26 @@
 int8_t analyseURL(string& url) {
     if(url.substr(5, PASSWORD.size()) != PASSWORD)
         return(-1);
-
+ 
     uint8_t pos = 5 + PASSWORD.size();
-
+ 
     if(url.substr(pos, 1) == " ")
         return(-2);
-
+ 
     if(url.substr(pos++, 1) != "/")
         return(-1);
-
+ 
     string  cmd(url.substr(pos, 5));
-
+ 
     if(cmd == "?sw=0")
         return(0);
-
+ 
     if(cmd == "?sw=1")
         return(1);
-
+ 
     return(-3);
 }
-
+ 
 /**
  * @brief
  * @note
@@ -97,12 +98,12 @@
         httpContent = "/" + PASSWORD + "/";
     else
         httpContent = "";
-
+ 
     httpContent += "<h1>301 Moved Permanently</h1>\r\n";
-
+ 
     return(httpContent);
 }
-
+ 
 /**
  * @brief
  * @note
@@ -111,23 +112,23 @@
  */
 string& showWebPage(uint8_t status) {
     char roomTempStr[5];
-
+ 
     //roomTemp = ds1820.read();
     sprintf(roomTempStr, "%3.1f", roomTemp);
-
+ 
     // CSS toggle switch
     httpContent  = "<head>";
     httpContent += "<style>";
-
+ 
     httpContent += ".switch {";
     httpContent += "position: relative;";
     httpContent += "display: inline-block;";
     httpContent += "width: 60px;";
     httpContent += "height: 34px;";
     httpContent += "}";
-
+ 
     httpContent += ".switch input {display:none;}";
-
+ 
     httpContent += ".slider {";
     httpContent += "position: absolute;";
     httpContent += "cursor: pointer;";
@@ -140,7 +141,7 @@
     httpContent += "-webkit-transition: .4s;";
     httpContent += "transition: .4s;";
     httpContent += "}";
-
+ 
     httpContent += ".slider:before {";
     httpContent += "position: absolute;";
     httpContent += "content: \"\";";
@@ -153,29 +154,29 @@
     httpContent += "-webkit-transition: .4s;";
     httpContent += "transition: .4s;";
     httpContent += "}";
-
+ 
     httpContent += "input:checked + .slider {";
     httpContent += "background-color: #8ce196;";
     httpContent += "}";
-
+ 
     httpContent += "input:focus + .slider {";
     httpContent += "box-shadow: 0 0 1px #8ce196;";
     httpContent += "}";
-
+ 
     httpContent += "input:checked + .slider:before {";
     httpContent += "-webkit-transform: translateX(26px);";
     httpContent += "-ms-transform: translateX(26px);";
     httpContent += "transform: translateX(26px);";
     httpContent += "}";
-
+ 
     httpContent += "</style>";
     httpContent += "</head>";
-
+ 
     httpContent += "<body>";
     httpContent += "<h2><a href=\".\" title=\"Click to refresh the page\">Smart Home</a></h2>";
     httpContent += "<pre>Temperature:\t" + string(roomTempStr) + "&deg;C</pre>";
     httpContent += "<pre>Heating:\t";
-
+ 
     if(status == ON) {
         httpContent += "<a href=\"./?sw=0\" class=\"switch\"> ";
         httpContent += "<input type=\"checkbox\" checked>";
@@ -184,16 +185,16 @@
         httpContent += "<a href=\"./?sw=1\" class=\"switch\"> ";
         httpContent += "<input type=\"checkbox\">";
    }
-
+ 
     httpContent += "<div class=\"slider\"></div>";
     httpContent += "</a></pre>";
     httpContent += "<hr>";
     httpContent += "<pre>2017 armMBED</pre>";
     httpContent += "</body>";
-
+ 
     return httpContent;
 }
-
+ 
 /**
  * @brief
  * @note
@@ -202,7 +203,7 @@
  */
 void sendHTTP(TCPSocket& client, string& header, string& content) {
     char    content_length[5] = { };
-
+ 
     header += "\r\nContent-Type: text/html\r\n";
     header += "Content-Length: ";
     sprintf(content_length, "%d", content.length());
@@ -210,12 +211,12 @@
     header += "Pragma: no-cache\r\n";
     header += "Connection: About to close\r\n";
     header += "\r\n";
-
+ 
     string  webpage = header + content;
     client.send((char*)webpage.c_str(), webpage.length());
     printf("HTTP sent.\n\r");
 }
-
+ 
 /**
  * @brief
  * @note
@@ -223,21 +224,43 @@
  * @retval
  */
 int main(void) {
-//    ethernet.set_network("192.168.1.181","255.255.255.0","192.168.1.1");  // use static IP address, netmask, gateway
-    ethernet.connect();
-    printf("Usage: Type %s/%s/ into your web browser and hit ENTER\r\n", ethernet.get_ip_address(), PASSWORD.c_str());
-    const char *mac = ethernet.get_mac_address();
-    printf("MAC address is: %s\n\r", mac ? mac : "No MAC");
+    printf("Starting\r\n");
+    
+    //net = NetworkInterface::get_default_instance();
+    
+    net = new EthernetInterface();
+
+    if (!net) {
+        printf("Error! No network inteface found.\n");
+        return 0;
+    }
 
-    /* Open the server on ethernet stack */
-    server.open(&ethernet);
+    //net->set_network (IP, NETMASK, GATEWAY);  // include this for using static IP address
+    
+    nsapi_size_or_error_t r = net->connect();
+    if (r != 0) {
+        printf("Error! net->connect() returned: %d\n", r);
+        return r;
+    }
 
+   // Show the network address
+    const char *ip = net->get_ip_address();
+    const char *netmask = net->get_netmask();
+    const char *gateway = net->get_gateway();
+    printf("IP address: %s\n", ip ? ip : "None");
+    printf("Netmask: %s\n", netmask ? netmask : "None");
+    printf("Gateway: %s\n", gateway ? gateway : "None");   
+    printf("Usage: Type %s/%s/ into your web browser and hit ENTER\r\n", ip, PASSWORD.c_str());
+ 
+    /* Open the server on ethernet stack */
+    server.open(net);
+ 
     /* Bind the HTTP port (TCP 80) to the server */
-    server.bind(ethernet.get_ip_address(), 80);
-
+    server.bind(ip, 80);
+ 
     /* Can handle 5 simultaneous connections */
     server.listen(5);
-
+ 
     //listening for http GET request
     while(true) {
         printf("=========================================\r\n");
@@ -246,49 +269,49 @@
         printf("Connection succeeded!\n\rIP: %s\n\r", clientAddress.get_ip_address());
         clientSocket.recv(receiveBuf, 1023);
         printf("Recieved Data: %d\n\r\n\r%.*s\n\r", strlen(receiveBuf), strlen(receiveBuf), receiveBuf);
-
+ 
         string  received(receiveBuf);
-
+ 
         if(received.substr(0, 3) != "GET") {
             httpHeader = HTTP_OK;
             httpContent = "<h1>200 OK</h1>";
             sendHTTP(clientSocket, httpHeader, httpContent);
             continue;
         }
-
+ 
         if(received.substr(0, 6) == "GET / ") {
             httpHeader = HTTP_OK;
             httpContent = "<p>Usage: Type http://ip_address/password/ into your web browser and hit ENTER</p>\r\n";
             sendHTTP(clientSocket, httpHeader, httpContent);
             continue;
         }
-
+ 
         int cmd = analyseURL(received);
-
+ 
         if(cmd == -2) {
-
+ 
             // redirect to the right base url
             httpHeader = MOVED_PERM;
             sendHTTP(clientSocket, httpHeader, movedPermanently(1));
             continue;
         }
-
+ 
         if(cmd == -1) {
             httpHeader = UNAUTHORIZED;
             httpContent = "<h1>401 Unauthorized</h1>";
             sendHTTP(clientSocket, httpHeader, httpContent);
             continue;
         }
-
+ 
         if(cmd == ON) {
             sw = ON;    // turn the switch on
         }
-
+ 
         if(cmd == OFF) {
             sw = OFF;   // turn the switch off
         }
-
+ 
         httpHeader = HTTP_OK;
         sendHTTP(clientSocket, httpHeader, showWebPage(sw));
     }
-}
+}
\ No newline at end of file