ARDUINO – ako webový server /12.časť

0

Späť na úvod >> Späť na programovanie >> Späť na seriál

V predošlých častiach sme vysvetlili, akým spôsobom môžeme k pripojiť k Arduinu LCD displej. A naučili sme sa tvoriť znaky s diakritickými znamienkami a tie následne vypisovať na LCD displej. Teraz pripojíme Arduino k počítačovej sieti. Najprv pomocou eternetového kábla, neskôr pomocou Wi-Fi.

Webový server

Arduino možno k počítačovej sieti pripojiť v dvoch režimoch – ako webový server a ako webového klienta. Každý režim má svoje výhody a nevýhody, ktoré dokážeme využiť v konkrétnej aplikácii. Tentoraz sa budeme zaoberať vytvorením webového servera.

Protokol HTTP

Prv ako začneme programovať webový server na Arduine, musíme si v krátkosti vysvetliť, ako webový server komunikuje s webovým klientom. Komunikácia sa uskutočňuje spôsobom požiadavka – odpoveď. Otázka aj odpoveď majú formát čistého textu, ktorý je zapísaný podľa pravidiel protokolu HTTP (Hyper Text Transfer Protocol).

Ak sa chce klient pripojiť k nejakému webovému serveru, zašle mu požiadavku približne v tomto tvare:

GET / HTTP/1.1
Host: 10.0.0.15
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml, application/xml;q=0.9, image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Referer: http://10.0.0.15/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: cs,en;q=0.8,de;q=0.6,sk;q=0.4
 
Táto správa obsahuje informácie, s akou verziou protokolu HTTP klient pracuje, aký je pre klienta prijateľný formát, o akého klienta ide, aké kódovanie používa a aký jazyk očakáva. Prázdny desiaty riadok je nevyhnutný – takto sa označuje, že požiadavka je ukončená.

Obr.č.2
 
Potom musí webový server požiadavku spracovať a odoslať odpoveď. Tá sa začína príslušnou hlavičkou HTTP. Hlavička obsahuje informácie o verzii HTTP, o stave pripojenia po ukončení prenosu alebo o automatickom obnovovaní. Tieto informácie nám na začiatok stačia, aj keď existuje množstvo ďalších príkazov HTTP. Hlavička odpovede aj s posledným voľným riadkom vyzerá takto:
HTTP/1.1 200 OK
Content-Type: text/html
Connection: close
Refresh: 1

Jazyk HTML

Po hlavičke a voľnom riadku pre klienta server odošle klientovi kód webovej stránky vo formáte jazyka HTML (Hyper Text Markup Language). Ukážme si teraz základnú štruktúru takej stránky:

<!DOCTYPE HTML> 
<html>
        <head>
                <title>Titulok stránky </title> 
        </head>
 
        <body>
          .
          .
          .     
        </body>
</html>
 

Prvý riadok stránky hovorí prehliadaču na obrazovke klienta, že informácie budú zasielané v jazyku HTML. Medzi značkami <html> a </html>, ktorým hovorievame aj tagy, sa nachádzajú dve najdôležitejšie časti stránky. Prvá je hlavička, uzavretá v párových tagoch  <head> a </head>, kde medzi ďalšími tagmi <title> sa nachádza titulok stránky, ktorý sa zobrazí v záhlaví záložky prehliadača. Druhá časť je telo stránky, uzavreté v tagoch <body> a </body>.

Aplikácia

Keď už vieme, ako komunikuje webový klient s webovým serverom, môžeme aj my sprevádzkovať túto dvojicu s Arduinom. Arduino sa stane webovým serverom a webovým klientom sa stane ľubovoľný dostupný počítač, ktorý je k Arduinu pripojený pomocou eternetového kábla. Základné Arduino nemá prípojku na eternetový kábel, preto potrebujeme ethernet shield alebo modul. Tie pripojíme k Arduinu, pri shielde je to veľmi jednoduché, ten iba nasunieme ako nadstavbu nad Arduino Uno (obr. č. 1).

Ak používame modul namiesto shieldu, ten pripojíme k Arduinu pomocou vodičov podľa manuálu k príslušnému modulu (je ich viac typov). Vývojové prostredie Arduina už obsahuje potrebné knižnice na prácu so shieldom a väčšinou modulov, takže nie je nevyhnutné nič doinštalovať a upravovať. Stačí rovno napísať príklad pre webový server, napríklad taký, ako je na výpise č. 1.

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x9C, 0xB7 };
IPAddress ip(192,168,100,170);
 
