First version work in progress
Dependencies: SDFileSystem WIZnetInterface mbed
main.cpp@3:7fd5a67a03d5, 2017-09-30 (annotated)
- Committer:
- erlingl
- Date:
- Sat Sep 30 19:04:53 2017 +0000
- Revision:
- 3:7fd5a67a03d5
- Parent:
- 2:348703f5ce0e
First version
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| erlingl | 0:c33e29e4e5ee | 1 | #include "mbed.h" |
| erlingl | 0:c33e29e4e5ee | 2 | #include "EthernetInterface.h" |
| erlingl | 2:348703f5ce0e | 3 | #include "readsensors.h" |
| erlingl | 0:c33e29e4e5ee | 4 | #include "SDFileSystem.h" |
| erlingl | 0:c33e29e4e5ee | 5 | #include <stdio.h> |
| erlingl | 0:c33e29e4e5ee | 6 | #include <string.h> |
| erlingl | 0:c33e29e4e5ee | 7 | |
| erlingl | 0:c33e29e4e5ee | 8 | |
| erlingl | 1:fa7f5224886b | 9 | //#define MAC "\x00\x08\xDC\x11\x34\x78" |
| erlingl | 0:c33e29e4e5ee | 10 | #define MAC "\x00\x08\xDC\x00\x01\x02" |
| erlingl | 0:c33e29e4e5ee | 11 | #define IP "192.168.77.100" |
| erlingl | 0:c33e29e4e5ee | 12 | #define MASK "255.255.255.0" |
| erlingl | 0:c33e29e4e5ee | 13 | #define GATEWAY "192.168.77.1" |
| erlingl | 0:c33e29e4e5ee | 14 | |
| erlingl | 0:c33e29e4e5ee | 15 | #define HTTPD_SERVER_PORT 80 |
| erlingl | 0:c33e29e4e5ee | 16 | #define HTTPD_MAX_REQ_LENGTH 1023 |
| erlingl | 0:c33e29e4e5ee | 17 | #define HTTPD_MAX_HDR_LENGTH 255 |
| erlingl | 0:c33e29e4e5ee | 18 | #define HTTPD_MAX_FNAME_LENGTH 127 |
| erlingl | 0:c33e29e4e5ee | 19 | #define HTTPD_MAX_DNAME_LENGTH 127 |
| erlingl | 0:c33e29e4e5ee | 20 | |
| erlingl | 0:c33e29e4e5ee | 21 | Serial uart(USBTX, USBRX); |
| erlingl | 2:348703f5ce0e | 22 | Serial aurdino(D1,D0); |
| erlingl | 0:c33e29e4e5ee | 23 | |
| erlingl | 0:c33e29e4e5ee | 24 | SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd"); // WIZwiki-W7500 |
| erlingl | 0:c33e29e4e5ee | 25 | |
| erlingl | 0:c33e29e4e5ee | 26 | EthernetInterface eth; |
| erlingl | 0:c33e29e4e5ee | 27 | TCPSocketServer server; |
| erlingl | 0:c33e29e4e5ee | 28 | TCPSocketConnection client; |
| erlingl | 2:348703f5ce0e | 29 | ReadSensors sensor; |
| erlingl | 0:c33e29e4e5ee | 30 | |
| erlingl | 0:c33e29e4e5ee | 31 | char buffer[HTTPD_MAX_REQ_LENGTH+1]; |
| erlingl | 2:348703f5ce0e | 32 | char sensorBuffer[42]; |
| erlingl | 0:c33e29e4e5ee | 33 | char httpHeader[HTTPD_MAX_HDR_LENGTH+1]; |
| erlingl | 0:c33e29e4e5ee | 34 | char fileName[HTTPD_MAX_FNAME_LENGTH+1]; |
| erlingl | 0:c33e29e4e5ee | 35 | char dirName[HTTPD_MAX_DNAME_LENGTH+1]; |
| erlingl | 0:c33e29e4e5ee | 36 | char *uristr; |
| erlingl | 0:c33e29e4e5ee | 37 | char *eou; |
| erlingl | 0:c33e29e4e5ee | 38 | char *qrystr; |
| erlingl | 2:348703f5ce0e | 39 | char *sensorData; |
| erlingl | 0:c33e29e4e5ee | 40 | |
| erlingl | 0:c33e29e4e5ee | 41 | FILE *fp; |
| erlingl | 0:c33e29e4e5ee | 42 | int rdCnt; |
| erlingl | 0:c33e29e4e5ee | 43 | |
| erlingl | 0:c33e29e4e5ee | 44 | DigitalOut led1(LED1); //server listning status |
| erlingl | 0:c33e29e4e5ee | 45 | DigitalOut led2(LED2); //socket connecting status |
| erlingl | 0:c33e29e4e5ee | 46 | |
| erlingl | 0:c33e29e4e5ee | 47 | Ticker ledTick; |
| erlingl | 0:c33e29e4e5ee | 48 | |
| erlingl | 0:c33e29e4e5ee | 49 | void ledTickfunc() |
| erlingl | 0:c33e29e4e5ee | 50 | { |
| erlingl | 0:c33e29e4e5ee | 51 | led1 = !led1; |
| erlingl | 0:c33e29e4e5ee | 52 | } |
| erlingl | 0:c33e29e4e5ee | 53 | |
| erlingl | 0:c33e29e4e5ee | 54 | |
| erlingl | 0:c33e29e4e5ee | 55 | |
| erlingl | 0:c33e29e4e5ee | 56 | void get_file(char* uri) |
| erlingl | 0:c33e29e4e5ee | 57 | { |
| erlingl | 0:c33e29e4e5ee | 58 | uart.printf("get_file %s\n", uri); |
| erlingl | 0:c33e29e4e5ee | 59 | char *lstchr = strrchr(uri, NULL) -1; |
| erlingl | 0:c33e29e4e5ee | 60 | if ('/' == *lstchr) { |
| erlingl | 0:c33e29e4e5ee | 61 | uart.printf("Open directory /sd%s\n", uri); |
| erlingl | 0:c33e29e4e5ee | 62 | *lstchr = 0; |
| erlingl | 0:c33e29e4e5ee | 63 | sprintf(fileName, "/sd%s", uri); |
| erlingl | 0:c33e29e4e5ee | 64 | DIR *d = opendir(fileName); |
| erlingl | 0:c33e29e4e5ee | 65 | if (d != NULL) { |
| erlingl | 0:c33e29e4e5ee | 66 | sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n"); |
| erlingl | 0:c33e29e4e5ee | 67 | client.send(httpHeader,strlen(httpHeader)); |
| erlingl | 0:c33e29e4e5ee | 68 | sprintf(httpHeader,"<html><head><title>Directory Listing</title></head><body><h1>%s Directory Listing</h1><ul>", uri); |
| erlingl | 0:c33e29e4e5ee | 69 | client.send(httpHeader,strlen(httpHeader)); |
| erlingl | 0:c33e29e4e5ee | 70 | struct dirent *p; |
| erlingl | 0:c33e29e4e5ee | 71 | while((p = readdir(d)) != NULL) { |
| erlingl | 0:c33e29e4e5ee | 72 | sprintf(dirName, "%s/%s", fileName, p->d_name); |
| erlingl | 0:c33e29e4e5ee | 73 | uart.printf("%s\n", dirName); |
| erlingl | 0:c33e29e4e5ee | 74 | DIR *subDir = opendir(dirName); |
| erlingl | 0:c33e29e4e5ee | 75 | if (subDir != NULL) { |
| erlingl | 0:c33e29e4e5ee | 76 | sprintf(httpHeader,"<li><a href=\"./%s/\">%s/</a></li>", p->d_name, p->d_name); |
| erlingl | 0:c33e29e4e5ee | 77 | } else { |
| erlingl | 0:c33e29e4e5ee | 78 | sprintf(httpHeader,"<li><a href=\"./%s\">%s</a></li>", p->d_name, p->d_name); |
| erlingl | 0:c33e29e4e5ee | 79 | } |
| erlingl | 0:c33e29e4e5ee | 80 | client.send(httpHeader,strlen(httpHeader)); |
| erlingl | 0:c33e29e4e5ee | 81 | } |
| erlingl | 0:c33e29e4e5ee | 82 | } |
| erlingl | 0:c33e29e4e5ee | 83 | closedir(d); |
| erlingl | 0:c33e29e4e5ee | 84 | uart.printf("Directory closed\n"); |
| erlingl | 0:c33e29e4e5ee | 85 | sprintf(httpHeader,"</ul></body></html>"); |
| erlingl | 0:c33e29e4e5ee | 86 | client.send(httpHeader,strlen(httpHeader)); |
| erlingl | 0:c33e29e4e5ee | 87 | } else { |
| erlingl | 0:c33e29e4e5ee | 88 | sprintf(fileName, "/sd%s", uri); |
| erlingl | 0:c33e29e4e5ee | 89 | fp = fopen(fileName, "r"); |
| erlingl | 0:c33e29e4e5ee | 90 | if (fp == NULL) { |
| erlingl | 0:c33e29e4e5ee | 91 | uart.printf("File not found\n"); |
| erlingl | 0:c33e29e4e5ee | 92 | sprintf(httpHeader,"HTTP/1.1 404 Not Found \r\nContent-Type: text\r\nConnection: Close\r\n\r\n"); |
| erlingl | 0:c33e29e4e5ee | 93 | client.send(httpHeader,strlen(httpHeader)); |
| erlingl | 0:c33e29e4e5ee | 94 | client.send(uri,strlen(uri)); |
| erlingl | 0:c33e29e4e5ee | 95 | } else { |
| erlingl | 0:c33e29e4e5ee | 96 | uart.printf("Sending: header"); |
| erlingl | 0:c33e29e4e5ee | 97 | sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n"); |
| erlingl | 0:c33e29e4e5ee | 98 | client.send(httpHeader,strlen(httpHeader)); |
| erlingl | 2:348703f5ce0e | 99 | |
| erlingl | 2:348703f5ce0e | 100 | sprintf(httpHeader,"Temp sensors %s\r\n\r\n", sensorBuffer); |
| erlingl | 2:348703f5ce0e | 101 | client.send(httpHeader,strlen(httpHeader)); |
| erlingl | 0:c33e29e4e5ee | 102 | uart.printf(" file"); |
| erlingl | 0:c33e29e4e5ee | 103 | while ((rdCnt = fread(buffer, sizeof( char ), 1024, fp)) == 1024) { |
| erlingl | 0:c33e29e4e5ee | 104 | client.send(buffer, rdCnt); |
| erlingl | 0:c33e29e4e5ee | 105 | uart.printf("."); |
| erlingl | 0:c33e29e4e5ee | 106 | } |
| erlingl | 0:c33e29e4e5ee | 107 | client.send(buffer, rdCnt); |
| erlingl | 0:c33e29e4e5ee | 108 | fclose(fp); |
| erlingl | 0:c33e29e4e5ee | 109 | uart.printf("done\n"); |
| erlingl | 0:c33e29e4e5ee | 110 | } |
| erlingl | 0:c33e29e4e5ee | 111 | } |
| erlingl | 0:c33e29e4e5ee | 112 | } |
| erlingl | 0:c33e29e4e5ee | 113 | |
| erlingl | 0:c33e29e4e5ee | 114 | int main (void) |
| erlingl | 0:c33e29e4e5ee | 115 | { |
| erlingl | 0:c33e29e4e5ee | 116 | ledTick.attach(&ledTickfunc,0.5); |
| erlingl | 0:c33e29e4e5ee | 117 | // Serial Interface eth; |
| erlingl | 0:c33e29e4e5ee | 118 | uart.baud(115200); |
| erlingl | 0:c33e29e4e5ee | 119 | uart.printf("Initializing\n"); |
| erlingl | 2:348703f5ce0e | 120 | aurdino.baud(9600); |
| erlingl | 0:c33e29e4e5ee | 121 | |
| erlingl | 0:c33e29e4e5ee | 122 | // Check File System |
| erlingl | 0:c33e29e4e5ee | 123 | uart.printf("Checking File System\n"); |
| erlingl | 0:c33e29e4e5ee | 124 | DIR *d = opendir("/sd/"); |
| erlingl | 0:c33e29e4e5ee | 125 | if (d != NULL) { |
| erlingl | 0:c33e29e4e5ee | 126 | uart.printf("SD Card Present\n"); |
| erlingl | 0:c33e29e4e5ee | 127 | } else { |
| erlingl | 0:c33e29e4e5ee | 128 | uart.printf("SD Card Root Directory Not Found\n"); |
| erlingl | 0:c33e29e4e5ee | 129 | } |
| erlingl | 0:c33e29e4e5ee | 130 | |
| erlingl | 0:c33e29e4e5ee | 131 | uart.printf("Initializing Ethernet\n"); |
| erlingl | 0:c33e29e4e5ee | 132 | eth.init((uint8_t*)MAC,IP,MASK,GATEWAY); //IP,mask,Gateway |
| erlingl | 0:c33e29e4e5ee | 133 | uart.printf("Connecting\n"); |
| erlingl | 0:c33e29e4e5ee | 134 | eth.connect(); |
| erlingl | 0:c33e29e4e5ee | 135 | uart.printf("IP Address is %s\n", eth.getIPAddress()); |
| erlingl | 0:c33e29e4e5ee | 136 | |
| erlingl | 0:c33e29e4e5ee | 137 | // TCPSocketServer server; |
| erlingl | 0:c33e29e4e5ee | 138 | server.bind(HTTPD_SERVER_PORT); |
| erlingl | 0:c33e29e4e5ee | 139 | server.listen(); |
| erlingl | 0:c33e29e4e5ee | 140 | uart.printf("Server Listening\n"); |
| erlingl | 0:c33e29e4e5ee | 141 | |
| erlingl | 0:c33e29e4e5ee | 142 | while (true) { |
| erlingl | 0:c33e29e4e5ee | 143 | uart.printf("\nWait for new connection...\r\n"); |
| erlingl | 0:c33e29e4e5ee | 144 | server.accept(client); |
| erlingl | 1:fa7f5224886b | 145 | client.set_blocking(false, 6500); // Timeout after (1.5)s (6.5s) |
| erlingl | 0:c33e29e4e5ee | 146 | |
| erlingl | 0:c33e29e4e5ee | 147 | uart.printf("Connection from: %s\r\n", client.get_address()); |
| erlingl | 0:c33e29e4e5ee | 148 | while (true) { |
| erlingl | 0:c33e29e4e5ee | 149 | led2 = true; |
| erlingl | 0:c33e29e4e5ee | 150 | int n = client.receive(buffer, sizeof(buffer)); |
| erlingl | 0:c33e29e4e5ee | 151 | if (n <= 0) break; |
| erlingl | 0:c33e29e4e5ee | 152 | uart.printf("Recieved Data: %d\r\n\r\n%.*s\r\n",n,n,buffer); |
| erlingl | 0:c33e29e4e5ee | 153 | if (n >= 1024) { |
| erlingl | 0:c33e29e4e5ee | 154 | sprintf(httpHeader,"HTTP/1.1 413 Request Entity Too Large \r\nContent-Type: text\r\nConnection: Close\r\n\r\n"); |
| erlingl | 0:c33e29e4e5ee | 155 | client.send(httpHeader,strlen(httpHeader)); |
| erlingl | 0:c33e29e4e5ee | 156 | client.send(buffer,n); |
| erlingl | 0:c33e29e4e5ee | 157 | break; |
| erlingl | 0:c33e29e4e5ee | 158 | } else { |
| erlingl | 0:c33e29e4e5ee | 159 | buffer[n]=0; |
| erlingl | 0:c33e29e4e5ee | 160 | } |
| erlingl | 0:c33e29e4e5ee | 161 | if (!strncmp(buffer, "GET ", 4)) { |
| erlingl | 0:c33e29e4e5ee | 162 | uristr = buffer + 4; |
| erlingl | 0:c33e29e4e5ee | 163 | eou = strstr(uristr, " "); |
| erlingl | 0:c33e29e4e5ee | 164 | if (eou == NULL) { |
| erlingl | 0:c33e29e4e5ee | 165 | sprintf(httpHeader,"HTTP/1.1 400 Bad Request \r\nContent-Type: text\r\nConnection: Close\r\n\r\n"); |
| erlingl | 0:c33e29e4e5ee | 166 | client.send(httpHeader,strlen(httpHeader)); |
| erlingl | 0:c33e29e4e5ee | 167 | client.send(buffer,n); |
| erlingl | 0:c33e29e4e5ee | 168 | } else { |
| erlingl | 0:c33e29e4e5ee | 169 | *eou = 0; |
| erlingl | 0:c33e29e4e5ee | 170 | get_file(uristr); |
| erlingl | 2:348703f5ce0e | 171 | sensor.readData(sensorData); |
| erlingl | 0:c33e29e4e5ee | 172 | } |
| erlingl | 0:c33e29e4e5ee | 173 | } |
| erlingl | 0:c33e29e4e5ee | 174 | } |
| erlingl | 0:c33e29e4e5ee | 175 | led2 = false; |
| erlingl | 0:c33e29e4e5ee | 176 | client.close(); |
| erlingl | 0:c33e29e4e5ee | 177 | } |
| erlingl | 0:c33e29e4e5ee | 178 | } |