Broadcast alkalmazás készítése



Hasonló dokumentumok
Mote-mote rádiós kommunikáció

Hımérı alkalmazás készítése

Beágyazott információs rendszerek 4. házi feladat

operációs rendszer A TinyOS - Bevezető - [ Beágyazott Információs Rendszerek Tervezése ]

3. Osztályok II. Programozás II

A TinyOS. operációs rendszer. (bevezető) Beágyazott Információs Rendszerek.

ENG Systems Hungary Kft tel/fax: ENG. ENG PrRP Editor. Presenter Control Remote Pack program editor.

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Beágyazott rendszerek fejlesztése laboratórium DSP fejlesztési technológiák

Verzió: 1.7 Dátum: Elektronikus archiválási útmutató

QuickSend. , és SMS küldés program. Felhasználói kézikönyv. Program dokumentáció 2008 JMGM Magyarország Informatikai Kft.

WilarmRead program Használati Útmutató

CAN alapú járműves adatokat megjelenítő szoftver fejlesztése

LCD kezelési útmutató 4.1 verzióhoz

Felhasználói kézikönyv

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Mobil Informatikai Rendszerek

InFo-Tech emelt díjas SMS szolgáltatás. kommunikációs protokollja. Ver.: 2.1

BME MOGI Gépészeti informatika 4.

Programozás C++ -ban 2007/7

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Ellenőrző mérés mintafeladatok Mérés laboratórium 1., 2011 őszi félév

Szoftvertechnolo gia gyakorlat

Adatszerkezetek I. 1. előadás

Occam 1. Készítette: Szabó Éva

Online adatszolgáltatás beállítása a Számlázás - vevő-szállító nyilvántartás programban (UJVSZ)

Tanúsítványkérelem készítése, tanúsítvány telepítése Microsoft Internet Information szerveren

Programozás Minta programterv a 1. házi feladathoz 1.

Szerelési és kezelési útmutató

Felhasználói kézikönyv

DCOM Áttekintés. Miskolci Egyetem Általános Informatikai Tanszék. Ficsor Lajos DCOM /1

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

1. Origin telepítése. A telepítő első képernyőjén kattintson a Next gombra:

Számítógép labor V. Egyszer Web szerver. Dokumentáció. Készítette: Ács Gergely (K4C03M)

Online adatszolgáltatás beállítása a Kettős könyvelés programban (WUJEGYKE) 79/

Számítógépes Hálózatok. 5. gyakorlat

Szabóné Nacsa Rozália. Feladat. Készítsünk el egy üres FormView alapú alkalmazást és építsünk köré egy súgó környezetet.

Online adatszolgáltatás beállítása a kettős, egyszeres könyvelés programban és a számlázóprogramban (UJEGYKE, UJEGYSZ, UJVSZ)

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Programozás II. ATM példa Dr. Iványi Péter

Kommunikáció. Távoli eljáráshívás. RPC kommunikáció menete DCE RPC (1) RPC - paraméterátadás. 3. előadás Protokollok. 2. rész

Dr. Schuster György október 14.

A vezérlő alkalmas 1x16, 2x16, 2x20, 4x20 karakteres kijelzők meghajtására. Az 1. ábrán látható a modul bekötése.

felhasználói kézikönyv HU - magyar

1.2. NFS kliens telepítése és beállítása

9. MPI

III. Felzárkóztató mérés SZÉCHENYI ISTVÁN EGYETEM GYŐR TÁVKÖZLÉSI TANSZÉK

Hálózati adminisztráció Linux (Ubuntu 9.04) 9. gyakorlat

BME MOGI Gépészeti informatika 6.

"Eseményekre imm/connection Server scriptek futtatása

Adat mentés. A program segítség file-ok, mappák mentésében. Mentési csomagokat állíthatunk össze.

Kommunikáció. 3. előadás

8. gyakorlat Pointerek, dinamikus memóriakezelés

Mintafeladat megoldása MS Office Project 2007 szoftverrel

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

