Webserver controller with url trimming for value controls
Dependencies: LCD_DISCO_F746NG BSP_DISCO_F746NG
Diff: main.cpp
- 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) + "°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(ðernet); + //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