Mérési útmutató a Mobil infokommunikáció laboratórium 1. (VIHIA319) méréseihez
Szenzorhálózati szimuláció OMNeT++ környezetben
Mérés helye: Hálózati Rendszerek és Szolgáltatások Tanszék Mobil Távközlési és Informatikai Laboratórium (MCL) I.B.113. Összeállította: Milánkovich Ákos, PhD hallgató Ill Gergely, PhD hallgató
Utolsó módosítás: 2013. október 21.
Bevezetés Jelen mérés célja, hogy egy egyszerű példaprogram segítségével megismerkedjünk az OMNeT++ szimulációs környezetel és annak programozásával, valamint a vezetéknélküli szenzorhálózatok egy implementációjával. Távközlési és számítógép hálózatok vizsgálatát sok esetben költséghatékony módon vizsgálhatjuk számítógépre megírt szimulációk segítségével. Ekkor a költséges fizikai megvalósítás helyett, egy számítógépes program segítségével vizsgáljuk az adott hálózat működését és teljesítőképességét. Számos szimulációs környezet áll rendelkezésre, mint pl.: NS (Network Simulator), OPNET, OMNeT++. Az OMNeT++ rendszert egyetemünkön fejlesztették ki, nyílt forráskódú és szabadon felhasználható (http://www.omnetpp.org/).
Szenzorhálózatok Már napjainkban sem ritkák a több száz, a jövőben pedig tipikusak lesznek a több ezer olcsó, intelligens (limitált számítási kapacitással és szerény kommunikációs képességgel rendelkező) érzékelőből álló, egy közös cél érdekében összehangolt működést (érzékelést, számítást, beavatkozást) végző szenzorhálózatok, amelyek az egészségügy, a gyártás-monitorozás, a környezetvédelem, a honvédelem és a mindennapi élet számos területén helyet követelnek maguknak. A szenzorhálózatokban használt csomópontok általában négy részből épülnek fel: feldolgozó és tároló modul (mikrokontroller), rádiós modul, szenzor és beavatkozó modul, energia modul. A csomópontok
számítási
kapacitása
alacsony,
energiaforrásuk
is
korlátos
(általában
akkumulátorról üzemelnek, használhatnak megújuló energiaforrásokat). A csomópontok az energiahatékony működés érdekében az idő nagy részében alvó állapotban vannak, csak akkor ébrednek fel, ha csomagok kell fogadniuk vagy küldeniük. A vezetéknélküli szenzorhálózatok általában alacsony bitsebességen továbbítják az általuk mért adatokat. A szenzorhálózatokban felmerülő problémák, amelyekre megoldást kell adni, a következők: -
energiahatékonyság: az eszközök fogyasztása és a kommunikációs protokollból származó overhead minimalizálása
-
megbízható adatátvitel: ha a csomagok átvitele nem sikeres, nő a késleltetés és a csomagok átküldésére fordított energia is, ha meg kell a csomagkoat ismételni
-
vezetéknélküli kommunikációból fakadó problémák: interferencia, rejtett terminál, routing,
Az OMNeT++-ről általánosan
Az OMNeT++ egy objektum orientált, moduláris, diszkrét szimulációs környezet. Egy OMNeT++ hálózat hierarchikus modulokból épül fel. A modell mélysége nincs meghatározva. A modulok üzenetek segítségével kommunikálnak egymással, mely üzenetek komplex adatstruktúrákat is tartalmazhatnak. Az üzeneteket a modulok között előre definiált kapukon és csatornákon keresztül, vagy akár közvetlenül is el lehet küldeni. A fejlesztőnek a hierarchia legalsó szintjén található modul viselkedését kell megírni C++ nyelven. A szimuláció futtatása során ezen modulok párhuzamosan (korutinként) futnak. A környezet különböző felhasználói felületeket (hibakeresés, bemutató, batch futtatás) biztosít, mely nagyban elősegíti a fejlesztést. A modulok összeköttetését, szerkezetét egy speciális leírónyelven, a NED (NEtwork Description) nyelven kell megírni, melyet a környezet szintén C++ nyelvre fordít le. Így a teljes szimuláció C++ nyelven áll rendelkezésre, mely jó hordozhatóságot biztosít, így a szimuláció Windows, Mac, Linux operációs rendszeren is módosítások nélkül fut. A környezet a grafikus megjelenítéshez a Tcl/Tk könyvtárakat használja, mely szintén segíti a hordozhatóságot.
Egy OMNeT++ szimulátor megvalósítása Első lépésként a hálózatot kell megtervezni. A megtervezett hálózatot NED nyelvre kell átírnunk. A részegységeket moduloknak feleltetjük meg, melyből két féle van. Az egyszerű (simple), mely tovább nem bontható, azaz atomi és az összetett (module), mely egyszerű modulokból épül fel. A hálózat (network) pedig ezen modulok összességét jelenti (Ábra 1.). A NED file elkészítése során az egyszerű modulok megadása után következnek az összetett modulok, majd a végén megadjuk a hálózatot is. A modulokat kapuk segítségével kötjük össze (Ábra 2.).
Ábra 1.: Modell struktúra
Az egyszerű modul felépítése:
simple Típusnév { parameters : //paraméterek megadása paraméter_név : paraméter_típus; //típus lehet numeric, input, boolean, … gates : // a modul be- és kimeneti kapujai out : ki_kapu neve[]; //kimeneti kapu, [] esetén egynél több kimeneti kapu van in : be_kapu neve[]; //bemeneti kapu, [] esetén egynél több bemeneti kapu van }
Ábra 2.: Kapuk összekötése
Az összetett modul felépítése: module Név // modul neve { gates : // a modul kapui in : be_kapu neve[]; out : ki_kapu neve[]; submodules : // almodulok megadása almodul_neve : almodul_típusa; // az előbb definiált egyszerű modulra hivatkozhatunk parameters : // az egyszerű modul paramétereinek itt lehet értéket adni
paraméter_név = paraméter_érték; gatesizes : // vektoros kapuk esetén itt kell megadni a vektor méretét out[5]; display : "p=130,259;b=40,24"; // modul helye a képernyőn connections : // kapuk összeköttetései egyszerű_modul_ki_kapu --> összetett_modul_ki_kapu; egyszerű_modul_be_kapu <-- összetett_modul_be_kapu; } A hálózat felépítése: network hálózat_neve : összetett_modul endnetwork A paramétereknek a hierarchia tetszőleges szintjén adhatunk értéket. Ha a paraméterek az egyszerű modulban nem kapnak értéket, akkor az összetett modulban, vagy a hálózatban kell megadnunk az értékeket. Lehetőségünk van még paraméterek megadásásra az omnetpp.ini állományban is. Második lépésként megírjuk az egyszerű modulok viselkedését: class egyszerű_modul_típusa : public cSimpleModule { virtual void initialize(); // a viselkedést leíró függvény virtual void handleMessage(cMessage* m); // a viselkedést leíró függvény virtual void processSelfMessage(cMessage* m); // a viselkedést leíró függvény }; Define_Module (egyszerű_modul_típusa); //a NED-ben lévő típus megfeleltetése a C++ kódban megírt osztálynak
Activity() függvény: Korutinokként futnak, vagyis ezek párhuzamosan futó szálak, így lehetővé válik a multitasking feldolgozás. Állandóan futnak, ezért van bennük egy végtelen ciklus. Ha egy esemény érkezett, akkor a „főprogram” futása felfüggesztődik, és annak a modulnak az activity() vagy handleMessage() függvényére adódik a vezérlés, amelyik az üzenetet kapta. Ha lekezelte, visszatér a főprogramba.
Az handleMessage()-ben alkalmazott fontosabb függvények: • send (üzenet küldése) • ScheduleAt (esemény ütemezése) • cancelEvent (ütemezett esemény törlése) Egy példa activity() függvény: void Source::activity() { char mit[30]; int gs= par("gs"); //a NED fájlban megadott paraméter beolvasása cMessage *smsg = new cMessage; // új üzenet konstruálása scheduleAt(simTime()+exponential(5),smsg); // ütemezés, timer megvalósítása önüzenettel 5 másodperces várhatóértékű exponenciális eloszlás szerint do { cMessage *msgin = receive(); // üzenet fogadása if (msgin->isScheduled()) delete cancelEvent(smsg); // önüzenet törlése int out = intrand(gs); //véletlenszám generálás if (out%2) strcpy(mit,"message (to HOLE)"); else strcpy(mit,"message"); cMessage *msg = new cMessage(mit); if (out%2) msg->setKind(7); else msg->setKind(2); ev.printf("[SOURCE]: Sending message on gate %d\n",out); send(msg,"out",out); //üzenet elküldése az out vektorkapu out sorszámú kimenetén cMessage *smsg = new cMessage; scheduleAt(simTime()+exponential(5),s msg); } while (1); }
A szimulációk többségében érdemesebb a handleMessage() függvényt alkalmazni az activity() helyett, mert kevesebb memóriát fogyaszt és nem korutinként fut, így nincs a korutinok közötti váltásnak overheadje, hanem csak függvényhívások fordulnak elő, ami gyorsabb végrehajtást tesz lehetővé.
A szimulációs környezet használatáról A szenzorhálózat szimulációja az omnetsim.exe fájl futtatásával inditható el. Két ablak jelenik meg (Ábra 3.), egyiken a hálózat felépítése, a másikon a szimuláció futása alatt fellépő események láthatók. A grafikus ablakon látszanak az üzenetek, valamint a kívánt modulra kattintva nézhetjük meg annak belső felépítését. A szöveges ablakon találjuk a főbb vezérlő gombokat, melyek a következők: − Step: Egy lépést hajt végre, az esemény bekövetkezése után megállítja a szimulátor futását. − Run: Ezzel a gombbal indíthatjuk el a szimulátort. − Stop: Ezzel a gombbal állíthatjuk le a szimulátort. A szimuláció egyéb esetben akkor áll le, ha vagy elfogynak az események, vagy lejár a szimuláció előre megadott futási ideje.
Ábra 3.: Szimulációs futtatása Az események értelmezése a következő:
Event #37
T=17
Node,id=4
‘ack’
esemény azonosítója
bekövetkezés ideje
modul azonosítója
üzenet leíró
Szenzorhálózati szimuláció felépítése A feladatok során használt OMNeT++ szimuláció a következő osztályokból épül fel: AckBuffer DiscoverRoutePacket FoundNodesPacket Gateway Log LowerLayerPacket Node Packet PacketType Radio.ned RoutingTable omnetpp.ini omnetsim.exe package.ned
A csomópontok minden vett üzenetre nyugtát küldenek, ez az osztály felel ezért a funkcióért Csomagtípus az útvonalkeresés indításához Csomagtípus a megtalált szomszédok jelentésére A hálózati csomópont osztályból származó koordinátor csomópont Logolást menedzselő osztály Hálózati rétegbeli csomagtípus, payloadja a Packet Hálózati csomópont osztálya A csomag alaptípusa, ebből származnak a konkrét csomagtípusok Csomagtípusok menedzselő osztálya Leírja a teszt hálózat elrendezését és a modulok közötti kapcsolatokat, valamint azok paramétereit A csomópont routing tábláját menedzselő osztály Konfugurációs fájl a közös paraméterekre Futtatható szimulátor állomány Deklarálja a projekt csomagnevét, ne módosítsd
Mérési feladatok Indítsa el az OMNeT++ futtatási környezetet a “C:/omnetpp/omnetpp-4.3.1/mingenv.exe”-vel, amjd írja be a megnyílt parancssorba: “omnetpp”. 1. Szimuláció lefordítása, futtatása. Az ElsoFeladat nevű topológián szimuláció futtatása segítségével állapítsa meg milyen csomagokat küldenek az egyes csomópontok! Írja le az egyes, megfigyelt üzenettípusok forrás és cél csomópontját, valamint a csomag típusát! Ehhez vizsgálja meg a szimuláció futtatása során létrejött logot.
Sorszám
Forrás
Cél
Típus
1. 2. 3. 4. 5.
Milyen információkat tartalmaznak az egyes csomagok a hálózat viselkedésére nézve? Mutassa be hogyan működik a megfigyelt protokoll, részletesen kitérve az egyes csomagok sorrendjére, azok protokollban betöltött szerepére és a csomópontok felderítésére! Mutassa be egy példán keresztül hogyan töltődik fel egy csomópont routing táblája! 2. Új topológia létrehozása Hozzon létre egy új hálózati topológiát a Radio.ned állományban! A létrehozandó topológia tartalmazzon legalább 6 darab csomópontot és egy gateway elemet. A hálózat egyes csomópontjai közötti összeköttetéséket úgy állítsa be, hogy a kapott hálózati szerkezet tartalmazzon legalább egy kört és a topológia által kifeszített gráf összefüggő legyen. 3. Csomagvesztés szimulációja A 2. feladatban létrehozott már működő topológián idézzen elő csomagvesztés X=0,2 valószínűséggel. Figyelje meg ebben az esetben a hálózat működését és írja le mi történik! A, Figyelje meg, hogy a második feladatban lévő események számához képest, most hány esemény kell, hogy a felderítési fázis sikeresen lefusson! B, Változtassa meg a csomagok újraküldésének lehetséges számát Y=3-ra és vizsgálja meg ennek hatására milyen változások mennek végbe a hálózaton.
C, Állítsa be, hogy az egyes csomópontok figyeljenek a kapott csomagok CRC-hibájára is! Mintának keresse meg a kódban a csomagvesztés implementációját! 4. Ping üzenetek küldése Implementálja a Ping csomag küldést a gateway-en a discover fázis lezárulása után a 2. feladatban létrehozott topológián! A Ping üzenetet a Gateway-től két hopra lévő egyik node-nak küldje! A Ping csomagok és a rájuk válaszul jövő Pong csomagok kezelésére fel van készítve a szimulátor. A feladat, hogy a megfelelő helyen indítsuk el a folyamatot! Figyelje meg a hálózat viselkedését! 5. Rádiós link kiesésének szimulációja Implementálja egyetlen rádiós link kiesését a 2. feladatban kialakított hálózati topológián! A hibás link legyen a Ping-et küldő csomópontok között között, és csak a discover fázis lejárta után hibásodjon meg! Csomagvesztés és CRC hiba ne legyen! Figyelje meg a hálózat működését és részletesen mutassa be mi történt, kitérve a routing táblák alakulására is! Miben különbözött a 4. feladatban tapasztaltakhoz képest?
Ellenőrző kérdések 1.
Mit kell implementálnia a fejlesztőnek OMNeT++ környezetben?
2.
Hogyan épül fel a modul hierarchia? Hogyan lehet a paramétereknek értéket adni?
3.
Soroljon fel három alakalmazási területet a szenzorhálózatokra!
4.
Milyen kihívásokra kell megoldást taláni szenzorhálózatok esetén?
5.
Milyen részegyságekből épülnek fel a szenzorhálózati csomópontok?
Irodalomjegyzék Mérési útmutató a Mobil Távközlési és Informatikai Laboratórium méréseihez, OMNET++ bevezető mérés, Schulcz Róbert, 2005. TDK dolgozat: “Vezetéknélküli smart metering rendszer kidolgozása” Milánkovich Ákos, Ill Gergely, Varga Norbert, 2011.