Zadania 14 i 15

Integracja rozwiązań

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
2. Właściwości globalne symulacji
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: 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.: Efekty prac zostały uwzględnione w dokumencie ``Symulator sieci radiowej''.