Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Následující verze | Předchozí verze | ||
2015:http-sd [2015/12/28 15:42] Dmytro Kasianenko vytvořeno |
2015:http-sd [2016/01/18 12:23] (aktuální) Dmytro Kasianenko [Realizace. Server] |
||
---|---|---|---|
Řádek 5: | Řádek 5: | ||
======== Úvod ====== | ======== Ú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 stahnout nebo nahrat soubory na SD-kartu. Projekt se skladá z severové a klientské časti. Server (na desce) troří webovu stranku, posíla požadavky klientu pro stahováni nebo nahrvání souborů. Klient posíla nebo přijíma soubory. | + | 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 ====== | ======== Software ====== | ||
- | Pro realizace projektu je použit compiler [[https://developer.mbed.org/|mbed]] a knihovny pro práce z sockety a SD-karty pro severovu čast a g++ pro klientskou čast. | + | 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 ====== | + | ======== 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. | 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** | + | Pro to je vytvořená funkce ''make_html_list'' |
<code cpp> | <code cpp> | ||
void make_html_list(const char *fsrc, int err) | void make_html_list(const char *fsrc, int err) | ||
Řádek 27: | Řádek 29: | ||
{ | { | ||
struct dirent *p; | struct dirent *p; | ||
- | while ((p = readdir(d)) != NULL) //creating list of files and directories in directory | + | while ((p = readdir(d)) != NULL) //create list of files and directories in directory |
{ | { | ||
- | add_to_html (p->d_name); //adding them to HTML page | + | add_to_html (p->d_name); //and add them to HTML page |
} | } | ||
} | } | ||
Řádek 50: | Řádek 52: | ||
} | } | ||
</code> | </code> | ||
+ | ---- | ||
+ | ===== 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 <Jméno souboru>'' 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=<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 [[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 <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ů:** | ||
+ | <code cpp> | ||
+ | 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 | ||
+ | } | ||
+ | </code> | ||
+ | ====== 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. |