Számítógépes hálózatok

FESTO PLC és IMO kijelzı egység összekötése

Programozás alapjai. 10. előadás

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

OOP: Java 8.Gy: Abstract osztályok, interfészek

Bevezetés, a C++ osztályok. Pere László

Egy PIC-BASIC program fordítása, betöltése

GoWebeye Monitor Release Üzenetküldés

Hálózati architektúrák és Protokollok PTI 6. Kocsis Gergely

Programozás C és C++ -ban

Java programozási nyelv 5. rész Osztályok III.

Programozási nyelvek Java

Programozás II. 2. Dr. Iványi Péter

Cekla. Készítette Doxygen Tue Sep :13:44

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 6.ELŐADÁS. Fájlkezelés PHP-ben

Szkriptnyelvek. 1. UNIX shell

Java Programozás 1. Gy: Java alapok. Ismétlés ++

A beállításokat a készülék menüjében találja. A menübe a képernyı job also sarkában lévı Menü

KFKI Unified Messaging Server (UMS) Felhasználói Útmutató

Tájékoztató. Használható segédeszköz: -

Java II. I A Java programozási nyelv alapelemei

Internet Bank használati útmutató

Programozás C++ -ban

RPC Remote Procedure Call Távoli eljárás hívás

LETÉTKEZELŐ NYILVÁNTARTÁSI RENDSZER

A B C NXT A B C. Szolga 1. Szolga 3. NXT. Szolga 2.

Az adatszolgáltatási rendszer kliens felülete

ÁVF oktatási és közösségi portál

Megoldás. Feladat 1. Statikus teszt Specifikáció felülvizsgálat

7. fejezet: Mutatók és tömbök

Bevezetés a programozásba I.

Irányítástechnika Elıadás. PLC rendszerek konfigurálása

Szülői modul. Belépés a TANINFORM rendszerbe. Főoldal

Ütemezett küldés fogyasztásmérő óra állásról inels-bus rendszerben

TANSZÉKI ADMINISZTRÁTORI SEGÉDLET: NEPTUN TÁRGYKEZELÉS, KURZUSKEZELÉS

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Számítástechnika nyugdíjasoknak Február 16.

GenerikusOsztály<objektumtípus> objektum = new GenerikusOsztály<objektumtípus>();

HASZNÁLATI ÚTMUTATÓ. GPS* SOLAR óra. A világ mind a 39 időzónáját felismeri.

A Component-Base Architechture for Power-Efficient Media Access Control in Wireless Sensor Networks

A Számítógépek felépítése, mőködési módjai

Mikroprocesszor CPU. C Central Központi. P Processing Számító. U Unit Egység

Kiszolgálók üzemeltetése. Iványi Péter

Átírás:

