Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
10 years, 4 months ago.
HTTP_SD_Server_K64F & NTPClient
Has anybody managed to get both these working in the same program. I can get both to work independently, but not together.
- include "mbed.h"
- include "EthernetInterface.h"
- include "SDFileSystem.h"
- include <stdio.h>
- include <string.h>
- include "NTPClient.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 HTTPD_MAX_DNAME_LENGTH 127
Serial pc(USBTX, USBRX);
SDFileSystem sd(p5, p6, p7, p8, "sd"); LPC1768 MBD2PMD SDFileSystem sd(P0_18, P0_17, P0_15, P0_16, "sd"); Seeeduino Arch Pro SPI2SD SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); K64F
NTPClient ntp; 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 dirName[HTTPD_MAX_DNAME_LENGTH+1]; char *uristr; char *eou; char *qrystr;
FILE *fp; int rdCnt;
void SetTimeNTP(void) { pc.printf("NTP update time...\r\n"); eth.init("192.168.0.11", "255.255.255.0", "192.168.0.1"); set blank to Use DHCP eth.init(); Use DHCP eth.connect(); if (ntp.setTime("0.pool.ntp.org") == 0) { pc.printf("Set time successfully\r\n"); time_t ctTime; ctTime = time(NULL); pc.printf("Time is set to (UTC): %s\r\n", ctime(&ctTime)); } else { pc.printf("Error\r\n"); }
eth.disconnect();
pc.printf("NTP eth closed");
while(1) {
}
}
--- end of SetTimeNTP -----
void get_file(char* uri) { pc.printf("get_file %s\n", uri); char *lstchr = strrchr(uri, NULL) -1; if ('/' == *lstchr) { pc.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 Directory Listing</h1><ul>", uri); client.send(httpHeader,strlen(httpHeader)); struct dirent *p; while((p = readdir(d)) != NULL) { sprintf(dirName, "%s/%s", fileName, p->d_name); pc.printf("%s\n", dirName); DIR *subDir = opendir(dirName); if (subDir != NULL) { sprintf(httpHeader,"<li><a href=\"./%s/\">%s/</a></li>", p->d_name, p->d_name); } else { sprintf(httpHeader,"<li><a href=\"./%s\">%s</a></li>", p->d_name, p->d_name); } client.send(httpHeader,strlen(httpHeader)); } } closedir(d); pc.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); } } }
int main (void) { Serial Interface pc.baud(115200); pc.printf("Initializing\n"); time_t ctTime; ctTime = time(NULL);
pc.printf("Time is set to (UTC): %s\r\n", ctime(&ctTime));
Check File System pc.printf("Checking File System\n"); DIR *d = opendir("/sd/"); if (d != NULL) { pc.printf("SD Card Present\n"); } else { pc.printf("SD Card Root Directory Not Found\n"); }
EthernetInterface eth pc.printf("Initializing Ethernet\n"); pc.printf("Connecting\n");
SetTimeNTP(); Set NTP Time eth.init("192.168.0.11", "255.255.255.0", "192.168.0.1"); set blank to Use DHCP eth.connect();
pc.printf("MAC Address %s\n", eth.getMACAddress()); pc.printf("IPv4 Address %s\n", eth.getIPAddress()); pc.printf("Subnet Mask %s\n", eth.getNetworkMask()); pc.printf("Default Gateway %s\n", eth.getGateway());
TCPSocketServer server; server.bind(HTTPD_SERVER_PORT); server.listen(); pc.printf("Server Listening port : %d\n", HTTPD_SERVER_PORT);
while (true) { pc.printf("\nWait for new connection...\r\n"); server.accept(client); client.set_blocking(false, 1500); Timeout after (1.5)s
pc.printf("Connection from: %s\r\n", client.get_address()); while (true) { int n = client.receive(buffer, sizeof(buffer)); if (n <= 0) break; pc.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; pc.printf("uristr %s\n",uristr); eou = strstr(uristr, " "); pc.printf("eou %s\n",eou); 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; get_file(uristr); } } }
client.close(); } }
Question relating to:
1 Answer
10 years, 4 months ago.
George,
Please encapsulate your code with:
//your code
It makes it much, much easier to read.
...kevin
I eventually found the solution of using the NTP server and ethernet. Don't close the connection after the NTP and before the running the WEB server. The code now runs as a server. I connect the Ethernet port to the laptop ethernet port, and set up a Bridge connection via WiFi. I can now load files from the SD card via the WEB! I have even run some simple JS code. All I need to do is figure how the get "numbers" from code to the WEB pages, any ideas?
posted by 02 Sep 2014
Can you share more from your main program? Use code highlight "
posted by Martin Kojtal 22 Aug 2014<<code>>" "<</code>>
". Thanks.I think there are some issues combining the SDFileSystem and EthernetInterface libraries on the K64F. You can find the basic code for the K64F version of the web server here: http://mbed.org/teams/FRDM-K64F-Code-Share/code/HTTP_SD_Server_K64F/ The same code runs on the mbed1768 ( http://mbed.org/users/gsteiert/code/HTTP_SD_Server/ ) and Seeeduino Arch Pro ( http://mbed.org/users/gsteiert/code/HTTP_SD_Server_ArchPro/ ), but I cannot get it to successfully return a file from the SD card to the web browser with the K64F board. Tracking down the source of the problem is beyond my ability with the time I have for this right now.
posted by Greg Steiert 25 Aug 2014