EthernetServer mojServer(80);
 
void setup(){
    Ethernet.begin(mac, ip);
    mojServer.begin(); //spustíme server
}
 
void loop(){
    EthernetClient Klient = mojServer.available();
    if (Klient){
        boolean prazdnyRiadok = true;
        while (Klient.connected() && Klient.available()){
            // ak klient odosiela HTTP požiadavku
            char c = Klient.read(); //čítaj znaky v bajtoch od klienta
           
            if(c == '\n' && prazdnyRiadok){
                Klient.println("HTTP/1.1 200 OK");
                Klient.println("Content-Type: text/html");
                Klient.println("Connection: close");
                Klient.println("Refresh: 1");
                Klient.println();
                Klient.println("<!DOCTYPE HTML>");
                Klient.println("<html>");
                Klient.println("<head>");   
                Klient.println("<title>Arduino WEB server</title>");
                Klient.println("</head>");
                Klient.println("<body>");
                 // vypíše text
                Klient.print("Ahoj, ja som Tvoj Arduino web server :-)");         
                Klient.println("</body>");
                Klient.println("</html>");
            }
           
            if(c == '\n'){
                prazdnyRiadok = true;
            }
            else if(c != '\r'){
                prazdnyRiadok = false;
                   /*ak klient nepošle dvakrát za sebou \r a \n
                   znamená to, že stále odosiela dáta*/
            }
        }
 
        Klient.stop(); //komunikácia je skončená
    }
}
Hneď na začiatku skeču v definičnej časti zavoláme dve knižnice SPIEthernet. Ich úlohou je komunikovať s ethernet shieldom alebo modulom. Ďalej nadefinujeme dve premenné – macip. Premenná mac predstavuje klasickú MAC adresu sieťového zariadenia, ktorú takto nastavíme Arduinu (využijeme ju vtedy, ak pomocou routera alebo firewallu zabezpečujeme, kto môže pracovať v našej sieti, v tomto príklade to neriešime). Číslo MAC by malo byť unikátne v celej svetovej sieti, ale teraz sa tým netrápme, jednoducho použijeme čísla uvedené v príklade. Premenná ip je podstatne dôležitejšia. Nastavuje sieťovú IP adresu Arduina. Čísla zvoľte také, aké používate vo vašej sieti, ja som použil adresu 192.168.100.170. Nakoniec v tejto časti vytvoríme inštanciu triedy Server s názvom mojServer. Číslo v zátvorkách udáva port, na ktorom bude náš webový server načúvať požiadavkám klientov, v našom prípade na klasickom porte č. 80.

Nasleduje sekcia void setup(), kde pomocou príkazu Ethernet.begin(mac,ip) začneme komunikáciu shieldu s okolím a spustíme server príkazom mojServer.begin.

V sekcii void loop() pre zmenu vytvoríme novú inštanciu s názvom Klient triedy Client. Arduino nadviaže spojenie s klientom a začne prijímať jeho dáta. Ak je spojenie nadviazané a prijatá hlavička od klienta (vrátane povinného prázdneho riadka), začne inštancia Klient príkazom Klient.println odosielať z Arduina klientovi odpoveď – najprv hlavičku a po nej veľmi jednoduchú webovú stránku v jazyku HTML tak, ako sme si to už ukázali. Potom program kontroluje, či klient odoslal dvakrát po sebe znaky ESC nESC r, ktoré sú z čias ďalekopisov a telegramov a značia prechod na začiatok nového riadka.  Vtedy sa spojenie ukončí príkazom Klient.stop.

Program napíšeme, preložíme a nahráme do Arduina. Pozor na nastavenie správnej IP adresy. Arduino pripojíme k nejakému počítaču pomocou eternetového kábla, na počítači spustíme vhodný internetový prehliadač (Mozilla, Opera a iné) a do riadka zadáme adresu Arduina. Ak sme všetko urobili správne, na obrazovke počítača sa v prehliadači zobrazí niečo podobné, ako je na obrázku č. 2.

 

Nabudúce ukážeme, ako pomocou počítačovej siete či Internetu možno ovládať Arduino, napríklad zapínať a vypínať svetlá a čítať analógové hodnoty.

 

Zobrazit Galériu

Miroslav Oravec

Všetky autorove články
arduino seriál programovanie

Pridať komentár

Mohlo by vás zaujímať

Mohlo by vás zaujímať