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 Sep 07 04:43:57 2013 +0000
Revision:
0:28bc7ce77e20
Child:
1:64f023138627
Basic I2C functionality

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 "muri.h"
gsteiert 0:28bc7ce77e20 5 #include <stdio.h>
gsteiert 0:28bc7ce77e20 6 #include <string.h>
gsteiert 0:28bc7ce77e20 7
gsteiert 0:28bc7ce77e20 8 #define HTTPD_SERVER_PORT 80
gsteiert 0:28bc7ce77e20 9 #define HTTPD_MAX_REQ_LENGTH 1023
gsteiert 0:28bc7ce77e20 10 #define HTTPD_MAX_HDR_LENGTH 255
gsteiert 0:28bc7ce77e20 11 #define HTTPD_MAX_FNAME_LENGTH 127
gsteiert 0:28bc7ce77e20 12 #define MURI_MAX_RESP_LENGTH 127
gsteiert 0:28bc7ce77e20 13 #define I2C_BUFFER_SIZE 31
gsteiert 0:28bc7ce77e20 14
gsteiert 0:28bc7ce77e20 15 SDFileSystem sd(p5, p6, p7, p8, "sd"); //
gsteiert 0:28bc7ce77e20 16 // I2C i2c(p28, p27);
gsteiert 0:28bc7ce77e20 17 EthernetInterface eth;
gsteiert 0:28bc7ce77e20 18 TCPSocketServer server;
gsteiert 0:28bc7ce77e20 19 TCPSocketConnection client;
gsteiert 0:28bc7ce77e20 20
gsteiert 0:28bc7ce77e20 21 char buffer[HTTPD_MAX_REQ_LENGTH+1];
gsteiert 0:28bc7ce77e20 22 char httpHeader[HTTPD_MAX_HDR_LENGTH+1];
gsteiert 0:28bc7ce77e20 23 char filename[HTTPD_MAX_FNAME_LENGTH+1];
gsteiert 0:28bc7ce77e20 24 char obuf[MURI_MAX_RESP_LENGTH+1];
gsteiert 0:28bc7ce77e20 25 char data[I2C_BUFFER_SIZE];
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 0:28bc7ce77e20 35 printf("get_file %s\n", uri);
gsteiert 0:28bc7ce77e20 36 char *lstchr = strrchr(uri, NULL) -1;
gsteiert 0:28bc7ce77e20 37 if ('/' == *lstchr) {
gsteiert 0:28bc7ce77e20 38 printf("Open directory /sd%s\n", uri);
gsteiert 0:28bc7ce77e20 39 *lstchr = 0;
gsteiert 0:28bc7ce77e20 40 sprintf(filename, "/sd%s", uri);
gsteiert 0:28bc7ce77e20 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 0:28bc7ce77e20 45 sprintf(httpHeader,"<html><head><title>Directory Listing</title></head><body><h1>%s</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 0:28bc7ce77e20 49 printf("%s\n", p->d_name);
gsteiert 0:28bc7ce77e20 50 sprintf(httpHeader,"<li>%s</li>", p->d_name);
gsteiert 0:28bc7ce77e20 51 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 52 }
gsteiert 0:28bc7ce77e20 53 }
gsteiert 0:28bc7ce77e20 54 closedir(d);
gsteiert 0:28bc7ce77e20 55 printf("Directory closed\n");
gsteiert 0:28bc7ce77e20 56 sprintf(httpHeader,"</ul></body></html>");
gsteiert 0:28bc7ce77e20 57 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 58 } else {
gsteiert 0:28bc7ce77e20 59 sprintf(filename, "/sd%s", uri);
gsteiert 0:28bc7ce77e20 60 fp = fopen(filename, "r");
gsteiert 0:28bc7ce77e20 61 if (fp == NULL) {
gsteiert 0:28bc7ce77e20 62 sprintf(httpHeader,"HTTP/1.1 404 Not Found \r\nContent-Type: text\r\nConnection: Close\r\n\r\n");
gsteiert 0:28bc7ce77e20 63 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 64 client.send(uri,strlen(uri));
gsteiert 0:28bc7ce77e20 65 } else {
gsteiert 0:28bc7ce77e20 66 sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n");
gsteiert 0:28bc7ce77e20 67 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 68 while ((rdCnt = fread(buffer, sizeof( char ), 1024, fp)) == 1024) {
gsteiert 0:28bc7ce77e20 69 client.send(buffer, rdCnt);
gsteiert 0:28bc7ce77e20 70 }
gsteiert 0:28bc7ce77e20 71 client.send(buffer, rdCnt);
gsteiert 0:28bc7ce77e20 72 fclose(fp);
gsteiert 0:28bc7ce77e20 73 }
gsteiert 0:28bc7ce77e20 74 }
gsteiert 0:28bc7ce77e20 75 }
gsteiert 0:28bc7ce77e20 76
gsteiert 0:28bc7ce77e20 77 void get_cgi(char* uri)
gsteiert 0:28bc7ce77e20 78 {
gsteiert 0:28bc7ce77e20 79 char *result;
gsteiert 0:28bc7ce77e20 80 muri(uri, data, obuf);
gsteiert 0:28bc7ce77e20 81 if (!strncmp(obuf, "200 ", 4)) {
gsteiert 0:28bc7ce77e20 82 result = obuf +4;
gsteiert 0:28bc7ce77e20 83 sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n");
gsteiert 0:28bc7ce77e20 84 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 85 client.send(result,strlen(result));
gsteiert 0:28bc7ce77e20 86 printf("result: %s", result);
gsteiert 0:28bc7ce77e20 87 } else {
gsteiert 0:28bc7ce77e20 88 sprintf(httpHeader,"HTTP/1.1 ");
gsteiert 0:28bc7ce77e20 89 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 90 client.send(obuf,strlen(obuf));
gsteiert 0:28bc7ce77e20 91 sprintf(httpHeader,"\r\n");
gsteiert 0:28bc7ce77e20 92 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 93 }
gsteiert 0:28bc7ce77e20 94
gsteiert 0:28bc7ce77e20 95 }
gsteiert 0:28bc7ce77e20 96
gsteiert 0:28bc7ce77e20 97
gsteiert 0:28bc7ce77e20 98 int main (void)
gsteiert 0:28bc7ce77e20 99 {
gsteiert 0:28bc7ce77e20 100 // EthernetInterface eth;
gsteiert 0:28bc7ce77e20 101 eth.init(); //Use DHCP
gsteiert 0:28bc7ce77e20 102 eth.connect();
gsteiert 0:28bc7ce77e20 103 printf("IP Address is %s\n", eth.getIPAddress());
gsteiert 0:28bc7ce77e20 104
gsteiert 0:28bc7ce77e20 105 // TCPSocketServer server;
gsteiert 0:28bc7ce77e20 106 server.bind(HTTPD_SERVER_PORT);
gsteiert 0:28bc7ce77e20 107 server.listen();
gsteiert 0:28bc7ce77e20 108
gsteiert 0:28bc7ce77e20 109 while (true) {
gsteiert 0:28bc7ce77e20 110 printf("\nWait for new connection...\r\n");
gsteiert 0:28bc7ce77e20 111 server.accept(client);
gsteiert 0:28bc7ce77e20 112 client.set_blocking(false, 1500); // Timeout after (1.5)s
gsteiert 0:28bc7ce77e20 113
gsteiert 0:28bc7ce77e20 114 printf("Connection from: %s\r\n", client.get_address());
gsteiert 0:28bc7ce77e20 115 while (true) {
gsteiert 0:28bc7ce77e20 116 int n = client.receive(buffer, sizeof(buffer));
gsteiert 0:28bc7ce77e20 117 if (n <= 0) break;
gsteiert 0:28bc7ce77e20 118 printf("Recieved Data: %d\r\n\r\n%.*s\r\n",n,n,buffer);
gsteiert 0:28bc7ce77e20 119 if (n >= 1024) {
gsteiert 0:28bc7ce77e20 120 sprintf(httpHeader,"HTTP/1.1 413 Request Entity Too Large \r\nContent-Type: text\r\nConnection: Close\r\n\r\n");
gsteiert 0:28bc7ce77e20 121 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 122 client.send(buffer,n);
gsteiert 0:28bc7ce77e20 123 break;
gsteiert 0:28bc7ce77e20 124 } else {
gsteiert 0:28bc7ce77e20 125 buffer[n]=0;
gsteiert 0:28bc7ce77e20 126 }
gsteiert 0:28bc7ce77e20 127 if (!strncmp(buffer, "GET ", 4)) {
gsteiert 0:28bc7ce77e20 128 uristr = buffer + 4;
gsteiert 0:28bc7ce77e20 129 eou = strstr(uristr, " ");
gsteiert 0:28bc7ce77e20 130 if (eou == NULL) {
gsteiert 0:28bc7ce77e20 131 sprintf(httpHeader,"HTTP/1.1 400 Bad Request \r\nContent-Type: text\r\nConnection: Close\r\n\r\n");
gsteiert 0:28bc7ce77e20 132 client.send(httpHeader,strlen(httpHeader));
gsteiert 0:28bc7ce77e20 133 client.send(buffer,n);
gsteiert 0:28bc7ce77e20 134 } else {
gsteiert 0:28bc7ce77e20 135 *eou = 0;
gsteiert 0:28bc7ce77e20 136 if (!strncmp(uristr, "/muri/", 6)) {
gsteiert 0:28bc7ce77e20 137 get_cgi(uristr+6);
gsteiert 0:28bc7ce77e20 138 } else {
gsteiert 0:28bc7ce77e20 139 get_file(uristr);
gsteiert 0:28bc7ce77e20 140 }
gsteiert 0:28bc7ce77e20 141 }
gsteiert 0:28bc7ce77e20 142 }
gsteiert 0:28bc7ce77e20 143 }
gsteiert 0:28bc7ce77e20 144
gsteiert 0:28bc7ce77e20 145 client.close();
gsteiert 0:28bc7ce77e20 146 }
gsteiert 0:28bc7ce77e20 147 }