Jack Hansdampf / Mbed OS WebSwitch_ENC28J60_GSOE

Dependencies:   UIPEthernet_GSOE

Committer:
jack1930
Date:
Fri Aug 20 12:36:49 2021 +0000
Revision:
18:02264a85fdda
Parent:
15:9beb9b99695d
angepasst fuer STM32

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jack1930 18:02264a85fdda 1 //nach Zoltan Houdek
hudakz 10:b47c7921346f 2 #include "mbed.h"
hudakz 0:68a0003c4cb8 3 #include <string>
hudakz 10:b47c7921346f 4 #include "UipEthernet.h"
hudakz 10:b47c7921346f 5 #include "TcpServer.h"
hudakz 10:b47c7921346f 6 #include "TcpClient.h"
hudakz 0:68a0003c4cb8 7
hudakz 11:6c0b20227ca2 8 //#define DEBUG
hudakz 14:810ac368dd6e 9 // Static IP address must be unique and compatible with your network.
hudakz 10:b47c7921346f 10 #define IP "192.168.1.35"
hudakz 10:b47c7921346f 11 #define GATEWAY "192.168.1.1"
hudakz 10:b47c7921346f 12 #define NETMASK "255.255.255.0"
hudakz 10:b47c7921346f 13 #define PORT 80
hudakz 11:6c0b20227ca2 14 const uint8_t MAC[6] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x06 };
jack1930 18:02264a85fdda 15 UipEthernet net(MAC, PB_15, PB_14, PB_13, PB_12); // mosi, miso, sck, cs
hudakz 12:7c46dcf6f7e2 16 TcpServer server; // Ethernet server
hudakz 11:6c0b20227ca2 17 TcpClient* client;
hudakz 15:9beb9b99695d 18 char httpBuf[1500];
hudakz 15:9beb9b99695d 19 char httpHeader[256];
hudakz 10:b47c7921346f 20 const int OFF = 0;
hudakz 10:b47c7921346f 21 const int ON = 1;
jack1930 18:02264a85fdda 22 DigitalOut output(PA_5); // A digital output to be switched on/off
hudakz 15:9beb9b99695d 23 float roomTemp = 21.8f; // A temperature sensor output
hudakz 15:9beb9b99695d 24 const char PASSWORD[] = "secret"; // Change as you like
hudakz 0:68a0003c4cb8 25
hudakz 10:b47c7921346f 26 /**
hudakz 10:b47c7921346f 27 * @brief Analyses the received URL
hudakz 10:b47c7921346f 28 * @note The string passed to this function will look like this:
hudakz 10:b47c7921346f 29 * GET /HTTP/1.....
hudakz 10:b47c7921346f 30 * GET /password HTTP/1.....
hudakz 10:b47c7921346f 31 * GET /password/ HTTP/1.....
hudakz 10:b47c7921346f 32 * GET /password/?sw=1 HTTP/1.....
hudakz 10:b47c7921346f 33 * GET /password/?sw=0 HTTP/1.....
hudakz 10:b47c7921346f 34 * @param url URL string
hudakz 10:b47c7921346f 35 * @retval -3 just refresh page
hudakz 10:b47c7921346f 36 * -2 no command given but password valid
hudakz 10:b47c7921346f 37 * -1 invalid password
hudakz 10:b47c7921346f 38 * 0 switch off
hudakz 10:b47c7921346f 39 * 1 switch on
hudakz 10:b47c7921346f 40 */
hudakz 15:9beb9b99695d 41 int8_t analyseURL(char* url)
hudakz 10:b47c7921346f 42 {
jack1930 18:02264a85fdda 43 return 1;
jack1930 18:02264a85fdda 44 uint8_t pos = 5;
jack1930 18:02264a85fdda 45 /*
hudakz 15:9beb9b99695d 46 if (strlen(url) < (5 + strlen(PASSWORD) + 1))
hudakz 10:b47c7921346f 47 return(-1);
hudakz 0:68a0003c4cb8 48
hudakz 15:9beb9b99695d 49 //if (url.substr(5, PASSWORD.size()) != PASSWORD)
hudakz 15:9beb9b99695d 50 if (strncmp(url + 5, PASSWORD, strlen(PASSWORD)) != 0)
hudakz 0:68a0003c4cb8 51 return(-1);
hudakz 0:68a0003c4cb8 52
hudakz 15:9beb9b99695d 53 uint8_t pos = 5 + strlen(PASSWORD);
hudakz 0:68a0003c4cb8 54
hudakz 15:9beb9b99695d 55 //if (url.substr(pos, 1) != "/")
hudakz 15:9beb9b99695d 56
hudakz 15:9beb9b99695d 57 if (*(url + pos) != '/')
hudakz 0:68a0003c4cb8 58 return(-1);
hudakz 0:68a0003c4cb8 59
hudakz 15:9beb9b99695d 60 //if (url.substr(pos++, 1) == " ")
hudakz 15:9beb9b99695d 61 if (*(url + pos++) == ' ')
hudakz 10:b47c7921346f 62 return(-2);
jack1930 18:02264a85fdda 63 */
hudakz 15:9beb9b99695d 64 //string cmd(url.substr(pos, 5));
hudakz 15:9beb9b99695d 65 *(url + pos + 5) = '\0'; // terminate the cmd string
hudakz 15:9beb9b99695d 66 char* cmd = ((url + pos));
hudakz 15:9beb9b99695d 67 if (strcmp(cmd, "?sw=0") == 0)
hudakz 0:68a0003c4cb8 68 return(0);
hudakz 15:9beb9b99695d 69 if (strcmp(cmd, "?sw=1") == 0)
hudakz 0:68a0003c4cb8 70 return(1);
hudakz 0:68a0003c4cb8 71 return(-3);
hudakz 0:68a0003c4cb8 72 }
hudakz 0:68a0003c4cb8 73
hudakz 5:0ab8292e37da 74 /**
hudakz 5:0ab8292e37da 75 * @brief
hudakz 5:0ab8292e37da 76 * @note
hudakz 5:0ab8292e37da 77 * @param
hudakz 5:0ab8292e37da 78 * @retval
hudakz 5:0ab8292e37da 79 */
hudakz 15:9beb9b99695d 80 char* movedPermanently(uint8_t flag)
hudakz 10:b47c7921346f 81 {
hudakz 15:9beb9b99695d 82 memset(httpBuf, 0, sizeof(httpBuf));
hudakz 15:9beb9b99695d 83 if (flag == 1) {
hudakz 15:9beb9b99695d 84 strcpy(httpBuf, "/");
hudakz 15:9beb9b99695d 85 strcat(httpBuf, PASSWORD);
hudakz 15:9beb9b99695d 86 strcat(httpBuf, "/");
hudakz 15:9beb9b99695d 87 }
hudakz 0:68a0003c4cb8 88
hudakz 15:9beb9b99695d 89 strcat(httpBuf, "<h1>301 Moved Permanently</h1>\r\n");
hudakz 15:9beb9b99695d 90 return(httpBuf);
hudakz 0:68a0003c4cb8 91 }
hudakz 0:68a0003c4cb8 92
hudakz 5:0ab8292e37da 93 /**
hudakz 5:0ab8292e37da 94 * @brief
hudakz 5:0ab8292e37da 95 * @note
hudakz 5:0ab8292e37da 96 * @param
hudakz 5:0ab8292e37da 97 * @retval
hudakz 5:0ab8292e37da 98 */
hudakz 15:9beb9b99695d 99 char* showWebPage(int status)
hudakz 10:b47c7921346f 100 {
hudakz 15:9beb9b99695d 101 char roomTempStr[10] = { };
hudakz 10:b47c7921346f 102
hudakz 10:b47c7921346f 103 //roomTemp = ds1820.read();
hudakz 15:9beb9b99695d 104
hudakz 10:b47c7921346f 105 sprintf(roomTempStr, "%3.1f", roomTemp);
hudakz 15:9beb9b99695d 106 memset(httpBuf, 0, sizeof(httpBuf));
hudakz 10:b47c7921346f 107 /*$off*/
hudakz 15:9beb9b99695d 108 strcat
hudakz 15:9beb9b99695d 109 (
hudakz 15:9beb9b99695d 110 httpBuf,
hudakz 10:b47c7921346f 111 "<head>"
hudakz 15:9beb9b99695d 112 "<meta charset=\"utf-8\">"
hudakz 15:9beb9b99695d 113 "<meta name=\"viewport\" content=\" initial-scale=1.0; maximum-scale=1.0; minimum-scale=1.0; user-scalable=0;\"/>"
hudakz 15:9beb9b99695d 114 "<title>Smart Home</title>"
hudakz 15:9beb9b99695d 115 "<link href='http://fonts.googleapis.com/css?family=Droid+Sans&v1' rel='stylesheet' type='text/css'>"
hudakz 15:9beb9b99695d 116 "<style>"
hudakz 15:9beb9b99695d 117 ".switch {"
hudakz 15:9beb9b99695d 118 "position: relative;"
hudakz 15:9beb9b99695d 119 "display: inline-block;"
hudakz 15:9beb9b99695d 120 "width: 60px;"
hudakz 15:9beb9b99695d 121 "height: 34px;"
hudakz 15:9beb9b99695d 122 "}"
hudakz 15:9beb9b99695d 123 ".switch input {display:none;}"
hudakz 15:9beb9b99695d 124 ".slider {"
hudakz 15:9beb9b99695d 125 "position: absolute;"
hudakz 15:9beb9b99695d 126 "cursor: pointer;"
hudakz 15:9beb9b99695d 127 "top: 0;"
hudakz 15:9beb9b99695d 128 "left: 0;"
hudakz 15:9beb9b99695d 129 "right: 0;"
hudakz 15:9beb9b99695d 130 "bottom: 0;"
hudakz 15:9beb9b99695d 131 "border-radius: 34px;"
hudakz 15:9beb9b99695d 132 "background-color: #ccc;"
hudakz 15:9beb9b99695d 133 "-webkit-transition: .4s;"
hudakz 15:9beb9b99695d 134 "transition: .4s;"
hudakz 15:9beb9b99695d 135 "}"
hudakz 15:9beb9b99695d 136 ".slider:before {"
hudakz 15:9beb9b99695d 137 "position: absolute;"
hudakz 15:9beb9b99695d 138 "content: \"\";"
hudakz 15:9beb9b99695d 139 "height: 26px;"
hudakz 15:9beb9b99695d 140 "width: 26px;"
hudakz 15:9beb9b99695d 141 "left: 4px;"
hudakz 15:9beb9b99695d 142 "bottom: 4px;"
hudakz 15:9beb9b99695d 143 "border-radius: 50%;"
hudakz 15:9beb9b99695d 144 "background-color: white;"
hudakz 15:9beb9b99695d 145 "-webkit-transition: .4s;"
hudakz 15:9beb9b99695d 146 "transition: .4s;"
hudakz 15:9beb9b99695d 147 "}"
hudakz 15:9beb9b99695d 148 "input:checked + .slider {"
hudakz 15:9beb9b99695d 149 "background-color: #8ce196;"
hudakz 15:9beb9b99695d 150 "}"
hudakz 15:9beb9b99695d 151 "input:focus + .slider {"
hudakz 15:9beb9b99695d 152 "box-shadow: 0 0 1px #8ce196;"
hudakz 15:9beb9b99695d 153 "}"
hudakz 15:9beb9b99695d 154 "input:checked + .slider:before {"
hudakz 15:9beb9b99695d 155 "-webkit-transform: translateX(26px);"
hudakz 15:9beb9b99695d 156 "-ms-transform: translateX(26px);"
hudakz 15:9beb9b99695d 157 "transform: translateX(26px);"
hudakz 15:9beb9b99695d 158 "}"
hudakz 15:9beb9b99695d 159 "</style>"
hudakz 10:b47c7921346f 160 "</head>"
hudakz 10:b47c7921346f 161
hudakz 10:b47c7921346f 162 "<body>"
hudakz 15:9beb9b99695d 163 "<h2><a href=\".\" title=\"Click to refresh the page\">Smart Home</a></h2>"
hudakz 15:9beb9b99695d 164 "<pre>Temperature:\t"
hudakz 15:9beb9b99695d 165 );
hudakz 15:9beb9b99695d 166 strcat(httpBuf, roomTempStr);
hudakz 15:9beb9b99695d 167 strcat(httpBuf, "&deg;C</pre>");
hudakz 15:9beb9b99695d 168 strcat
hudakz 15:9beb9b99695d 169 (
hudakz 15:9beb9b99695d 170 httpBuf,
hudakz 15:9beb9b99695d 171 "<pre>Heating:\t"
hudakz 15:9beb9b99695d 172 );
hudakz 10:b47c7921346f 173 if(status == ON) {
hudakz 15:9beb9b99695d 174 strcat
hudakz 15:9beb9b99695d 175 (
hudakz 15:9beb9b99695d 176 httpBuf,
hudakz 15:9beb9b99695d 177 "<a href=\"./?sw=0\" class=\"switch\"> "
hudakz 15:9beb9b99695d 178 "<input type=\"checkbox\" checked>"
hudakz 15:9beb9b99695d 179 );
hudakz 5:0ab8292e37da 180 }
hudakz 5:0ab8292e37da 181 else {
hudakz 15:9beb9b99695d 182 strcat
hudakz 15:9beb9b99695d 183 (
hudakz 15:9beb9b99695d 184 httpBuf,
hudakz 15:9beb9b99695d 185 "<a href=\"./?sw=1\" class=\"switch\"> "
hudakz 15:9beb9b99695d 186 "<input type=\"checkbox\">"
hudakz 15:9beb9b99695d 187 );
hudakz 0:68a0003c4cb8 188 }
hudakz 15:9beb9b99695d 189 strcat
hudakz 15:9beb9b99695d 190 (
hudakz 15:9beb9b99695d 191 httpBuf,
hudakz 15:9beb9b99695d 192 "<div class=\"slider\"></div>"
hudakz 15:9beb9b99695d 193 "</a>"
hudakz 15:9beb9b99695d 194 "</pre>"
hudakz 15:9beb9b99695d 195 "<hr>"
hudakz 15:9beb9b99695d 196 "<pre>2017 ARMmbed</pre>"
hudakz 15:9beb9b99695d 197 "</body>"
hudakz 15:9beb9b99695d 198 );
hudakz 10:b47c7921346f 199 /*$on*/
hudakz 15:9beb9b99695d 200 return httpBuf;
hudakz 0:68a0003c4cb8 201 }
hudakz 0:68a0003c4cb8 202
hudakz 5:0ab8292e37da 203 /**
hudakz 5:0ab8292e37da 204 * @brief
hudakz 5:0ab8292e37da 205 * @note
hudakz 5:0ab8292e37da 206 * @param
hudakz 5:0ab8292e37da 207 * @retval
hudakz 5:0ab8292e37da 208 */
hudakz 15:9beb9b99695d 209 void sendHTTP(TcpClient* client, char* header, char* content)
hudakz 10:b47c7921346f 210 {
hudakz 15:9beb9b99695d 211 char content_length[10] = { };
hudakz 15:9beb9b99695d 212
hudakz 15:9beb9b99695d 213 sprintf(content_length, "%u\r\n", strlen(content));
hudakz 10:b47c7921346f 214
hudakz 15:9beb9b99695d 215 strcat(header, "\r\nContent-Type: text/html\r\n");
hudakz 15:9beb9b99695d 216 strcat(header, "Content-Length: ");
hudakz 15:9beb9b99695d 217 strcat(header, content_length);
hudakz 15:9beb9b99695d 218 strcat(header, "Pragma: no-cache\r\n");
hudakz 15:9beb9b99695d 219 strcat(header, "Connection: About to close\r\n\r\n");
hudakz 10:b47c7921346f 220
hudakz 15:9beb9b99695d 221 char c = content[0];
hudakz 15:9beb9b99695d 222 memmove(httpBuf + strlen(header), httpBuf, strlen(content)); // make room for the header
hudakz 15:9beb9b99695d 223 strcpy(httpBuf, header); // copy the header on front of the content
hudakz 15:9beb9b99695d 224 httpBuf[strlen(header)] = c;
hudakz 15:9beb9b99695d 225 client->send((uint8_t*)httpBuf, strlen(httpBuf));
hudakz 10:b47c7921346f 226 }
hudakz 10:b47c7921346f 227
hudakz 10:b47c7921346f 228 /**
hudakz 10:b47c7921346f 229 * @brief
hudakz 10:b47c7921346f 230 * @note
hudakz 10:b47c7921346f 231 * @param
hudakz 10:b47c7921346f 232 * @retval
hudakz 10:b47c7921346f 233 */
hudakz 10:b47c7921346f 234 int main(void)
hudakz 10:b47c7921346f 235 {
hudakz 10:b47c7921346f 236 printf("Starting ...\r\n");
hudakz 10:b47c7921346f 237
jack1930 18:02264a85fdda 238 net.set_network(IP, NETMASK, GATEWAY); // include this for using static IP address
jack1930 18:02264a85fdda 239 if (net.connect(60) != 0) {
hudakz 15:9beb9b99695d 240
hudakz 15:9beb9b99695d 241 // 'connect' timeout in seconds (defaults to 60 sec)
hudakz 14:810ac368dd6e 242 printf("Unable to connet.\r\n");
hudakz 14:810ac368dd6e 243 return -1;
hudakz 14:810ac368dd6e 244 }
jack1930 18:02264a85fdda 245 printf("connected");
hudakz 10:b47c7921346f 246 // Show the network address
hudakz 15:9beb9b99695d 247 SocketAddress addr;
hudakz 15:9beb9b99695d 248 net.get_ip_address(&addr);
hudakz 15:9beb9b99695d 249 printf("IP address: %s\n", addr.get_ip_address() ? addr.get_ip_address() : "None");
hudakz 15:9beb9b99695d 250 net.get_netmask(&addr);
hudakz 15:9beb9b99695d 251 printf("Netmask: %s\n", addr.get_ip_address() ? addr.get_ip_address() : "None");
hudakz 15:9beb9b99695d 252 net.get_gateway(&addr);
hudakz 15:9beb9b99695d 253 printf("Gateway: %s\n", addr.get_ip_address() ? addr.get_ip_address() : "None");
hudakz 10:b47c7921346f 254
hudakz 10:b47c7921346f 255 /* Open the server on ethernet stack */
hudakz 10:b47c7921346f 256 server.open(&net);
hudakz 10:b47c7921346f 257
hudakz 10:b47c7921346f 258 /* Bind the HTTP port (TCP 80) to the server */
hudakz 10:b47c7921346f 259 server.bind(PORT);
hudakz 10:b47c7921346f 260
hudakz 14:810ac368dd6e 261 /* Can handle 4 simultaneous connections */
hudakz 14:810ac368dd6e 262 server.listen(4);
hudakz 10:b47c7921346f 263
hudakz 11:6c0b20227ca2 264 while (true) {
hudakz 10:b47c7921346f 265 client = server.accept();
hudakz 10:b47c7921346f 266 if (client) {
hudakz 15:9beb9b99695d 267 switch (client->recv((uint8_t*)httpBuf, client->available())) {
hudakz 15:9beb9b99695d 268 case 0:
hudakz 15:9beb9b99695d 269 printf("recieved buffer is empty.\n\r");
hudakz 11:6c0b20227ca2 270 break;
hudakz 0:68a0003c4cb8 271
hudakz 11:6c0b20227ca2 272 case -1:
hudakz 15:9beb9b99695d 273 printf("failed to read data from client.\n\r");
hudakz 11:6c0b20227ca2 274 break;
hudakz 0:68a0003c4cb8 275
hudakz 15:9beb9b99695d 276 default:
hudakz 15:9beb9b99695d 277 #ifdef DEBUG
hudakz 15:9beb9b99695d 278 printf("Client with IP address %s connected.\r\n\r\n", client->getpeername());
hudakz 15:9beb9b99695d 279 printf("Data received:\r\n%s\n\r", receiveBuf);
hudakz 15:9beb9b99695d 280 #endif
hudakz 15:9beb9b99695d 281 if (strncmp(httpBuf, "GET", 3) != 0) {
hudakz 15:9beb9b99695d 282 strcpy(httpHeader, "HTTP/1.0 200 OK");
hudakz 15:9beb9b99695d 283 strcpy(httpBuf, "<h1>200 OK</h1>");
hudakz 15:9beb9b99695d 284 sendHTTP(client, httpHeader, httpBuf);
hudakz 15:9beb9b99695d 285 }
hudakz 15:9beb9b99695d 286 else
hudakz 15:9beb9b99695d 287 if ((strncmp(httpBuf, "GET", 3) == 0) && (strncmp(httpBuf + 3, " / ", 3 == 0))) {
hudakz 15:9beb9b99695d 288 strcpy(httpHeader, "HTTP/1.0 200 OK");
hudakz 15:9beb9b99695d 289 strcpy(httpBuf, "<p>Usage: http://host_or_ip/password</p>\r\n");
hudakz 15:9beb9b99695d 290 sendHTTP(client, httpHeader, httpBuf);
hudakz 15:9beb9b99695d 291 }
hudakz 15:9beb9b99695d 292 else {
hudakz 15:9beb9b99695d 293 int cmd = analyseURL(httpBuf);
hudakz 15:9beb9b99695d 294 switch (cmd) {
hudakz 15:9beb9b99695d 295 case -3:
hudakz 15:9beb9b99695d 296 // update webpage
hudakz 15:9beb9b99695d 297 strcpy(httpHeader, "HTTP/1.0 200 OK");
hudakz 15:9beb9b99695d 298 sendHTTP(client, httpHeader, showWebPage(output));
hudakz 15:9beb9b99695d 299 break;
hudakz 0:68a0003c4cb8 300
hudakz 15:9beb9b99695d 301 case -2:
hudakz 15:9beb9b99695d 302 // redirect to the right base url
hudakz 15:9beb9b99695d 303 strcpy(httpHeader, "HTTP/1.0 301 Moved Permanently\r\nLocation: ");
hudakz 15:9beb9b99695d 304 sendHTTP(client, httpHeader, movedPermanently(1));
hudakz 15:9beb9b99695d 305 break;
hudakz 15:9beb9b99695d 306
hudakz 15:9beb9b99695d 307 case -1:
hudakz 15:9beb9b99695d 308 strcpy(httpHeader, "HTTP/1.0 401 Unauthorized");
hudakz 15:9beb9b99695d 309 strcpy(httpBuf, "<h1>401 Unauthorized</h1>");
hudakz 15:9beb9b99695d 310 sendHTTP(client, httpHeader, httpBuf);
hudakz 15:9beb9b99695d 311 break;
hudakz 15:9beb9b99695d 312
hudakz 15:9beb9b99695d 313 case 0:
hudakz 15:9beb9b99695d 314 output = OFF; // output off
hudakz 15:9beb9b99695d 315 strcpy(httpHeader, "HTTP/1.0 200 OK");
hudakz 15:9beb9b99695d 316 sendHTTP(client, httpHeader, showWebPage(output));
hudakz 15:9beb9b99695d 317 break;
hudakz 15:9beb9b99695d 318
hudakz 15:9beb9b99695d 319 case 1:
hudakz 15:9beb9b99695d 320 output = ON; // output on
hudakz 15:9beb9b99695d 321 strcpy(httpHeader, "HTTP/1.0 200 OK");
hudakz 15:9beb9b99695d 322 sendHTTP(client, httpHeader, showWebPage(output));
hudakz 15:9beb9b99695d 323 break;
hudakz 15:9beb9b99695d 324 }
hudakz 15:9beb9b99695d 325 }
hudakz 0:68a0003c4cb8 326 }
hudakz 11:6c0b20227ca2 327
hudakz 10:b47c7921346f 328 client->close();
hudakz 0:68a0003c4cb8 329 }
hudakz 0:68a0003c4cb8 330 }
hudakz 0:68a0003c4cb8 331 }