Ethernet Robootika Kodulaboris
Autor: Raivo Sell
Käesolev õpiobjekt tutvustab Etherneti kasutamist Robootika Kodulaboris.
Ethernet on põhiline juhtmetega kohtvõrgu (inglise k. lühend LAN)
tehnoloogia, mille kaudu on omavahel ühendatud enamik arvutitest
maailmas, et moodustada internet. Seda tutvustati esmakordselt aastal
1980. Aastal 1985 see standardiseeriti kui IEEE 802.3.
Robootika
Kodulaboris on kasutusel eraldi Etherneti kiip, mis võimaldab
mikrokontrolleris käivitada lihtsa veebiserveri võimaldades nii
kontrolleri sisendeid ja väljundeid juhtides otse üle interneti.
Õpiobjekti nimi: Ethernet Robootika Kodulaboris
Õpiväljundid:
Pärast
mooduli läbimist õpilane:
- Kirjeldab Etherneti standardit
- Kirjeldab Etherneti andmete struktuuri
- Käivitab mikrokontrolleris lihtsa veebiserveri
- Ühendab vajalikud Robootika
Kodulabori moodulid õigesti
Kasutusjuhend:
- Teoreetilise taustamaterjaliga tutvumine
- Graafilise materjaliga tutvumine
- Enesekontrolli küsimustele vastamine
Õpetatav osa: Lugeda
teoreetilist ülevaadet enne riistvara reaalset ühendamist ja
pingestamist. Vaadata juhendeid korrektse riistvara
käsitlemise tagamiseks. Õpitu kinnistamiseks tuleb praktilised näited
reaalselt läbi teha.
Seoste loomine: Läbi
õppejuhendite ja sõnalise selgituse järgimise.
Kinnistav osa: Iseseisev
praktika reaalse riistvarakomplekti baasil.
TEOREETILINE OSA
Ethernet määrab juhtmete ja pistikute tüübid, kirjeldab füüsilist
signaali ülekannet ning määrab andmevahetuse formaadi. Ethernet on
aluseks võrguprotokollidele nagu TCP/IP, millega tagatakse interneti ja
muude võrkude toimimine. Selle standardid on tihedalt seotud OSI
füüsilise kihiga, täites mudeli kahe alumise kihi (füüsiline kiht ja
lülikiht) funktsioone.
Algusaegadel kasutati Etherneti ülesehitamiseks koaksiaalkaableid, mis
vastasid standardile 10BASE5. Hiljem need vahetati keerupaari ja
fiiberoptilise kaabli vastu. Ethernet võimaldab andmevahetust kõikide
kohtvõrku ühendatud seadmete vahel kiirustega 10 Mbit/s kuni 10 Gbit/s.
Etherneti põhised süsteemid jagavad andmevood väiksemateks kaadriteks
(inglise k. frame). Iga kaader peab kindlasti sisaldama saatja ja
vastuvõtja MAC aadressi ja andmeid veakontrolliks. Kaadri keskosas on
piirkond andmete jaoks, mida üle kantakse. Andmed võivad sisaldada
teiste protokollide päiseid, nagu näiteks IP protokoll (inglise k.
Internet Protocol). Veakontroll on realiseeritud 32 bitise
tsükkelkoodkontrolli meetodil, kus saatepoolel rakendatakse edastamisele
kuuluvale andmeplokile 32-bitist polünoomi, mille tulemusena saadav
kood lisatakse plokile. Vastuvõtupoolel rakendatakse andmeplokile sama
polünoomi ja kui tulemused kokku langevad, loetakse andmeedastus
õnnestunuks.
802.3 standardile vastav Etherneti kaader koosneb 8 baidi pikkusest
preambulast. Preambula koosseisus on SFT (inglise k. Start Frame
Delimiter), mis sisaldab biti jagu sünkroniseerimiseks vajalikku
informatsiooni (“10101011”). SFT võimaldab lihtsalt saabuva uue paketi
kindlaks teha. Järgmised kaks korda kuus baiti sisaldavad sihtkoha ja
saatja MAC aadressi, mis kumbki on 48 bitti pikad.
 Etherneti kaader
