First version work in progress

Dependencies:   SDFileSystem WIZnetInterface mbed

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?

UserRevisionLine numberNew 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 }