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. Az események értelmezése a következő: Ábra 3.: Szimulációs futtatása
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.