====== 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