ARD2PMD Web Server Web Server using the ARD2PMD adapter and the SPI2SD adapter with the Seeeduino Arch Pro to serve files from the micro SD card and provide RESTful access to the Pmod connector

Dependencies:   ARD2PMD EthernetInterface MAX14661 PmodInterface SDFileSystem mbed-rtos mbed

Fork of ARD2PMD_WebServer by Greg Steiert

Committer:
gsteiert
Date:
Sat Apr 19 05:26:40 2014 +0000
Revision:
3:4f71a37a1ed2
Parent:
1:64f023138627
Child:
4:7fdb64fe6419
Initial Release of HTTP SD Card File Server

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsteiert 0:28bc7ce77e20 1 #include "mbed.h"
gsteiert 0:28bc7ce77e20 2 #include "EthernetInterface.h"
gsteiert 0:28bc7ce77e20 3 #include "SDFileSystem.h"
gsteiert 0:28bc7ce77e20 4 #include <stdio.h>
gsteiert 0:28bc7ce77e20 5 #include <string.h>
gsteiert 0:28bc7ce77e20 6
gsteiert 0:28bc7ce77e20 7 #define HTTPD_SERVER_PORT 80
gsteiert 0:28bc7ce77e20 8 #define HTTPD_MAX_REQ_LENGTH 1023
gsteiert 0:28bc7ce77e20 9 #define HTTPD_MAX_HDR_LENGTH 255
gsteiert 0:28bc7ce77e20 10 #define HTTPD_MAX_FNAME_LENGTH 127
gsteiert 3:4f71a37a1ed2 11 #define HTTPD_MAX_DNAME_LENGTH 127
gsteiert 3:4f71a37a1ed2 12
gsteiert 3:4f71a37a1ed2 13 Serial uart(USBTX, USBRX);
gsteiert 0:28bc7ce77e20 14
gsteiert 3:4f71a37a1ed2 15 //SDFileSystem sd(p5, p6, p7, p8, "sd"); // LPC1768 MBD2PMD
gsteiert 3:4f71a37a1ed2 16 SDFileSystem sd(P0_18, P0_17, P0_15, P0_16, "sd"); // Seeeduino Arch Pro SPI2SD
gsteiert 3:4f71a37a1ed2 17
gsteiert 0:28bc7ce77e20 18 EthernetInterface eth;
gsteiert 0:28bc7ce77e20 19 TCPSocketServer server;
gsteiert 0:28bc7ce77e20 20 TCPSocketConnection client;
gsteiert 0:28bc7ce77e20 21
gsteiert 0:28bc7ce77e20 22 char buffer[HTTPD_MAX_REQ_LENGTH+1];
gsteiert 0:28bc7ce77e20 23 char httpHeader[HTTPD_MAX_HDR_LENGTH+1];
gsteiert 3:4f71a37a1ed2 24 char fileName[HTTPD_MAX_FNAME_LENGTH+1];
gsteiert 3:4f71a37a1ed2 25 char dirName[HTTPD_MAX_DNAME_LENGTH+1];
gsteiert 0:28bc7ce77e20 26 char *uristr;
gsteiert 0:28bc7ce77e20 27 char *eou;
gsteiert 0:28bc7ce77e20 28 char *qrystr;
gsteiert 0:28bc7ce77e20 29
gsteiert 0:28bc7ce77e20 30 FILE *fp;
gsteiert 0:28bc7ce77e20 31 int rdCnt;
gsteiert 0:28bc7ce77e20 32
gsteiert 0:28bc7ce77e20 33 void get_file(char* uri)
gsteiert 0:28bc7ce77e20 34 {
gsteiert 3:4f71a37a1ed2 35 uart.printf("get_file %s\n", uri);
gsteiert 0:28bc7ce77e20 36 char *lstchr = strrchr(uri, NULL) -1;
gsteiert 0:28bc7ce77e20 37 if ('/' == *lstchr) {
gsteiert 3:4f71a37a1ed2 38 uart.printf("Open directory /sd%s\n", uri);
gsteiert 0:28bc7ce77e20 39 *lstchr = 0;
gsteiert 3:4f71a37a1ed2 40 sprintf(fileName, "/sd%s", uri);
gsteiert 3:4f71a37a1ed2 41 DIR *d = opendir(fileName);
gsteiert 0:28bc7ce77e20 42 if (d != NULL) {
gsteiert 0:28bc7ce77e20 43 sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n");
gsteiert 0:28bc7ce77e20 44 client.send(httpHeader,strlen(httpHeader));
gsteiert 3:4f71a37a1ed2 45 sprintf(httpHeader,"<html><head><title>Directory Listing</title></head><body><h1>%s Directory Listing</h1><ul>", uri);
gsteiert 0:28bc7ce77e20 46 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 47 struct dirent *p;
gsteiert 0:28bc7ce77e20 48 while((p = readdir(d)) != NULL) {
gsteiert 3:4f71a37a1ed2 49 sprintf(dirName, "%s/%s", fileName, p->d_name);
gsteiert 3:4f71a37a1ed2 50 uart.printf("%s\n", dirName);
gsteiert 3:4f71a37a1ed2 51 DIR *subDir = opendir(dirName);
gsteiert 3:4f71a37a1ed2 52 if (subDir != NULL) {
gsteiert 3:4f71a37a1ed2 53 sprintf(httpHeader,"<li><a href=\"./%s/\">%s/</a></li>", p->d_name, p->d_name);
gsteiert 3:4f71a37a1ed2 54 } else {
gsteiert 3:4f71a37a1ed2 55 sprintf(httpHeader,"<li><a href=\"./%s\">%s</a></li>", p->d_name, p->d_name);
gsteiert 3:4f71a37a1ed2 56 }
gsteiert 0:28bc7ce77e20 57 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 58 }
gsteiert 0:28bc7ce77e20 59 }
gsteiert 0:28bc7ce77e20 60 closedir(d);
gsteiert 3:4f71a37a1ed2 61 uart.printf("Directory closed\n");
gsteiert 0:28bc7ce77e20 62 sprintf(httpHeader,"</ul></body></html>");
gsteiert 0:28bc7ce77e20 63 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 64 } else {
gsteiert 3:4f71a37a1ed2 65 sprintf(fileName, "/sd%s", uri);
gsteiert 3:4f71a37a1ed2 66 fp = fopen(fileName, "r");
gsteiert 0:28bc7ce77e20 67 if (fp == NULL) {
gsteiert 0:28bc7ce77e20 68 sprintf(httpHeader,"HTTP/1.1 404 Not Found \r\nContent-Type: text\r\nConnection: Close\r\n\r\n");
gsteiert 0:28bc7ce77e20 69 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 70 client.send(uri,strlen(uri));
gsteiert 0:28bc7ce77e20 71 } else {
gsteiert 0:28bc7ce77e20 72 sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n");
gsteiert 0:28bc7ce77e20 73 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 74 while ((rdCnt = fread(buffer, sizeof( char ), 1024, fp)) == 1024) {
gsteiert 0:28bc7ce77e20 75 client.send(buffer, rdCnt);
gsteiert 0:28bc7ce77e20 76 }
gsteiert 0:28bc7ce77e20 77 client.send(buffer, rdCnt);
gsteiert 0:28bc7ce77e20 78 fclose(fp);
gsteiert 0:28bc7ce77e20 79 }
gsteiert 0:28bc7ce77e20 80 }
gsteiert 0:28bc7ce77e20 81 }
gsteiert 0:28bc7ce77e20 82
gsteiert 0:28bc7ce77e20 83 int main (void)
gsteiert 0:28bc7ce77e20 84 {
gsteiert 3:4f71a37a1ed2 85 // Serial Interface eth;
gsteiert 3:4f71a37a1ed2 86 uart.baud(115200);
gsteiert 3:4f71a37a1ed2 87 uart.printf("RAPM Serial Started\n");
gsteiert 3:4f71a37a1ed2 88
gsteiert 3:4f71a37a1ed2 89 // Check File System
gsteiert 3:4f71a37a1ed2 90 DIR *d = opendir("/sd/");
gsteiert 3:4f71a37a1ed2 91 if (d != NULL) {
gsteiert 3:4f71a37a1ed2 92 uart.printf("SD Card Present\n");
gsteiert 3:4f71a37a1ed2 93 } else {
gsteiert 3:4f71a37a1ed2 94 uart.printf("SD Card Root Directory Not Found\n");
gsteiert 3:4f71a37a1ed2 95 }
gsteiert 3:4f71a37a1ed2 96
gsteiert 0:28bc7ce77e20 97 // EthernetInterface eth;
gsteiert 0:28bc7ce77e20 98 eth.init(); //Use DHCP
gsteiert 0:28bc7ce77e20 99 eth.connect();
gsteiert 3:4f71a37a1ed2 100 uart.printf("IP Address is %s\n", eth.getIPAddress());
gsteiert 0:28bc7ce77e20 101
gsteiert 0:28bc7ce77e20 102 // TCPSocketServer server;
gsteiert 0:28bc7ce77e20 103 server.bind(HTTPD_SERVER_PORT);
gsteiert 0:28bc7ce77e20 104 server.listen();
gsteiert 3:4f71a37a1ed2 105 uart.printf("RAPM Server Listening\n");
gsteiert 0:28bc7ce77e20 106
gsteiert 0:28bc7ce77e20 107 while (true) {
gsteiert 3:4f71a37a1ed2 108 uart.printf("\nWait for new connection...\r\n");
gsteiert 0:28bc7ce77e20 109 server.accept(client);
gsteiert 0:28bc7ce77e20 110 client.set_blocking(false, 1500); // Timeout after (1.5)s
gsteiert 0:28bc7ce77e20 111
gsteiert 3:4f71a37a1ed2 112 uart.printf("Connection from: %s\r\n", client.get_address());
gsteiert 0:28bc7ce77e20 113 while (true) {
gsteiert 0:28bc7ce77e20 114 int n = client.receive(buffer, sizeof(buffer));
gsteiert 0:28bc7ce77e20 115 if (n <= 0) break;
gsteiert 3:4f71a37a1ed2 116 uart.printf("Recieved Data: %d\r\n\r\n%.*s\r\n",n,n,buffer);
gsteiert 0:28bc7ce77e20 117 if (n >= 1024) {
gsteiert 0:28bc7ce77e20 118 sprintf(httpHeader,"HTTP/1.1 413 Request Entity Too Large \r\nContent-Type: text\r\nConnection: Close\r\n\r\n");
gsteiert 0:28bc7ce77e20 119 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 120 client.send(buffer,n);
gsteiert 0:28bc7ce77e20 121 break;
gsteiert 0:28bc7ce77e20 122 } else {
gsteiert 0:28bc7ce77e20 123 buffer[n]=0;
gsteiert 0:28bc7ce77e20 124 }
gsteiert 0:28bc7ce77e20 125 if (!strncmp(buffer, "GET ", 4)) {
gsteiert 0:28bc7ce77e20 126 uristr = buffer + 4;
gsteiert 0:28bc7ce77e20 127 eou = strstr(uristr, " ");
gsteiert 0:28bc7ce77e20 128 if (eou == NULL) {
gsteiert 0:28bc7ce77e20 129 sprintf(httpHeader,"HTTP/1.1 400 Bad Request \r\nContent-Type: text\r\nConnection: Close\r\n\r\n");
gsteiert 0:28bc7ce77e20 130 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 131 client.send(buffer,n);
gsteiert 0:28bc7ce77e20 132 } else {
gsteiert 0:28bc7ce77e20 133 *eou = 0;
gsteiert 3:4f71a37a1ed2 134 get_file(uristr);
gsteiert 0:28bc7ce77e20 135 }
gsteiert 0:28bc7ce77e20 136 }
gsteiert 0:28bc7ce77e20 137 }
gsteiert 0:28bc7ce77e20 138
gsteiert 0:28bc7ce77e20 139 client.close();
gsteiert 0:28bc7ce77e20 140 }
gsteiert 0:28bc7ce77e20 141 }