====== Ethernet ====== //Seotud mooduliga: [HW] [[et:hardware:homelab:controller]]// See teegi osa sisaldab Kodulabori etherneti kasutamise funktsioone. ===== Konstandid ===== * **//static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24}//** - kontrolleri MAC aadress (võib valida suvalise aadress, kuid oluline on, et ühes võrgus aadressid ei korduks). * **//static uint8_t myip[4] = {192,168,1,100}//** - IP aadress vastavalt kohtvõrgule, viimane number tuleb ise valida, juhul kui see on võrgus juba hõivatud. * **//static uint8_t buf[BUFFER_SIZE+1]//** - andmepuhvri suurus (tavaliselt 600+1 baiti). ===== Funktsioonid ===== * **//void ethernet_standby(void)//** \\ Viib etherneti kontrolleri magavasse (madala energiatarbega) olekusse. * **//void ethernet_init(uint8_t *mac, uint8_t *ip)//** \\ Etherneti kontrolleri algseadistus koos MAC ja IP aadressidega. Parameetrid: * //*mac// - MAC aadressi massiiv. * //*ip// - IP aadressi massiiv. * **//uint16_t ethernet_get_packet (uint16_t maxlen, uint8_t* packet)//** \\ Kuulab võrku, kuni saab endale mõeldud ja andmeid sisaldava andmepaketi. Parameetrid: * //maxlen// - maksimaalne lubatud andmepuhvri suurus. * //*buffer// - massiiv, kuhu salvestab vastuvõetud andmed edasiseks töötluseks. * Kui pakett on saabunud, tagastab saabunud paketi pikkuse baitides, vastasel juhul tagastab 0. * **//uint16_t ethernet_analyse_packet(uint8_t *buf,uint16_t plen)//** \\ Analüüsib, kas vastuvõetud andmepakett sisaldab URL-i kohta andmeid. Vajadusel vastab pingile. Parameetrid: * //*buf// - andmete massiiv, mida analüüsida. * //plen// - saabunud paketi pikkus baitides. * Tagastab URL-i esimese tähemärgi aadressi. Kui URL on tühi, siis tagastab 0. * **//uint16_t ethernet_load_data (uint8_t *buf,uint16_t pos, const prog_char *progmem_s) //** \\ Laeb veebilehe kuvamiseks html-koodi kontrolleri programmimälust TCP saatmise puhvrisse. Parameetrid: * //*buf// - andmemassiiv, mida saata TCP kaudu. * //pos// - andmete lõpu aadress puhvris, mida tuleb jälgida, kui andmeid üksteise järele laadida sinna. Esimene aadress on 0. * //*progmem_s// - stringi nimi, mis on salvestatud programmi mällu ja kust andmed laetakse saatmise massiivi. * Tagastab andmejada lõpu aadressi, mida saab sisestada parameetrina järgmise html-koodi laadimiseks. * **//void ethernet_print_webpage (uint8_t *buf,uint16_t dlen)//** \\ Kuvab veebilehte vastavalt valmislaetud html-koodile. Parameetrid: * //*buf// - andmemassiiv, kuhu html on valmis laetud. * //dplen// - andmete lõpu aadress puhvris, milleni kuvab koodi. ===== Näide ===== #include #include // 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]; int main(void) { uint16_t pktlen; char *str; // 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 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 "/x" if (strncmp("/x",str,2)==0) { // Laeb veebilehe gPlen = ethernet_load_webpage(0); } // 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") ); // Laeb veebilehe sisu, milleks on tekst "Kodulabor". plen=ethernet_load_data(buf,plen,PSTR("Kodulabor")); // Väljasta andmete lõpu aadress puhvris return(plen); }