Realizujte zápis a čtení souborů z SD-karty přes Ethernet s použitím vývojové desky FRDM-K64F. Využijte protokol HTTP a jeho požadavky GET a PUT. Pro přístup k souborům na kartě vytvořte jednoduchou webovou stránku (listing).
Vývojové deska připojena přes Ethernet. Na web-stránce (10.42.0.2) je vytvořen seznam souborů a složek a je možnost stáhnout nebo nahrát soubory na SD-kartu. Projekt se skládá z serverové a klientské části. Server (na desce) tvoří webovou stránku, posílá požadavky klientu pro stahováni nebo nahrávání souborů. Klient posílá nebo přijímá soubory.
Pro realizace projektu je použit compiler mbed a knihovny pro práce z sockety a SD-karty pro serverovou část a g++ pro klientskou část.
Úplný kód zde.
Je puštěn jednoduchý web-server, který odpovídá na požadavky prohlížeče HTML-stránkou, která se generuje na základě obsahu SD-karty.
Pro to je vytvořená funkce make_html_list
void make_html_list(const char *fsrc, int err) { char line[100]="Current directory: "; cleaning(html_page, sizeof(html_page)); //cleaning strcpy(html_page,header); //and adding header sprintf (line, "<p>Current directory: %s</p>",fsrc); //adding line of current directory strcat(html_page,line); strcat(html_page,"<p><a href=\"/go_up\">go_up</a></p>");//adding 'up' button DIR *d = opendir(fsrc); //open directory if (d) { struct dirent *p; while ((p = readdir(d)) != NULL) //create list of files and directories in directory { add_to_html (p->d_name); //and add them to HTML page } } else printf("--can't open directory\n\r"); closedir(d); //add form to HTML page strcat(html_page,"<form method=\"put\"><b>Upload file to current directory:</b><p><input type=\"file\" name=\"file\"></p><p><input type=\"submit\" value=\"Send\"></p></form>"); switch (err) //handling errors and write them to HTML page { case 0: { strcat(html_page,"<p>Successful!</p>"); break;} case 1: { strcat(html_page,"<p>Can't create file!</p>"); break;} case 2: { strcat(html_page,"<p>Can't connet to Server!</p>"); break;} case 3: { strcat(html_page,"<p>Can't open file!</p>"); break;} case 4: { strcat(html_page,"<p>Successful dowloading!</p>"); break;} case 5: { strcat(html_page,"<p>Can't send file!</p>"); break;} case 6: { strcat(html_page,"<p>Successful uploading!</p>"); break;} } strcat(html_page,"</body></html>"); //add end of HTML page }
Kliknutím na odkaz prohlížeč generuje GET-požadavek
GET /dir1 HTTP/1.1 …
který čte web-server, a v závislosti na to je-li to složka nebo soubor, generuje stránku s obsahem teto složky (funkce make_html_list
):
nebo kontroluje existuje-li soubor (funkce overwrite_ask
), ptá se o přepsání (funkce send_overwrite_queston
)
posílá požadavek PUT <Jméno souboru>
a posílá soubor klientovi (funkce dowloading
).
Pomoci formy je možně nahrát soubor:
Po výběru souboru prohlížeč pošle serveru GET-požadavek:
GET /?file=<Jméno souboru> HTTP/1.1 …
.
Server z toho dostane jméno souboru (funkce get_file_name
a del_file
) a pomoci funkce uploading
pošle klientu požadavek GET <Jméno souboru>
a bude čekat soubor.
Klient taky dostane jméno a pošle soubor serveru.
cleaning
- čištění proměnnýchadd_to_html
- přidání řádků do HTML-stránkygoing_up
- jít nahoru ve systému souborůurl_decode
- dekódování URL-adresÚplný kód zde.
Na základě požadavků ze serveru klient hledá, posílá nebo dostává soubory.
FND <Jméno souboru>
klient hledá soubor ve složce a posílá '1' když soubor soubor je nalezen nebo '0' když není.PUT <Jméno souboru>
otevírá soubor a zapisuje přijaté data do něho. GET <Jméno souboru>
posílá soubor klientu.Obecné řešení odesílání souborů:
while(!myfile.eof()) { if (bytes_left<packet_size) //if we can send file or part of file in 1 packet { myfile.read(buf,bytes_left); size_send=send(sock,buf,bytes_left,0); break; } else // file or part of file is bigger then 1 packett { myfile.read(buf,packet_size); size_send=send(sock,buf,packet_size,0); } bytes_left-=packet_size; //bytes left to send }
Cíle projektu byly dosaženy: lze stahovat a nahrávat soubory přes webové rozhraní. Ale je možnosti rozšířit ho funkčnost, například sledovat stav sítě a opakovat předávání souboru za jeho přerušení, nebo používat bezdrátový spoj atd.