======== Zadání ====== 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). ---- ======== Úvod ====== 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. ---- ======== Software ====== Pro realizace projektu je použit compiler [[https://developer.mbed.org/|mbed]] a knihovny pro práce z sockety a SD-karty pro serverovou část a g++ pro klientskou část. ---- ======== Realizace. Server ====== Úplný kód [[http://pastie.org/10693300|zde]]. ===== Webová stránka ===== 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, "

Current directory: %s

",fsrc); //adding line of current directory strcat(html_page,line); strcat(html_page,"

go_up

");//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,"
Upload file to current directory:

"); switch (err) //handling errors and write them to HTML page { case 0: { strcat(html_page,"

Successful!

"); break;} case 1: { strcat(html_page,"

Can't create file!

"); break;} case 2: { strcat(html_page,"

Can't connet to Server!

"); break;} case 3: { strcat(html_page,"

Can't open file!

"); break;} case 4: { strcat(html_page,"

Successful dowloading!

"); break;} case 5: { strcat(html_page,"

Can't send file!

"); break;} case 6: { strcat(html_page,"

Successful uploading!

"); break;} } strcat(html_page,""); //add end of HTML page }
---- ===== Dowloading ===== 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''): {{ :2015:1.png |stránka}} nebo kontroluje existuje-li soubor (funkce ''overwrite_ask''), ptá se o přepsání (funkce ''send_overwrite_queston'') {{ :2015:2.png |otázka}} posílá požadavek ''PUT '' a posílá soubor klientovi (funkce ''dowloading''). ---- ===== Uploading ===== Pomoci formy je možně nahrát soubor: {{ :2015:3.png?nolink |form}} Po výběru souboru prohlížeč pošle serveru GET-požadavek: ''GET /?file= 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 '' a bude čekat soubor. Klient taky dostane jméno a pošle soubor serveru. ---- ==== Jíné funkce ==== * ''cleaning'' - čištění proměnných * ''add_to_html'' - přidání řádků do HTML-stránky * ''going_up'' - jít nahoru ve systému souborů * ''url_decode'' - dekódování URL-adres ---- ======== Realizace. Klient ====== Úplný kód [[http://pastie.org/10657458|zde]]. Na základě požadavků ze serveru klient hledá, posílá nebo dostává soubory. * Při požadavku ''FND '' klient hledá soubor ve složce a posílá '1' když soubor soubor je nalezen nebo '0' když není. * Při požadavku ''PUT '' otevírá soubor a zapisuje přijaté data do něho. * Při požadavku ''GET '' posílá soubor klientu. **Obecné řešení odesílání souborů:** while(!myfile.eof()) { if (bytes_left ====== Video demostrace ====== - Přechod mezi složky - Uploading urldecode.out do složky /sd/mydir - Uploading 2.png - Downloading tpy.cpp - Downloading urldecode.out {{youtube>D0202I0p_mY?medium}} ====== Závěr ====== 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.