HTTP_SDCard_File_Server_WIZwiki-W7500 avec gestion des extensions MIME

Dependencies:   SDFileSystem WIZnetInterface mbed STATIC_COLORS

Fork of HTTP_SDCard_File_Server_WIZwiki-W7500 by WIZnet

WIZnet WIZwiki-W7500

/media/uploads/Fo170/wizwiki-w7500_usb_connected.jpg

/media/uploads/Fo170/wiznet_logo_110x37.png http://www.wiznet.co.kr/product-item/w7500/

Windows serial configuration https://developer.mbed.org/handbook/Windows-serial-configuration https://developer.mbed.org/media/downloads/drivers/mbedWinSerial_16466.exe

How to write the firmware into WIZwiki-W7500 https://developer.mbed.org/teams/WIZnet/wiki/How-to-write-the-firmware-into-WIZwiki-W

Data Output using Serial Port https://blog.wiznettechnology.com/2015/08/14/wiznet-wizwiki-w7500-tutorial-exercise-2-data-output-using-serial-port/ http://wizwiki.net/wiki/doku.php?id=products:w7500:peripherals:uart

SDFileSystem Instanciation

SDFileSystem sd(PB_3, PB_2, PB_1, PB_0, "sd"); WIZwiki-W7500

/media/uploads/Fo170/wizwiki_w7500_spi_sch.png

Ethernet Initialization

eth.init () uses the eth.init (MAC) If you use DHCP instead, and when using a Static IP uses eth.init ((uint8_t *) MAC, IP, MASK, GATEWAY). This section uses a static IP.

  1. define MAC "\x\x\x\x\x\x" Should be Replaced with your MAC
  2. define IP "192.168.77.100" Should belong with your lan.
  3. define MASK "255.255.255.0"
  4. define GATEWAY "192.168.77.1"

eth.init((uint8_t*)MAC); Use DHCP for WIZnetInterface eth.init((uint8_t*)MAC,IP,MASK,GATEWAY); IP,mask,Gateway

Also watch its pages, the initial contributor to the project For Import the example https://developer.mbed.org/teams/WIZnet/code/HTTP_SDCard_File_Server_WIZwiki-W7500/

Wiki on ARMmbed https://developer.mbed.org/teams/WIZnet/code/HTTP_SDCard_File_Server_WIZwiki-W7500/wiki/HTTP_SDCard_File_Server_WIZwiki-W7500

/media/uploads/Fo170/wp_20160508_008.jpg

WIZwiki_W7500 LED RGB :

/media/uploads/Fo170/wizwiki_w7500_led_rgb.png

LED1 = LED_RED = LEDR = PC_8

LED2 = LED_GREEN = LEDG = PC_9

LED3 = LED_BLUE = LEDB = PC_5

LED4 = LED_BLUE

Files at this revision

API Documentation at this revision

Comitter:
gsteiert
Date:
Sat Sep 07 04:43:57 2013 +0000
Child:
1:64f023138627
Commit message:
Basic I2C functionality

Changed in this revision