Broadcast alkalmazás készítése Feladatunk egy olyan alkalmazás készítése, amely a TelosB mote bekapcsolásakor broadcast-olva elküldi a mote saját belsı azonosítóját (jelen alkalmazás esetén ez a TOS_NODE_ID), majd várja a szomszédos mote-ok által elküldött csomagok megérkezését. Ha megérkezik egy csomag, akkor az alkalmazás megvizsgálja, a csomagban lévı azonosítót. Ha ez az érték megegyezik a mote saját belsı azonosítójával, akkor ezzel az értékkel felülírja azt és broadcast-olva továbbküldi a csomagot. Ha a két érték azonos, akkor a csomag eldobásra kerül. A belsı változó aktuális értékét a mote-on található led-ek segítségével jelenítjük meg. A feladat elkészítésének lépései: 1.lépés: Hozzunk létre egy teljesen üres mappát, és nevezzük el Broadcast-nak. Ebbe a mappába hozzunk létre egy BroadcastC.nc file-t. Ez a file fogja tartalmazni az alkalmazásunk konfigurációját. A konfiguráció tartalmazza azokat a komponenseket, illetve az összekapcsolásukat, melyek az alkalmazásunkhoz szükségesek. A BroadcastC.nc file-ba írjuk be az alábbi kódot: configuration BroadcastC{ implementation { components MainC; components LedsC; components new AMSenderC(0x1); components new AMReceiverC(0x1); components ActiveMessageC; components BroadcastP; BroadcastP.Boot->MainC; BroadcastP.Leds->LedsC; BroadcastP.AMSend->AMSenderC; BroadcastP.Receive->AMReceiverC; BroadcastP.SplitControl->ActiveMessageC; A MainC komponens biztosítja a Boot interface-t, a LedsC komponens biztosítja a Leds interface-t, az AMSenderC generikus komponens biztosítja az AMSend interface-t, az AMReceiverC generikus komponens biztosítja a Receive interface-t, míg az ActiveMessageC komponens biztosítja a SplitControl interface-t. A BroadcastP az általunk készített alkalmazást tartalmazza. A konfigurációs file-ban, a felhasználni kívánt komponenseken kívül, még meg kell adni az egyes komponensek össze huzalozását is, tehát azt, hogy a BroadcastP komponens által felhasznált interface-eket, mely komponensek biztosítják. 2. lépés: Készítsük el a BroadcastP komponenst is, melyre az elıbbiekben tárgyalt BroadcastC komponensben már hivatkoztunk is. Hozzuk létre a BroadcastP.nc file-t, mely majd az alkalmazásunkat (BroadcastP) fogja tartalmazni. A BroadcastP.nc file-ba írjuk be az alábbi kódot:

module BroadcastP{ uses interface Boot; uses interface Leds; uses interface AMSend; uses interface Receive; uses interface SplitControl; implementation{ event void Boot.booted(){ event void SplitControl.startDone(error_t error){ event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len){ event void SplitControl.stopDone(error_t error){ Látható, hogy a BroadcastP komponens használja a Boot, Leds, AMSend, Receive, SplitControl interface-eket, melyeket a BroadcastC.nc file-ban össze is kötöttünk az ıket biztosító komponensekkel. A felhasznált interface-ek a (TOSROOT)/tos/interfaces mappában találhatóak. Ha az itt található interface-eket megnézzük, akkor láthatjuk, hogy az interface-ek különbözı event-eket, illetve command-okat tartalmaznak. Annak érdekében, hogy le tudjuk fordítani a kódunkat, a felhasznált interface-ek által biztosított összes event-et deklarálnunk kell. A Boot interface a void booted() event-et tartalmazza, mely azt jelzi, hogy a rendszer elindult. Az AMSend interface a void senddone(message_t* msg, error_t error) event-et tartalmazza, mely azt jelzi, hogy az üzenetet elküldésre került. Az elsı paraméter az elküldött üzenetre mutató pointer, míg a második paraméter az üzenet küldésének eredményét adja vissza. A Receive interface a message_t *receive(message_t* msg, void* payload, uint8_t len ) event-et tartalmazza, mely azt jelzi, hogy egy üzenet érkezett. Az elsı paraméter a kapott üzenetre mutató pointer, a második paraméter a kapott üzenet payload területére mutató pointer, míg a harmadik paraméter a payload terület hossza. A SplitControl interface pedig a void startdone(error_t error), illetve a void stopdone(error_t error) event-eket tartalmazza, ahol a paraméter a bekapcsolás, illetve a kikapcsolás eredményét mutatja. 3. lépés: Hozzunk létre egy Makefile file-t, mely az elıbbiekben elkészített alkalmazás fordításához szükséges. A Makefile-nak a következı két sort kell, tartalmazza: COMPONENT=BroadcastC include $(MAKERULES) Az elsı sor megadja a konfigurációs file nevét, mely az alkalmazás komponenst tartalmazza. A második sor, pedig meghívja a TinyOS build rendszerét, mely segítségével lefordítható az alkalmazásunk.

make telosb 4. lépés: Fordítsuk le az alkalmazásunkat, az alábbi parancs segítségével: 5. lépés: Mivel a feladatunk az, hogy a mote bekapcsolásakor elküldjünk broadcastolva egy üzenetet, mely a saját belsı változónk értékét tartalmazza, ezért a void Boot.booted() event-ben kapcsoljuk be a rádiót, és deklaráljuk a belsı változónkat (actualnumber) az alábbi módon: uint16_t actualnumber; event void Boot.booted(){ call SplitControl.start(); 6. lépés: A rádió bekapcsolását a void startdone(error_t error) event jelzi. Ha a rádió bekapcsolódott, akkor definiáljuk a belsı azonosítónkat (legyen az értéke a TOS_NODE_ID), másoljuk bele az elküldendı üzenetbe, majd küldjük el az üzenetet az alábbi módon: message_t datamsg; bool busy=false; event void SplitControl.startDone(error_t error){ nx_uint16_t *payload; actualnumber=tos_node_id; call Leds.set(actualNumber); payload=(nx_uint16_t*)call AMSend.getPayload(&dataMsg,2); *payload=actualnumber; if(call AMSend.send(AM_BROADCAST_ADDR,&dataMsg,2)==SUCCESS){ busy=true; Az actualnumber belsı azonosító aktuális értékét a Leds.set() parancs segítségével tudjuk megjeleníteni a led-eken. Ha az üzenetküldés elkezdıdik, azaz az AMSend.send() parancs SUCCESS-el tér vissza, akkor ezt egy busy flag beállításával jelezzük. 7. lépés: Módosítsuk az AMSend.sendDone() event-et úgy, hogyha megtörtént a csomag elküldése, akkor a busy flag-et állítsa FALSE-ra az alábbi módon: busy=false; 8. lépés: Fordítsuk le az alkalmazásunkat és programozzuk fel a mote-ra, az alábbi módon: make telosb install,4 Ha az alkalmazást sikeresen felprogramoztuk, akkor a led-eken a 4-es számnak megfelelı bináris minta fog megjelenni 9. lépés: A feladatnak megfelelıen a szomszédos mote-ok felıl érkezı csomagokat is fogadnunk kell, és megnézni a megérkezett csomag tartalmát. Ha a csomagban lévı azonosító nem egyenlı a saját belsı azonosítónkkal, akkor az új értéknek megfelelıen módosítjuk a belsı azonosítónk értéket, és broadcast-olva továbbküldjük a csomagot. Ha a két azonosító

megegyezik, akkor az üzenetet eldobjuk. Az aktuális azonosító értékét szintén jelenítsük meg a led-eken. A feladat elvégzéséhez az alábbi módon kell kiegészíteni a Receive.receive() event-et: message_t *freemsg; event message_t* Receive.receive(message_t* msg, void* payload, uint8_t len){ if(busy) if(*(nx_uint16_t*)payload==actualnumber) if(call AMSend.send(AM_BROADCAST_ADDR,msg,len)!=SUCCESS) busy=true; actualnumber=*(nx_uint16_t*)payload; call Leds.set(actualNumber); return freemsg; Elsıként megvizsgáljuk, hogy éppen nem küldünk-e csomagot, azaz megvizsgáljuk hogy a busy flag TRUE-e. Ha igen, akkor a csomagot eldobjuk, és a lefoglalt message_t struktúrát visszaadjuk a rádió stack-nek, annak érdekében, hogy újra fel tudja használni azt az érkezı csomagok fogadásához. Következı lépésben megvizsgáljuk, hogy a csomagban lévı azonosító egyezik-e a saját belsı azonosítónkkal, ha igen, akkor szintén eldobjuk a csomagot és visszaadjuk a message_t struktúrát. Harmadik lépésben, pedig meghívjuk az AMSend.send() command-ot, mely segítségével a beérkezett üzenetet broadcast-olva továbbküldjük. Ha ez a command nem SUCCESS-el tér vissza, azaz az üzenet elküldése sikertelen, akkor szintén visszaadjuk a message_t struktúrát a rádió stack-nek, hisz tovább már nincs rá szükségünk. Ha viszont az AMSend.send() command SUCCESS-el tér vissza, ami azt jelenti, hogy elkezdıdött a rádiós adatküldés, akkor a busy flag-et TRUE-ra állítjuk, és mivel a saját belsı azonosítónk nem egyezik meg a kapott azonosítóval, ezért ezt az új értéknek megfelelıen módosítjuk, és az aktuális értékét megjelenítjük a led-eken a Leds.set() parancs segítségével. Mivel a beérkezı üzenetet tartalmazó message_t struktúrát átadtuk a rádió stack-nek elküldésre, ezért nem adhatjuk vissza, hogy az újonnan érkezı üzeneteket ebbe rakja a radio stack, ezért egy üres message_t struktúrát fogunk visszaadni, melyet az alábbi módon inicializálunk. busy=false; freemsg=msg; A freemsg-t egyenlıvé tesszük az AMSend.sendDone() event által visszaadott message_t struktúrával, mely az elsı adatküldéskor a datamsg. A további adat küldésekkor, pedig a továbbküldésre lefoglalt message_t struktúrákra fog mutatni a freemsg. 10. lépés: Fordítsuk le az alkalmazásunkat, és töltsük fel a mote-okra. Helyes mőködés esetén mindig az utolsóként bekapcsolt mote belsı azonosítóját veszi fel a többi mote, és jeleníti meg bináris formában a led-eken.

Az elkészített alkalmazásunk azonban magában hordozza a hiba lehetıségét, és végtelen ciklusban folyó, ping-pong jelenség alakulhat ki. Vizsgáljuk meg az alábbi eseménysorozatot: 1-es mote elküldi az 1-es értéket 2-es mote elküldi a 2-es értéket 1-es mote-nál senddone() event generálódik 2-es mote-nál senddone() event generálódik 2-es mote megkapja az 1-es értéket az 1-es mote-tól és felülírja a saját belsı változóját 1-es mote megkapja a 2-es értéket a 2-es mote-tól és felülírja a saját belsı változóját 2-es mote elküldi az 1-es értéket 1-es mote elküldi a 2-es értéket mivel az üzenetváltás végén a két mote-nak különbözı belsı változó értékei vannak az egész folyamat kezdıdik elıröl. Látható, hogy az üzenetküldés sohasem fog megállni, mert a két mote-on a belsı változó értéke mindig különbözı lesz. A Receive.receive() event-ben ha a busy flag TRUE, akkor eldobjuk az üzenetet. Be lehetne vezetni egy plusz állapotot, melyben jelzzük, hogy a küldés alatt egy új üzenet érkezett, azonban ez sem oldja meg tökéletesen a problémát. Nézzük meg a következı eseménysort: 1-es mote elküldi az 1-es értéket 2-es mote elküldi a 2-es értéket 2-es mote megkapja az 1-es értéket az 1-es mote-tól 1-es mote megkapja a 2-es értéket a 2-es mote-tól 1-es mote-nál meghívódik a senddone() event 1-es mote elküldi a 2-es értéket 2-es mote-nál meghívódik a senddone() event 2-es mote elküldi az 1-es értéket kezdıdik az egész folyamat elıröl A probléma kiküszöbölésére definiálnak egy kitüntetett mote-ot, amely bizonyos idıközönként küld egy broadcast üzenetet, melyben megadnak egy sorszámot, amelyet ez a mote növel minden broadcast üzenetküldéskor. A többi mote pedig csak akkor küldi tovább broadcast-olva ezt az üzenetet, ha a sorszám nagyobb, mint az elızıleg elküldött csomagban lévı sorszám. A nagyobb eldöntés is problémákba ütközhet, hisz akármilyen nagy bitszélességő változót használunk elıbb, vagy utóbb túlcsordulhat. Ezért az alábbi módon dönthetjük el két értékrıl, hogy melyik a nagyobb: uint8_t(a-b) Ha ez az érték nagyobb, mint 0 akkor az a nagyobb, mint a b.