====== Wireless MAC ====== Ciubotariu Codrin - Master AAC Constantinescu Adrian - Master AAC ===== Introducere ===== In cadrul unei retele de senzori wireless, rolul fiecarui nod este de a "culege" si transmite informatii catre un nod central sau catre toate celelalte noduri. Proiectul nostru propune o metoda de a realiza aceasta comunicare, urmarind atat **trimiterea mesajelor de la nodul central la restul nodurilor**, cat si invers, avand in vedere si o **sincronizare** a perioadelor de trimitere-receptie si folosirea unui timp de **"sleep"** pentru reducerea consumului de energie. ===== Descriere generala ===== Nodurile din cadrul retelei sunt de tipul Sparrow v3, iar pentru simulare in Avrora am folosit platforma atmega128rfa1ek1 in cadrul unei topologii cu mai multe noduri. * Nodurile urmeaza un program comun de activitate wireless, vor transmite la inceput un mesaj broadcast pentru a obtine informatii de rutare apoi vor transmite un pachet de la un nod specificat catre nodul desemnat base-station (nodul 0). * Senzorii sunt sincronizati asa incat sa alterneze intre perioade active si perioade de sleep. Toate nodurile vor fi in aceeasi stare (activa sau sleep) la un anumit moment de timp. ===== Implementare si simulare teoretica [1]===== Base-station-ului (nodul cu indicele 0) va da un mesaj initial de Broadcast. Toti senzorii retin numarul de hop-uri pana la base-station si next-hop-ul pana la base-station. Pentru a minimiza sansele ca mesajul de broadcast să fie pierdut, fiecare nod care primeste un mesaj de broadcast (prima oară) va transmite in urmatoarele doua frame-uri cate un broadcast. **Stabilirea "topologiei" de rutare**, pentru fiecare nod se face in aceasta faza initiala. In interiorul retelei, comunicarea se va face din aproape in aproape, dar va avea ca punct final nodul 0, **orice pachet este directionat inspre base-station.** Pentru a transmite un pachet, un nod va trimite mai intai un scurt pachet **RTS** [2] (care contine destinatia hop-ului curent). Trimiterea acestui pachet se face cu contention period, nodul va astepta un interval marginit de un sfert din perioada activa (deci între 0 si ACTIVE_PERIOD/4) inainte de a trimite, si se abtine daca a fost transmis intre timp alt pachet RTS. Nodul care este adresat ca next hop va raspunde cu un mesaj **CTS**. Pachetul poate fi transmis in acea perioada activa imediat dupa receptionarea CTS. ===== Rulare si rezultate ===== Pentru fiecare nod, **un ciclu dureaza 20 de secunde**. In acest timp, nodul va face receptie si trimitere, dupa caz, iar in momentul in care si-a incheiat activitatea intra in sleep pana la termianrea cuantei de 20 de secunde, cand "se trezeste" pentru a incepe un nou ciclu. La transmiterea mesajului, contention period este de 5 secunde. == Testul 1 == Topologia contine doua noduri Node Time Event ------------------------------------------------------------------------------ 0 0:00:00.000762 ----> 00.00.00.00.7A.04.0D.FF.68.AC 0.319 ms 1 0:00:00.000796 <==== 00.00.00.00.7A.04.0D.FF.68.AC 0.319 ms == Testul 2 == Topologia contine sase noduri Node Time Event ------------------------------------------------------------------------------ 0 0:00:00.000882 ----> 00.00.00.00.7A.07.0D.FF.00.00.00.6A.D9 0.416 ms 2 0:00:00.000916 <==== 00.00.00.00.7A.07.0D.FF.00.00.00.6A.D9 0.416 ms 1 0:00:00.000916 <==== 00.00.00.00.7A.07.0D.FF.00.00.00.6A.D9 0.416 ms 1 0:00:00.102397 ----> 00.00.00.00.7A.07.0D.FF.01.00.01.4D.C8 0.416 ms 2 0:00:00.202771 ----> 00.00.00.00.7A.07.0D.FF.02.00.01.14.98 0.416 ms 1 0:00:00.203306 ----> 00.00.00.00.7A.07.0D.FF.01.00.01.4D.C8 0.416 ms 2 0:00:00.404054 ----> 00.00.00.00.7A.07.0D.FF.02.00.01.14.98 0.416 ms 4 0:00:00.102432 <==== 00.00.00.00.7A.07.0D.FF.01.00.01.4D.C8 0.416 ms 3 0:00:00.102432 <==== 00.00.00.00.7A.07.0D.FF.01.00.01.4D.C8 0.416 ms 3 0:00:00.404672 ----> 00.00.00.00.7A.07.0D.FF.03.00.02.13.CB 0.416 ms 4 0:00:00.505044 ----> 00.00.00.00.7A.07.0D.FF.04.00.02.96.5B 0.416 ms 3 0:00:00.706335 ----> 00.00.00.00.7A.07.0D.FF.03.00.02.13.CB 0.416 ms 4 0:00:00.907079 ----> 00.00.00.00.7A.07.0D.FF.04.00.02.96.5B 0.416 ms 5 0:00:00.505080 <==== 00.00.00.00.7A.07.0D.FF.04.00.02.96.5B 0.416 ms 5 0:00:01.008073 ----> 00.00.00.00.7A.07.0D.FF.05.00.03.B1.4A 0.416 ms 5 0:00:01.510491 ----> 00.00.00.00.7A.07.0D.FF.05.00.03.B1.4A 0.416 ms In continuare vom descrie un frame de mai sus. Vom lua ca referinta frame-ul nr 4 (00.00.00.00.7A.07.0D.FF.01.00.01.4D.C8): * 7A.07 (2 octeti) - lungimea frame-ului; * 0D (1 octet) - Magic payload, numarul 13; * FF (1 octet) - Adresa destinatie (MAC) a frame-ului; FF reprezinta adresa broadcast; * 01 (1 octet) - Adresa sursa (MAC) a frame-ului; * 00 (1 octet) - tipul pachetului encapsulat. Acesta este un pachet numit "DISCOVERY" de catre noi, si are valoarea 0; * 01 (1 octet) - Numarul de hopuri pe care il are nodul sursa pana la nodul base station; Informatie specifica pachetului DISCOVERY * 4D.C8 (2 octeti) - CRC; ===== Informatii aditionale ===== == Anexa 1 - structuri de date == * tipurile de mesaje si structurile lor typedef enum { DISCOVERY = 0, RTS, CTS, NORMAL }packet_type; typedef struct { uint8_t hop_nr; /* number of hops from the sender of the packet to node 0 */ }discovery_packet; typedef struct { uint8_t request; // must be 1 - request; }rts_packet; typedef struct { uint8_t response; // 1 - ack; 0 - nack }cts_packet; typedef struct { uint8_t val; }normal_packet; * componenta unui mesaj typedef struct { uint8_t destination_node; /* receiver of the packet */ uint8_t source_node; /* transmitter of the packet */ packet_type type; /* type of the next packet */ //uint8_t data_size; /* nr of bytes for data */ void * data; /* pointer to data_size bytes of data */ }Frame_t; * tabela de rutare pentru fiecare nod (directia catre nodul 0) typedef struct { int next_hop; int hop_count; }route_table; ===== Bibliografie ===== * [1] http://elf.cs.pub.ro/wsn/wiki/lab3 * [2] http://en.wikipedia.org/wiki/IEEE_802.11_RTS/CTS