EthernetInterface.lib Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
muri.cpp Show annotated file Show diff for this revision Revisions of this file
muri.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface.lib	Sat Sep 07 04:43:57 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/EthernetInterface/#b6107798aa54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Sat Sep 07 04:43:57 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/SDFileSystem/#c8f66dc765d4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Sep 07 04:43:57 2013 +0000
@@ -0,0 +1,147 @@
+#include "mbed.h"
+#include "EthernetInterface.h"
+#include "SDFileSystem.h"
+#include "muri.h"
+#include <stdio.h>
+#include <string.h>
+
+#define HTTPD_SERVER_PORT   80
+#define HTTPD_MAX_REQ_LENGTH   1023
+#define HTTPD_MAX_HDR_LENGTH   255
+#define HTTPD_MAX_FNAME_LENGTH   127
+#define MURI_MAX_RESP_LENGTH  127
+#define I2C_BUFFER_SIZE 31
+
+SDFileSystem sd(p5, p6, p7, p8, "sd"); //
+// I2C i2c(p28, p27);
+EthernetInterface eth;
+TCPSocketServer server;
+TCPSocketConnection client;
+
+char buffer[HTTPD_MAX_REQ_LENGTH+1];
+char httpHeader[HTTPD_MAX_HDR_LENGTH+1];
+char filename[HTTPD_MAX_FNAME_LENGTH+1];
+char obuf[MURI_MAX_RESP_LENGTH+1];
+char data[I2C_BUFFER_SIZE];
+char *uristr;
+char *eou;
+char *qrystr;
+
+FILE *fp;
+int rdCnt;
+
+void get_file(char* uri)
+{
+    printf("get_file %s\n", uri);
+    char *lstchr = strrchr(uri, NULL) -1;
+    if ('/' == *lstchr) {
+        printf("Open directory /sd%s\n", uri);
+        *lstchr = 0;
+        sprintf(filename, "/sd%s", uri);
+        DIR *d = opendir(filename);
+        if (d != NULL) {
+            sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n");
+            client.send(httpHeader,strlen(httpHeader));
+            sprintf(httpHeader,"<html><head><title>Directory Listing</title></head><body><h1>%s</h1><ul>", uri);
+            client.send(httpHeader,strlen(httpHeader));
+            struct dirent *p;
+            while((p = readdir(d)) != NULL) {
+                printf("%s\n", p->d_name);
+                sprintf(httpHeader,"<li>%s</li>", p->d_name);
+                client.send(httpHeader,strlen(httpHeader));
+            }
+        }
+        closedir(d);
+        printf("Directory closed\n");
+        sprintf(httpHeader,"</ul></body></html>");
+        client.send(httpHeader,strlen(httpHeader));
+    } else {
+        sprintf(filename, "/sd%s", uri);
+        fp = fopen(filename, "r");
+        if (fp == NULL) {
+            sprintf(httpHeader,"HTTP/1.1 404 Not Found \r\nContent-Type: text\r\nConnection: Close\r\n\r\n");
+            client.send(httpHeader,strlen(httpHeader));
+            client.send(uri,strlen(uri));
+        } else {
+            sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n");
+            client.send(httpHeader,strlen(httpHeader));
+            while ((rdCnt = fread(buffer, sizeof( char ), 1024, fp)) == 1024) {
+                client.send(buffer, rdCnt);
+            }
+            client.send(buffer, rdCnt);
+            fclose(fp);
+        }
+    }
+}
+
+void get_cgi(char* uri)
+{
+    char *result;
+    muri(uri, data, obuf);
+    if (!strncmp(obuf, "200 ", 4)) {
+        result = obuf +4;
+        sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n");
+        client.send(httpHeader,strlen(httpHeader));
+        client.send(result,strlen(result));
+        printf("result:  %s", result);
+    } else {
+        sprintf(httpHeader,"HTTP/1.1 ");
+        client.send(httpHeader,strlen(httpHeader));
+        client.send(obuf,strlen(obuf));
+        sprintf(httpHeader,"\r\n");
+        client.send(httpHeader,strlen(httpHeader)); 
+    }
+    
+}
+
+
+int main (void)
+{
+//    EthernetInterface eth;
+    eth.init(); //Use DHCP
+    eth.connect();
+    printf("IP Address is %s\n", eth.getIPAddress());
+
+//    TCPSocketServer server;
+    server.bind(HTTPD_SERVER_PORT);
+    server.listen();
+
+    while (true) {
+        printf("\nWait for new connection...\r\n");
+        server.accept(client);
+        client.set_blocking(false, 1500); // Timeout after (1.5)s
+
+        printf("Connection from: %s\r\n", client.get_address());
+        while (true) {
+            int n = client.receive(buffer, sizeof(buffer));
+            if (n <= 0) break;
+            printf("Recieved Data: %d\r\n\r\n%.*s\r\n",n,n,buffer);
+            if (n >= 1024) {
+                sprintf(httpHeader,"HTTP/1.1 413 Request Entity Too Large \r\nContent-Type: text\r\nConnection: Close\r\n\r\n");
+                client.send(httpHeader,strlen(httpHeader));
+                client.send(buffer,n);
+                break;
+            } else {
+                buffer[n]=0;
+            }
+            if (!strncmp(buffer, "GET ", 4)) {
+                uristr = buffer + 4;
+                eou = strstr(uristr, " ");
+                if (eou == NULL) {
+                    sprintf(httpHeader,"HTTP/1.1 400 Bad Request \r\nContent-Type: text\r\nConnection: Close\r\n\r\n");
+                    client.send(httpHeader,strlen(httpHeader));
+                    client.send(buffer,n);
+                } else {
+                    *eou = 0;
+                    if (!strncmp(uristr, "/muri/", 6)) {
+                        get_cgi(uristr+6);
+                    } else {
+                        get_file(uristr);
+                    }
+                }
+            }
+        }
+
+        client.close();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Sat Sep 07 04:43:57 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#869ef732a8a2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Sep 07 04:43:57 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/9c8f0e3462fb
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/muri.cpp	Sat Sep 07 04:43:57 2013 +0000
@@ -0,0 +1,124 @@
+#include "mbed.h"
+#include "muri.h"
+
+I2C i2c(p28, p27);
+
+
+void cmd_i2c_write(char* qry, char* data, char* resp)
+{
+    int addr = 0;
+    int dlen = 0;
+    int dtmp = 0;
+    if (sscanf(qry, "?%2x", &addr) == 1) {
+        qry += 3;
+        while (sscanf(qry, "&%2x", &dtmp) == 1) {
+            data[dlen] = dtmp;
+            qry +=3;
+            dlen +=1;
+        }
+    } else {
+        dlen = -1;
+    }
+    if (dlen > 0 ) {
+        i2c.write(addr, data, dlen);
+        sprintf(resp,"200 %d\r\n", dlen);
+    } else {
+        if (dlen == 0) {
+            sprintf(resp,"204 No data to write: %s\r\n", qry);
+        } else {
+            sprintf(resp,"400 Invalid parameters: %s\r\n", qry);
+
+        }
+    }
+}
+
+void cmd_i2c_read(char* qry, char* data, char* resp)
+{
+    int addr = 0;
+    int dlen = 0;
+    int dcnt = 0;
+    if (sscanf(qry, "?%2x", &addr) == 1) {
+        qry += 3;
+        if (sscanf(qry, "&%2x", &dlen) == 1) {
+            if (i2c.read(addr, data, dlen)!=0) {
+                dlen = -1;
+                sprintf(resp, "500 I2C read failed\r\n");
+            }
+        } else {
+            sprintf(resp, "400 Invalid data length: %s\r\n", qry);
+        }
+    } else {
+        dlen = -1;
+        sprintf(resp, "400 Invalid address: %s\r\n", qry);
+    }
+    if (dlen > 0) {
+        sprintf(resp,"200");
+        resp += 3;
+        for (dcnt = 0; dcnt < dlen; dcnt++) {
+            sprintf(resp," %02x", data[dcnt]);
+            resp +=3;
+        }
+    }
+}
+
+void cmd_i2c_addr_read(char* qry, char* data, char* resp)
+{
+    int addr = 0;
+    int radd = 0;
+    int dlen = 0;
+    int dcnt = 0;
+    if (sscanf(qry, "?%2x", &addr) == 1) {
+        qry += 3;
+        if (sscanf(qry, "&%2x", &radd) == 1) {
+            qry += 3;
+            if (sscanf(qry, "&%2x", &dlen) == 1) {
+                data[0] = radd;
+                i2c.write(addr, data, 1, false);
+                if (i2c.read(addr, data, dlen)!=0) {
+                    dlen = -1;
+                    sprintf(resp, "500 I2C read failed\r\n");
+                }
+            } else {
+                sprintf(resp, "400 Invalid data length: %s\r\n", qry);
+            }
+        } else {
+            dlen = -1;
+            sprintf(resp, "400 Invalid register address: %s\r\n", qry);
+        }
+    } else {
+        dlen = -1;
+        sprintf(resp, "400 Invalid address: %s\r\n", qry);
+    }
+    if (dlen > 0) {
+        sprintf(resp,"200");
+        resp += 3;
+        for (dcnt = 0; dcnt < dlen; dcnt++) {
+            sprintf(resp," %02x", data[dcnt]);
+            resp +=3;
+        }
+    }
+}
+
+
+void muri(char* uri, char* data, char* resp)
+{
+//    sprintf(resp, "501 %s", uri);
+//}
+//void get_cgi(char* uri, char* qry)
+//{
+    char *qry;
+    printf("muri uri:  %s\n", uri);
+    qry = strstr(uri, "?");
+    if (!strncmp(uri, "i2cw?", 5)) { // i2cW [addr] [data] [data] [data] ...
+        cmd_i2c_write(qry, data, resp);
+    } else if (!strncmp(uri, "i2cr?", 5)) { // i2cR [addr] [count]
+        cmd_i2c_read(qry, data, resp);
+    } else if (!strncmp(uri, "i2car?", 6)) { // i2cAR [addr] [radd] [count]
+        cmd_i2c_addr_read(qry, data, resp);
+    } else {
+        sprintf(resp, "501 %s", uri);
+    }
+    printf("muri resp:  %s\n", resp);
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/muri.h	Sat Sep 07 04:43:57 2013 +0000
@@ -0,0 +1,8 @@
+
+//I2C i2c(p28, p27);
+
+void cmd_i2c_write(char* qry, char* data, char* resp);
+void cmd_i2c_read(char* qry, char* data, char* resp);
+void cmd_i2c_addr_read(char* qry, char* data, char* resp);
+void muri(char* uri, char* data, char* resp);
+