Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2015:http-sd

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 mbed a knihovny pro práce z sockety a SD-karty pro serverovou část a g++ pro klientskou část.


Realizace. Server

Úplný kód 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, "<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
}

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): stránka nebo kontroluje existuje-li soubor (funkce overwrite_ask), ptá se o přepsání (funkce send_overwrite_queston) otázka posílá požadavek PUT <Jméno souboru> a posílá soubor klientovi (funkce dowloading).


Uploading

Pomoci formy je možně nahrát soubor: form 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.


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 zde.

Na základě požadavků ze serveru klient hledá, posílá nebo dostává soubory.

  • Při požadavku FND <Jméno souboru> klient hledá soubor ve složce a posílá '1' když soubor soubor je nalezen nebo '0' když není.
  • Při požadavku PUT <Jméno souboru> otevírá soubor a zapisuje přijaté data do něho.
  • Při požadavku 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
}

Video demostrace

  1. Přechod mezi složky
  2. Uploading urldecode.out do složky /sd/mydir
  3. Uploading 2.png
  4. Downloading tpy.cpp
  5. Downloading urldecode.out

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.

2015/http-sd.txt · Poslední úprava: 2016/01/18 12:23 autor: Dmytro Kasianenko