Prace prowadzone w poprzednich zadaniach koncentrowały się na odmiennych
aspektach działania sieci bezprzewodowych (a od strony technologicznej - na
różnych warstwach: transmisyjnej (zad. 1), aplikacyjnej (zad. 3), łącza danych
(zad. 5, 6 i 7). W tym zadaniu skupiono się na znalezieniu elementów wspólnych
dla dotychczas opracowywanych algorytmów. Waga tego zadania okazała się
szczególnie ważna ze względu na powstały symulator sieci bezprzewodowej (zad.
13), który należało uelastycznić tak, aby możliwa była symulacja całego życia
sieci.
Opracowano podstawowy zestaw czynności, jakie węzeł sieci (stacja) powinna móc
wykonać, oraz zestawu danych, do jakich symulator powinien dawać wgląd, bez
względu na realizowany algorytm. Wynikają one, odpowiednio, z realnych założeń
dotyczących sprzętu realizującego stację sieciową (tj. mikrokontroler, moduł
radiowy), oraz potrzeby weryfikacji poprawności działania algorytmu. Dlatego
też właściwym jest tutaj rozgraniczenie na właściwości lokalne i globalne,
jak następuje.
1. Właściwości lokalne stacji
- ``Personalizacja'' stacji: określenie różnych funkcji i właściwości
stacji na podstawie jej unikalnego identyfikatora, możliwość ich redefiniowania
w trakcie symulacji.
- Określenie częstotliwości nadawania/odbioru i testowanie zajętości
danego kanału radiowego.
- Uruchamianie i zatrzymywanie nadajnika/odbiornika (alternatywnie:
określenie okresów, gdy nadawanie/odbiór jest niemożliwe).
- Wysyłanie wiadomości rozgłoszeniowych (broadcast), jak i z
określonym odbiorcą za pomocą tego samego interfejsu radiowego - o rodzaju
transmisji decyduje zawartość komunikatu (enkapsulacja), a nie rodzaj użytego
nadajnika.
- Określenie podstawowych informacji odbieranej wiadomości: współczynnik
RSSI, siła sygnału, czas otrzymania.
- Możliwość planowania wykonania zadań (periodycznie lub jako rezultat
zajścia zdarzenia), w szczególności możliwość zmiany okresu/odwołania zadań
okresowych i dynamiczna zmiana akcji zdarzeniowych (handlers).
2. Właściwości globalne symulacji
- Dostęp do stanu kanału radiowego w danym momencie (globalnie).
- Weryfikacja i modyfikacja stanu (np. lokalnego czasu, zmiennej
określającej pozostałą moc baterii, itp.), każdej symulowanej stacji.
- Tworzenie i niszczenie stacji w symulacji, niezależne sterowanie
stacjami (uruchamianie w różnych stadiach zaawansowania algorytmu).
Każdy z opracowanych algorytmów można zrealizować jako logiczną sekwencję w/w
procedur, zatem stwierdzono, że proponowany zestaw jest podstawowym, a
realizacja algorytmu - jego uszczegółowieniem (np. w postaci pseudokodu).
Jako jeden z przykładów rozważano następujący algorytm, realizowany przez
pojedynczy węzeł:
Algorytm 1 Prosty algorytm propagacji wiadomości
repeat
słuchaj na kanale
until odebrano wiadomość
ustal $x$ - SNR wiadomości
loop
repeat czekaj until początek slotu czasowego
propaguj wiadomość w tym slocie z prawdopodobieństwem $g(x)$
repeat czekaj until koniec slotu czasowego
if wiadomość wysłana bez kolizji
zakończ algorytm
W przybliżeniu (po opuszczeniu linii kodu nie związanych z samą realizacją
symulatora), wynikowy kod w języku Python, opisujący powyższy algorytm powinien
być zbliżony do następującego:
class Algorithm(...):
def __init__():
isRunning = False
isSlotSuccessful = False
setOnReceive(receive)
def receive(message):
if not isRunning:
isRunning = True
x = SNR(message)
setOnSlotBegin(execute)
setOnSlotEnd(ack)
def execute(self):
if not slotSuccessful:
if rand(0,1) < g(x):
sendNextSlot(message)
else:
finish()
def ack(self):
if channelStatus() == SINGLE:
slotSuccessful = True
Wzmiankowany zestaw generycznych cech symulatora przedstawiono jako dokumentację
konsorcjantowi w celu uwzględnienia w implementacji symulatora sieciowego.
Docelowo, powinniśmy otrzymać możliwość efektywnego symulowania zachowania sieci
\emph{z punktu widzenia zachowania pojedynczej stacji}, a jednocześnie
obserwowania ogólnego działania algorytmu.
Implementacja
W zadaniu tym prowadzone były prace mające na celu integrację rozwiązań
powstałych w ramach poprzednich zadań.
Analizie poddano poszczególne komponenty i algorytmy, sprawdzono wykorzystywane
przez nie klasy i metody, wytypowano też klasy, które mogą zastąpić kilka
istniejących klas spełniających podobne zadania. Efektem tej części prac była
unifikacja struktur danych oraz redukcja kodu. Głównymi elementami poddanymi
unifikacji były:
- Odbieranie wiadomości wysłanych przez inne węzły
- Unifikacja buforów odbiorczych wykorzystywanych przez poszczególne algorytmy
- Unifikacja generatorów zdarzeń, odpowiedzialnych m.in. za generację wiadomości
- Unifikacja metod odpowiedzialnych za rozsyłanie wiadomości, tak, aby wysyłanie
realizowane było przez wspólny kod, niezależnie od trybu transmisji (unicast,
broadcast, convergecast)
- Procedury użyte w poszczególnych algorytmach, tam , gdzie to możliwe, poddano
uspójnieniu, np. procedura zliczania czasu odbierania sygnału radiowego,
wykorzystywana w algorytmach z zadań 3-4 oraz 11-12.
We wcześniejszych zadaniach skupiano się na opracowaniu i badaniu działania
pojedynczej funkcjonalności sieci radiowej. W ramach bieżącego zadania
zintegrowano rozwiązania tak, aby zapewnić efektywne działanie całości złożonej
z kilku komponentów. Efektywność zapewniona została przez wprowadzenie API
(Application Programming Interface) umożliwiającego uruchamianie poszczególnych
procedur, wywoływanie konkretnych metod poszczególnych węzłów oraz łatwe
modyfikowanie lub wprowadzanie nowych algorytmów. Wprowadzano też kilka
funkcjonalności, które nie były potrzebne w czasie prac nad pojedynczym
algorytmem, a okazały się przydatne w przypadku działania kilku algorytmów. Były
to m.in.:
- włączanie i wyłączanie nadajnika
- włączanie i wyłączanie odbiornika
- dynamiczna zmiana trybu działania sieci (multipleksacja w dziedzinie
czasu/częstotliwości)
- obsługa dynamicznego dodawania nowych węzłów do sieci.
Efekty prac zostały uwzględnione w dokumencie ``Symulator sieci radiowej''.