Järgmised kaks baiti kirjeldavad andmete segmendi pikkust. Nendele
järgneb andmesegment (baidid 46 kuni 1500). Standardi 802.3 järgi saab
maksimaalne andmete segmendi pikkus olla 1500 MTU (inglise k. the
Maximum Transmission Unit). LLC, SNAP ja PPPoE korral on maksimaalne
pikkus kõigest 1492 MTU-d. Muude Etherneti tüüpide korral võib andmete
segmendi pikkus olla vahemikus 1500 kuni 9000 MTU-d. Viimased 4 CRC
baiti on veakontrolliks.
NÄITEKOOD
Kodulabori teegis on funktsioonid lihtsa veebiserveri loomiseks.
Allpooltoodud näiteprogramm loob IP aadressile 192.168.1.100 veebilehe,
millel oleva lingi kaudu on võimalik lülitada sisse ja välja kontrolleri
plaadil olevat LED-i.
#include <string.h>
#include <homelab/module/ethernet.h>
#include <homelab/pin.h>
// Veebilehe koostamiseks eraldi funktsioon
uint16_t ethernet_load_webpage(uint8_t on_off);
// MAC ja IP peavad olema unikaalsed oma kohtvõrgus,
// kahte ühesugust aadressi ei saa olla seadmetel.
// See MAC on suvaliselt võetud (üldjuhul pole vaja muuta)
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
// IP vastavalt kohtvõrgule (viimane number valida ise)
static uint8_t myip[4] = {192,168,1,100};
//andmejada pikkus
static uint16_t gPlen; //Andmete puhvri suurus
#define BUFFER_SIZE 600
static uint8_t buf[BUFFER_SIZE+1];
//LED PB7 muutuja määramine
pin debug_led = PIN(B, 7);
int main(void)
{
uint16_t pktlen;
char *str; // LED PB7 on väljund
pin_setup_output(debug_led);
// Etherneti initseerimine vastavalt etteantud aadressidele
ethernet_init(mymac, myip); while(1)
{
// Võtab vastu pakette, kuni saab endale määratud andmetega paketi
pktlen=ethernet_get_packet(BUFFER_SIZE, buf);
// Teeb paketi eeltöötluse ja vastab "ping" paketile. Tagastab paketi URL-i.
gPlen=ethernet_analyse_packet(buf,pktlen);
// Kui on URL-is on infot, siis hakkab seda analüüsima
if (gPlen!=0)
{ // Laeb URL-i aadressiosa viita "str". Olgu veel öeldud, et
//URL-is on neli esimest kohta IP aadressi numbrid.
str = (char *)&(buf[gPlen+4]);
// Otsib URL-ist stringi "/1"
if (strncmp("/1",str,2)==0)
{
// Laeb veebilehe
gPlen = ethernet_load_webpage(0);
// LED põlema
pin_clear(debug_led); }
// Järgmisena otsib URL-ist stringi "/0"
else if (strncmp("/0",str,2)==0)
{
// Laeb veebilehe
gPlen = ethernet_load_webpage(1);
// LED kustutada
pin_set(debug_led);
}
// Muul juhul lae veebileht vastavalt LED olekule
else { gPlen=ethernet_load_webpage(pin_get_value(debug_led));
} // Kuva varem valmis laetud veebileht
ethernet_print_webpage (buf,gPlen); }
}
return (0);
}
// Veebileht laetakse kuvamiseks kirjutades andmed TCP saatmise puhvrisse
uint16_t ethernet_load_webpage(uint8_t on_off)
{
uint16_t plen=0; // Laeb html koodi saatmiseks puhvrisse
// Need suured stringid on salvestatud PSTR makro abil programmimälusse,
// et mitte raisata liigselt töömälu.
// Laeb veebilehe päise
plen=ethernet_load_data(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"));
plen=ethernet_load_data(buf,plen,PSTR("<center><p>Homelab PB7 LED: "));
// Kui LED ei põle, siis kuva nii.
if (on_off)
{
plen=ethernet_load_data(buf,plen,PSTR("<font color=\"#00FF00\"> OFF</font>"));
}
// Kui LED põleb.
else
{
plen=ethernet_load_data(buf,plen,PSTR("<font color=\"#FF0000\"> ON</font>"));
}
// Lae "Refresh" nupp
plen=ethernet_load_data(buf,plen,PSTR(" <small><a href=\".\">[refresh status]</a></small></p>\n<p><a href=\"."));
// Lae LED oleku muutmise nupp vastavalt selle olekule.
if (on_off)
{
plen=ethernet_load_data(buf,plen,PSTR("/1\">Switch on</a><p>"));
}
else
{
plen=ethernet_load_data(buf,plen,PSTR("/0\">Switch off</a><p>"));
} // Väljasta andmete lõpu aadress puhvris
return(plen);
}
LISAMATERJAL
- Robootika Kodulabor - Ethernet
- Etherneti kiibi ENC28J60 andmeleht
Teoreetilise osa algtekstide autor: Raivo Sell ja Heiko Pikner
|