Eötvös Loránd Tudományegyetem Informatikai Kar Programozáselmélet és Szoftvertechnológia Tanszék
Mobil feljegyző és nyomkövető rendszer
Giachetta Roberto
Fung Alexandra
egyetemi tanársegéd,
programtervező infomatikus BSc
programtervező matematikus
Budapest, 2011
A
projekt
az
Európai
Unió
támogatásával,
az
Európai
Szociális
Alap
társfinanszírozásával valósul meg (a támogatás száma TÁMOP 4.2.1./B-09/1/KMR2010-0003).
Tartalomjegyzék 1.
Bevezetés ................................................................................................................. 3
2.
Technológiai háttér .................................................................................................. 5 2.1
Hálózati kommunikáció ..................................................................................... 5
2.2
Microsoft Silverlight .......................................................................................... 6
2.3
Bing Maps .......................................................................................................... 7
2.4
Adatbázis háttér .................................................................................................. 8
2.4.1
Az adatbázis modellek ................................................................................ 9
2.4.2
A relációs adatbázis modell ........................................................................ 9
2.5 3.
Felhasználói dokumentáció ................................................................................... 12 3.1
4.
Windows Mobile SDK ..................................................................................... 11
Előfeltételek és a rendszer telepítése................................................................ 12
3.1.1
A adatbázis-szerver telepítése:.................................................................. 12
3.1.2
Silverlight 4.0 telepítése: .......................................................................... 12
3.1.3
A rendszer telepítése ................................................................................. 13
3.2
A program működése az adminisztrátor szemszögéből ................................... 13
3.3
A program működése a kliens szemszögéből .................................................. 16
3.3.1
Csatlakozás GUI-s alkalmazás által .......................................................... 17
3.3.2
Csatlakozás mobilkészülék által ............................................................... 19
Fejlesztői dokumentáció ........................................................................................ 22 4.1
A megvalósítás folyamata ................................................................................ 22
4.1.1
Mérföldkövek............................................................................................ 22
4.1.2
Visual Studio 2010 és a Silverlight 4.0..................................................... 23
4.1.3
Silverlight és a Bing Maps ........................................................................ 23
4.1.4
Visual Studio 2008 és a Windows Mobile SDK 6.................................... 23
4.2
Felhasználói esetek........................................................................................... 24
4.2.1
Felhasználói esetek az adminisztrátor szemszögéből ............................... 24
4.2.2
Felhasználói esetek a mobilos felhasználó szemszögéből ........................ 26
4.2.3
Felhasználói esetek a számítógépes felhasználó szemszögéből ............... 27
4.3
5.
A rendszer felépítése ........................................................................................ 28
4.3.1
A Server komponens ................................................................................. 29
4.3.2
A WebClient komponens .......................................................................... 32
4.3.3
A MobilClient komponens........................................................................ 35
4.3.4
A DesktopClient komponens .................................................................... 38
4.3.5
A Shared komponens ................................................................................ 41
4.4
Az adatbázis felépítése ..................................................................................... 42
4.5
Implementációs megoldások ............................................................................ 44
4.6
Tesztelés ........................................................................................................... 44
Összefoglalás ......................................................................................................... 47
1.
Bevezetés Napjainkban az üzleti élet egyik legmeghatározóbb tényezője az információ. Az a
vállalkozás juthat előbbre a piaci versenyben, amelyik előbb birtokolja a számára szükséges újabbnál újabb információt. Ehhez nyújt nagyon hatékony segítséget a mobilkészülékek használata, melyek által az információ terjedésének folyamata lényegesen felgyorsul. A 21. században a mobiltelefon a leggyakrabban használt eszközeink közé tartozik. Ez főleg annak köszönhető, hogy a készülékek folyamatosan fejlődnek, egyre több funkciót hordoznak magukban. Egy nagyon fontos tulajdonság, amire egyre több ilyen készülék képes, a nyomonkövethetőség GPS vevőn keresztül. Óriási előnye, hogy ezen földrajzi adatokat feldolgozva szolgáltatások tucatjait élvezhetjük, fejleszthetjük növelve ezzel biztonságunkat és kényelmünket. Az üzleti világban is nagyon sokszor szükség van a műholdas helymeghatározásra, kliensek által készített feljegyzések eltárolására, azok megtekintésére, küldésére. Alkalmazásom fejlesztése során a fenti igények minél teljeskörűbb kiszolgálása volt a cél. Szakdolgozatom egy Windows Mobile telefonokra fejlesztett feljegyző és nyomkövető rendszer, amely alappillére egy, az ELTE keretein belül működő térinformatikai projektnek (AEGIS). Egy ilyen program vázát a hálózati kommunikáció alkotja, ami jelen esetben egy kliens-szerver kapcsolat kiépítése. A kliens egy GPS vevővel ellátott mobilkészülék, amely képes megfelelő azonosítás után üzeneteket küldeni és fogadni, a neki küldött bejegyzéseket visszanézni, valamint ezen adatok térképes reprezentációját is a felhasználó rendelkezésére bocsátja. Fejlesztésre került egy személyi számítógépen futtatható változata is. Mindkét alkalmazás .NET rendszerben készült. A szerver rendelkezik egy dedikált webes felülettel, ami az egyre jobban elterjedő Silverlight technológia alkalmazásával készült. Ide be tud jelentkezni az adminsztrátor, aki teljes hozzáféréssel rendelkezik a felhasználók adataihoz, valamint az összes regisztrált felhasználónak is lehetősége van ezen az oldalon belépni a rendszerbe, de az adatokhoz csak korlátozott hozzáférést kapnak. A felületen keresztül üzenetek továbbíthatók, nyomonkövethető a kliensek aktuális földrajzi elhelyezkedése, a 3
kapcsolat létrehozása óta küldött GPS adatok alapján az útvonaluk, valamint a regisztráció óta bejárt teljes útvonaluk is egy Bing Maps alapú térképen. A rendszerben történt tevékenységek mind naplózásra kerülnek, amelynek bejegyzései szintén megtekinthetők a webes interfészen. A szerveralkalmazás .NET keretrendszerre épül, az adatok kezeléséhez megfelelő adatbázis-hátteret biztosít a MySQL adatbázis-szerver használatával. Külön tárolja a szerver, illetve a kliensek üzeneteit, valamint a felhasználók adatait és a naplóbejegyéseket is. A fejlesztés során külön hangsúlyt fektettem a könnyű kezelhetőségre, valamint a felhasználóbarát megjelenítés kialakítására, ugyanis ezek a tényezők elengedhetetlenek ahhoz, hogy egy program piacképes legyen.
4
Technológiai háttér
2.
Ebben a fejezetben a fejlesztés során felhasznált technológiák kerülnek ismertetésre. Így, az egész rendszer alapját képező hálózaton történő kommunikációról, a Silverlightról, és a Bing Maps-ről esik szó általánosságban. Továbbá az adatok tárolását, kezelését biztosító adatbázisháttér, azon belül az adatbázis modellek kerülnek tárgyalásra. Végül betekintést nyújt a Window Mobile SDK-ba is a mobilkészülékre történő fejlesztéssel kapcsolatban.
2.1
Hálózati kommunikáció
Nagyobb fejlesztések esetében elengedhetetlen, hogy az egyes programok kommunikáljanak egymással. Ilyen szempontból ezek az alkalmazások betölthetik a kliens vagy a szerver szerepét. Előbbi kéréseket küld a szerver felé, ami fogadja őket és válaszol rájuk. A kiszolgáló egyszerre több féltől is tud fogadni üzeneteket. Ehhez szükséges egyfajta azonosítás a hálózatokon, erre szolgál az IP (Internet Protocol, v4, vagy v6) cím, vagy a DNS (Domain Name Service) név. A kliens-szerver kapcsolat interneten keresztül történő létrejöttének két lehetséges módja van. Az egyik a TCP (Transfer Control Protocol), amely lehetővé teszi két állomás között a kapcsolat létrejöttét illetve adatok cseréjét úgy, hogy azok a küldés sorrendjében érkeznek meg. Kapcsolat-orientált, ami azt jelenti, hogy a kommunikáció csak kölcsönös elfogadás után jön létre, azaz adattovábbítás csak a kapcsolat tényleges létrejötte után történhet. A másik technika kevésbé biztonságos, megbízhatatlan, mivel a két végpont nem tud egymásról, kéréseket bármikor küldhetünk rajta függetlenül a kapcsolat létrejöttétől. Ez utóbbit nevezzük UDP (User Datagram Protocol)–nek. A kommunikáció szinkron módon jön létre, ha a küldés illetve a fogadás ideje alatt az alkalmazás blokkolódik egészen a megfelelő válasz megérkezéséig, esetlegesen a kapcsolat megszakadásáig. Aszinkron esetben csak elindítjuk a kérést, majd lefut egy párhuzamos metódus (callback), ha az üzenet célba ért, mialatt a program nem blokkolódik (1. ábra). Ebben a technikában hasonlóságokat fedezhetünk fel az eseménykezeléshez képest. 5
1. ábra: Az aszinkron hálózati kommunikáció
2.2
Microsoft Silverlight
A Microsoft Silverlight korunk viszonylag új technológiája, amely lehetőséget biztosít a programozók számára, hogy feltűnően gazdag felületű web-alapú oldalakat és alkalmazásokat hozzanak létre bármely böngészőhöz. Segítségével webes üzleti alkalmazásokat fejleszthetünk, valamint olyan programok médiaplatformja, ahol a felhasználó szórakoztatása, elkápráztatása a cél. A Microsoft szándéka, hogy a felhasználók maguk töltsék le a szoftvert az általa elérhető tartalmak miatt, ugyanis az eredeti terv szerint gazdag internetes alkalmazások (Rich Internet Application, RIA) fejlesztéséhez találta ki a keretrendszert. Jelenleg a 4es verziónál tart. Képes különböző böngészőkben működni, de akár ettől függetlenül is futtatható. Olyan alkalmazásokat valósíthatunk meg segítségével, amelyekre HTML-ben nincs lehetőségünk. Jelen állás szerint Windows és Mac OS X operációs rendszereken érhető el ez a technológia. alternatív változata Moonlight néven ismert. A Silverlight alapvetően egy böngésző plug-in (kb. 2 MB), a .NET keretrendszer nagymértékben leszűkített része, amelyet a felhasználónak először fel kell telepítenie, hogy megjeleníthesse az oldalt. Tartalmazza a CLR (Common Language Runtime) nevű futtatható környezetet, mely a .NET keretrendszer része és támogatásával a programok háttérkódja Common Language Interface alapú nyelvvel implementálható, míg a böngészőben felületként egy XAML-t (eXensible Application Markup Language) jelenít meg. A Silverlight 4 struktúrája a 2. ábrán látható.
6
2. ábra: A Silverlight architektúra
Ez a kisméretű szoftver feldolgozza az XAML-t és létrehozza a vizuális megjelenését a böngészőben, ezután a fejlesztők írhatnak eseménykezelőket, elkészíthetik a tartalmat, változtathatják a grafikus felületet. Animációkat, egyedi stílusokat, saját vezérlőket készíthetünk
vele
weboldalunkhoz,
valamit
képes
a
kliens-szerver
közötti
kommunikációra is.
2.3
Bing Maps
A Bing Maps által érhetünk el tetszőleges térképi tartalmat a Google Map-hez hasonlóan, a Microsoft keresőszolgáltatásának a része. Tartalmaz 3 dimenziós megjelenítést, amelynek alapja a Virtual Earth. A Bing Maps alkalmazások kizárólag Silverlight 4 platform alatt készíthetők, amelyekhez a fejlesztők kezében van a teljes Visual Studio infrastruktúra, ami rendkívül nagy előnyt jelent a program megalkotásának gyorsaságában, stabilitásában és a minél nagyobb felhasználói élmény nyújtásában. Az adatokat elérhetjük webszolgáltatáson 7
(SOAP) vagy HTTP-n (REST) keresztül is. Eszközválasztékában találkozhatunk geokódolási,
térkép-
és
légi-felvételekek
szolgáltató
Imagery,
illetve
az
útvonaltervezéshez használható Routes API-kkal. Ezeket webszolgáltatások keresztül tudjuk elérni, mindegyiknek külön címe van. Például a RouteService címe: http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc?wsdl
3. ábra: Bing Maps
A Bing Maps Silverlight SDK (6.3-as SDK) gyakorlatilag egy vezérlőt bocsát a rendelkezésünkre, amelyen további térképi tartalmakat jeleníthetünk meg, amiket rétegekbe (MapLayer) foglalhatunk. Használhatunk különböző térképi elemeket, mint a MapPolygon, MapPolyline, MapPushpin, ezek mind hozzájárulnak a felhasználó benyomásának jó irányba történő tereléséhez (3. ábra).
2.4
Adatbázis háttér
A nyomkövető és már hasonló rendszerek esetében is rendkívül fontos, hogy nagy mennyiségű adatot tudjon feldolgozni, illetve tárolni. Ehhez elengedhetetlen a megfelelő adatbázisrendszer kiépítése. Többféle logikai modell jött létre az adatbáziskezelők fejlődése során, melyek az adatok közötti összefüggések tárolásában különböznek egymástól. A teljesség igénye nélkül ilyenek az alábbiakban említést teszek néhányról.
8
2.4.1 Az adatbázis modellek A teljesség igénye nélkül említést teszek néhány modellről: Hierarchikus adatbázis modell, mint a neve is mutatja, az adatok egy hierarchikus rendezését takarja. A legelső adatbáziskezelők egyike, amelyet például az IBM IMS adatbáziskezelő rendszer használt. Hátránya, hogy az adatokat csak egyféle sorrendben érhetjük el, ami megfelel a egymás alá-fölé rendeltségi viszonynak. Hálós adatbázis modell, ahol az adatok közötti kapcsolat egy gráffal írható le. Minden rekord több más adategységgel lehet kapcsolatban. Csak az előre rögzített kapcsolat alapján történő adat-visszakeresések hatékonyak, de akár jobbak mint más esetben. Hátránya, hogy felépítése merev, módosítása körülményes, ez mondható a feljebb említett modellről is. Relációs adatbázis modell, melyben az adatokat táblázatban tároljuk, ez a legáttekinthetőbb, legelterjedtebb módszer a 80-as évektől, amit a legismertebb adatbázis-kezelők is támogatnak. A legszembetűnőbb különbség az e fentiekhez képest, hogy a kapcsolat nincsenek fixen beépítve a rekordok között, hanem az összefüggések megalkotásához szükséges információkat tároljuk redundánsan. Ennek eredményeképp a felépítés rugalmasabb, a módosítás egyszerűbb. Alább részletesebben is kifejtem ezt a modellt. Objektum-relációs adatbázis modell, ami az előbb említett mód kiterjesztésével alakult ki. A táblákra olyan fogalmakat képez le, mint az objektum orientált szemléletben használt osztály, objektum, öröklődés, valamint saját adattípusokat és függvényeket is készíthetünk. Napjainkban a Windows és Unix operációs rendszerekben használt adatbáziskezelők a relációs modellen alapulnak. Emiatt, és mert a szakdolgozatomban én is ezt használom, apróbb részletekbe bocsátkozom ezen módszert illetően. 2.4.2 A relációs adatbázis modell Reláción az adatok egy kétdimenzós táblában történő reprezentációját értjük és egyedi megnevezéssel látjuk el őket. A relációs adatbázis ilyen relációk egy véges 9
halmaza, melyeket létrehozhatjuk, módosíthatjuk, illetve törölhetjük adatbázis-kezelők segítségével. A táblázatok rekordjai egyediek, mivel halmazként kezeljük őket, de ehhez képest az adatbázis-kezelőkben megengedünk ismétlődéseket, tehát inkább zsákként tekintünk rájuk. Ezekben tároljuk a logailag összetartozó adatokat. Két relációnak nem lehet azonos attribútuma, valamint ezeket is saját névvel látjuk el. Lehetőségünk van üres értékeket is használni (NULL). Egy oszlop és sor találkozásánál található elemet mezőnek nevezünk, amik tartalmazzák az adatokat. A relációkkal szemben támasztott követelmény általában az, hogy ne tároljanak olyan információkat, amelyek máshonnan kiszámolhatóak. Kulcsnak nevezzük az attribútumok egy részét, ha az adott tábla rekordjaiban nincs két egyforma, amelyek a kulcs összes oszlopának értékein megegyeznének. Több relációt ezen kulcsok mentén tudunk összefüggésbe hozni (4. ábra). [1]
4. ábra: Egy relációs adatbázis modell
10
Néhány ismertebb relációs adatbázis-kezelő, amelyet a piacon kaphatók például az Oracle, az MS SQL Server, illetve az IBM DB2, valamint a nyílt forráskódú szoftverek között a MySQL, a PostgreSQL és a SQLite.
2.5
Windows Mobile SDK
A Microsoft lehetőséget biztosít a fejlesztők számára, hogy mobiltelefonokra is alkothassanak
egyre
gazdagabb
látványvilágú
alkalmazásokat.
Ez
az
SDK
tulajdonképpen egy emulátort ad a programozók kezébe, hogy ne kelljen a fejlesztés közben a telefonon tesztelni, mert az lényegesen lassítaná a munkafolyamatot. A Microsoft Device Emulator támogatja az ActiveSync-en keresztül történő szinkronizációt, valamit ezáltal tudjuk a programunkat tesztelni és futtatni. [2] Hálózaton történő kommunikációhoz szükség lesz a Virtual PC 2007-re is, ami több virtuális gépet is tud egyidőben futtatni, amik egymástól teljesen függetlenül működnek, persze mindezt a rendszererőforrások függvényében. [3] A professzionális emulátorok nagy általánosságban alkalmasak a készülék képességeinek figyelembevételével a memória felhasználás és a hálózati terhelés tesztelésére, ezáltal nagy segítségére van egy programozónak.
11
3.
Felhasználói dokumentáció
3.1
Előfeltételek és a rendszer telepítése
Mind a kliens, mind a szerver oldali alkalmazás hibamentes működéséhez elengedhetetlenek az alábbi hardveres és szoftveres rendszerkövetelmények: Microsoft Windows XP vagy ennél később operációs rendszer, 1 Ghz processzor, 1 GB memória. A szerver alkalmáshoz még szükséges Windows Internet Explorer vagy Mozilla Firefox webböngésző. Rendszerkövetelmények a mobilkészülékre: Microsoft Windows Mobile 6.0 operációs rendszer (vagy újabb), 8 GB szabad tárhely. 3.1.1 A adatbázis-szerver telepítése: Mivel a program csak megfelelő adatbázisháttérrel képes működni telepítenünk kell azt. Első ízben töltsük le a MySQL Connector ODBC–t, a MySQL honlapjáról. [4] Ha ez sikerült, indítsuk el a telepítést, majd ennek végeztével elkezdhetjük feltenni a szervert is. Ez is megtalálható az előbb említett oldalon, válasszuk a saját platformunknak és rendszerünknek megfelelő msi fájlt, szintén töltsük le és telepítsük fel. [5] Ha eredményesen felépítettük az adatbázis-szerverünket jöhet a következő lépés. 3.1.2 Silverlight 4.0 telepítése: A Silverlight 4.0 plug-in elérhető a Microsoft hivatalos weboldalán az alábbi linken: http://www.microsoft.com/getsilverlight/Get-Started/Install/Default.aspx. A letöltéskor ügyeljünk arra, hogy saját rendszerünknek megfelelő fájlt mentsünk le, majd futassuk a telepítőt. Ahhoz hogy a szoftver feltelepüljön rendelkeznünk kell rendszergazdai jogosultságokkal.
12
Az oldalon a Microsoft Internet Explorer és a Mozilla Firefox böngészőkhöz találunk hivatalos segítséget az installáláshoz. Utolsó lépésként újra kell indítanunk böngészőnket és máris élvezhetjük a Silverlight által biztosított nagyobb felhasználói élményt. [6] 3.1.3 A rendszer telepítése Alkalmazásunkat telepítését a setup.exe fájl elindításával kezdjük. Ezután varázsló végignavigál minket az installálás különböző lépésein. Ha minden ponton végigjutottunk és engedélyt adtunk a program telepítésére, utolsó lépésként újra kell indítanunk az operációs rendszer. Ha mindez megtörtént a szolgáltatásunk automatikusan elindul, de manuálisan a vezérlőpulton keresztül is elindítható, utóbbi esetben az újraindítás sem szükséges. Mivel a rendszer részét képezi egy mobilkészülékre készült kliensalkalmazás, erre az eszközre is telepíteni kell a megfelelő programot.
3.2
A program működése az adminisztrátor szemszögéből
A rendszergazda telepítés után bármikor leállíthatja, illetve újraindíthatja a rendszert a Vezérlőpult/Felügyeleti eszközök/Szolgáltatások menüpont alatt. A müködéssel kapcsolatos információkról és esetleges hibákról bővebb információt szintén a Felügyeleti eszközök menüpont alatt talál Eseménynapló címszóval az Alkalmazás- és szolgáltatánaplók fülre kattintva. Mindkét esetben a MobileTrackerSystem néven keressük az alkalmazást. Az adminisztrátor egy dedikált webes felületen keresztül tud kapcsolatot létesíteni a kliensekkel, természetesen csak megfelelő authentikáció mellett. A klienseknek is van lehetőségük bejelentkezni erre az oldalra, de csak korlátozott jogosultsággal rendelkeznek az egyes fukciók irányában. Sikeres belépés után a rendszergazda három oldalról tudja nyomonkövetni a felhasználók tevékenységét, amire különböző fülek szolgálnak a felületen. Ezenfelül folyamatosan láthatja, hogy kik a regisztrált felhasználók, valamint ezek közül kik vannak jelenleg csatlakoztatva a rendszerhez.
13
A Messages fül alatt látható az összes kliens üzenete, amely folyamatosan frissül, tehát ha új üzenet érkezik az szinte rögtön látható lesz itt. Ha az éppen online felhasználók egyikét kiválasztjuk, akkor csak az ő feljegyzései lesznek megtekinthetők a felület ezen részén (5. ábra).
5. ábra: Üzenetek megjelenítése
A Map fülre kattintva az admnisztrátor elé tárul egy utcatérkép, melynek középpontjában az ELTE található. Ha előzőleg a kliensek által már küldtek üzeneteket az aktuális pozíciókkal, akkor kiválasztva egy-egy belépett felhasználót, láthatóvá válik a jelenlegi pozíciója. Ezen felül biztosítva van a lehetőség, hogy egy online kliens által küldött üzenetek alapján megtekintsük annak útrányát a Route-ra kattintva (6. ábra). Az All Routes gomb által megismerhetjük az akutális felhasználó eddig bejárt teljes útvonalát. Abban az esetben, ha nincs kiválasztva egy elérhető felhasználó, esetleg még nem küldött feldolgozható GPS koordinátákat, erről az alkalmazás figyelmeztetést fog adni. A rendszergazda nem csak feljegyzéseket fogadhat a felhasználóktól, hanem ő is küldhet nekik különböző utasításokat, üzeneteket. Ehhez nyújt segítséget, hogy a térkép egy adott pontjára kattintva a bal felső sarokban találató üzenetküldésre szolgáló rész Latitude és Longitude mezőjében megjelenik a térképen kiválasztott hely gps koordinátája.
14
6. ábra: Az útvonal megjelenítése
A térkép közelítése tetszőlegesen változtatható mind pozitív, mind negatív irányba, segítve ezzel a jobb tájékozódást. Ezenkívül még egy plussz opció, hogy a megjelenítésnek van még egy módja, amit Aerial-nak neveznek. Ilyenkor műholdas felvételről látjuk ugyanazt a területet, ami korábban Road üzemmódban vizsgáltunk, ez annyit tesz, hogy utcanézet. Mindkét nézet nagyon informatív, mert láthatóak rajta az utcák elnevezései, kórházak, repülőterek, metroállomások és még sok más egyéb intézmény vagy közterület. Az adminisztrátornak figyelnie kell arra, hogy ha nem a térképen történtő kattintással akarja megadni a GPS adatokat, hanem kézzel szeretné beírni a fejlebb említett két mezőbe, akkor csak számot írhat ide. Továbbá a hosszúsági, valamint a szélességi koordinátáknak egy adott intervallumba kell esnie. A Latitude -90 és 90, a Longitude 180 és 180 közötti értéktartományon mozog. Ha a rendszergazda nem ezeknek megfelelő számot, esetleg nem is számot ír be, akkor a program figyelmeztetést fog adni neki, hogy hibásak az adatok. Ezen felül még hibát fog jelezni az alkalmazás, ha ezek az adatok nincsenek kitöltve, mert minden esetben meg kell adni őket. Az üzenet szövegének kitöltése után ki kell választani a címzettet a belépettek közül. Amennyiben a regisztrált felhasználók láthatóak a felületen, a Available Users gombra kattintva megnézhetjük a jelenleg online klienseket, ellenkező esetben a Registered Users-t választva a regisztrált felhasználók kerülnek előtérbe. Ha a bejegyzése szövegének kitöltése és a címzett kiválasztása megtörtént a Send-re kattintva az a 15
feljegyzés
elküldésre
kerül,
amiről
a
visszaigazolás
az
állapotsoron
lesz
visszatekinthető. A harmadik módja annak, hogy az adminsztrátor nyomonkövesse a felhasználók tevékenységét az Eventlog. Itt látható, ha valaki bejelentkezik, üzenetet küldd vagy fogad, illetve a rendszergazda tevékenységét is mutatja, ha feladatot ad az egyes klienseknek (7. ábra). Folyamatosan frissítve van a felület, azaz az újonnan belépett felhasználó tevékenysége is nagyon rövid időn belül láthatóvá válik itt. Ez a funkció van korlátozva, ha a bejelentkezésnél nem az adminisztrátor adatai vannak megadva. Ebben az esetben az Eventlog fül alatt csak a belépett kliens által véghez vitt küldések, illetve fogadások nézhetők meg, mások tevékenysége nem elérhető.
7. ábra: Az eseménynapló bejegyzéseinek megtekintése
3.3
A program működése a kliens szemszögéből
A kliens két módon tud csatlakozni a rendszerhez, egyrészt a számítógép mögött ülve egy egyszerű GUI alapú alkalmazás segítségével, másrészt a GPS vevővel ellátott mobilkészülékéről, akár kocsiban ülve.
16
3.3.1 Csatlakozás GUI-s alkalmazás által A felhasználó a GUI-s alapú alkalmazáson keresztül nevének és jelszavának megadásával, valamint a szerver IP címével tud csatlakozni. Ha az adott kliens még nincs regisztrálva a rendszerben, itt ezt is megteheti. Első lépésként a Connection-ben a Connect to server-re kell rákattintani, aminek eredményeképp felugrik egy kisebb bejelentkező ablak (8. ábra). Itt tudjuk megadni a feljebb említett adatokat, ezenkívül a regisztrációs lehetőség is ebben a lépésben érhető el (9. ábra).
8. ábra: Bejelentkező ablak
9. ábra: Regisztrációs ablak
Sikeres belépés eredményeképp a főoldalon találja magát a kliens, egyébként pedig lehetőség van a bejelentkezés megismétlésére. A főablak bal oldalán láthatja a felhasználó a neki címzett feljegyzéseket, valamint a hozzájuk tartozó GPS koordinátákat, illetve innen tud új bejegyzést küldeni az adminisztrátornak egy pozíció és egy szöveges üzenet fomájában. A jobb oldali részen látható a szimulációs rész, amelyet a Simulation menüpont alól lehet vezérelni. Ezen a fülön belül a Load Data-ra kattintva felugrik egy ablak, ahol a saját fájljaink közül kiválaszhatunk egyet, amit fel szeretnénk dolgozni. Fontos, hogy ennek a fájlnak NMEA0183 mondatokat kell tartalmaznia, különben nem tudjuk feldolgozni az adatokat. [7] Ha a betöltés sikeres volt visszajelzés kapunk róla a felületen. Ezután a Start processing fület kiválasztva a szöveges állományból feldolgozott adatokkal szimulálhatjuk a működést, mintha változna a pozíció. Ilyenkor a
17
jobb oldali részen a beolvasott adatok alapján folyamatosan változnak a Receiver Data és Satellite Data részben látható információk, miközben alatta folyamatosan pörögnek a fájlban található adatok sorai (10. ábra). Ha rendelkezésre áll egy csatlakoztatott GPS vevő, akkor lehetőség van soros porton történő kommunikációra is. A Connection-ben a Port-on belül tudjuk kiválasztani, hogy honnan akarjuk fogadni az adatokat (COM1, COM2). Ezután a Start Reading-re kattintva elindul a koordináták fogadása a GPS vevőtől, melyek láthatóak a főablak jobb oldalán. Így amennyiben van GPS jel, tényleges adatok kaphatóak.
10. ábra: A felhasználói felület
Még egy menüpont található a felhasználói felületen, ez a View amin belül találunk egy Map fület. Ezt kiválasztva egy új ablakot kapunk, amelyben a szimuláció során a fájlból olvasott koordináták, vagy a soros porton fogadott adatok közül az éppen aktuális van megjelenítve egy böngésző ablak Google Maps alapú térképén (11. ábra). Mielőtt meg akarjuk nézni a pozíciót előbb szüneteltessük a szimulációt, jelenítsük meg a térképet, ezután újra folytathatjuk a szimulálást.
18
11. ábra: Google Map Location
3.3.2 Csatlakozás mobilkészülék által A kliensek csatlakozás mobilkészülékről hasonlóan működik, mint az előbbi esetben. Ha már fent van a mobilkészüléken a MobileTrackerSystem alkalmazás, akkor indítás után a főablak alján megtalálható a menüválaszték. A Menu-ben a Connect to server opciót kiválasztva egy bejelentkező ablak tűnik fel (12. ábra), amin keresztül kapcsolatot lehet létesíteni a szerverrel, vagy regisztrálni tudja magát a felhasználó a rendszerbe (13. ábra).
12. ábra: Bejelentkező ablak
13. ábra: Regisztrációs ablak 19
Ha az authentikáció sikeresen zárult, akkor a főoldalon találja magát az adott kliens, ellenben fenn áll a lehetőség az újbóli bejelentkezés megpróbálására. A főablak felső részén található az üzenetküldésre szolgáló rész, alul pedig láthatóak a kliens részére küldött feljegyzések az adminisztrátortól (14. ábra). A GUI-s alkalmazással ellentétben itt nem kell megadni a GPS koordinátákat az üzenet küldése során, mert a készülékbe épített GPS vevő automatikusan szolgáltatja ezeket az adatokat, ha a pozíció változik. A kliensnek csak az üzenet szövegét kell megadnia, majd a Send gombra kattinva, már a GPS adatokkal együtt elküldésre kerül a bejegyzés. Amennyiben a továbbítás eredményes volt, visszajelzést kapunk az állapotsoron. Még egy differencia mutatkozik a GUI alapú alkalmazáson és a mobilkészüléken történtő bejelentkezés között. Utóbbi esetben nincs szükség szimulációra, ugyanis a mobiltelefon földrajzi elhelyezkedése ténylegesen változik, ha útközben vagyunk, míg az előbbi alkalmazásnál ez nem áll fenn. Így az opciók száma is kevesebb, tehát csak egy Map menüpontot találunk a főablak jobb alsó részén.
14. ábra: Üzenet küldő/fogadó ablak
Ha kiválasztjuk ezt a lehetőséget, a GUI-s alkalmazáshoz hasonlóan egy új ablak fog megjelenni, amelyben egy bőngésző ablak Google Maps alapú térképmegjelenítője lesz látható (15. ábra).
20
15. ábra: Térképmegjelenítő
A különbség abban mutatkozik, hogy ezen a térképen nem egy fáljból beolvasott, majd feldolgozott adatok egyike van megjelenítve, hanem a mobilkészülék GPS vevője által aktuálisan fogadott koordináták. Ezáltal a kliens is láthatja azt a földrajzi elhelyezkedést, amelyet az üzenetével együtt továbbít az adminisztrátor felé. Ilyen módon ez az alkalmazás nagyon precíz és aktuális adatokat képes továbbítani a rendszer számára, ami ezeket feldolgozva mindig percre, akár másodpercre pontos feljegyzésekkel fog rendelkezni.
21
Fejlesztői dokumentáció
4.
A szakdolgozat célja egy kellően nagy komplexitású probléma gyakorlati megvalósítása tetszőleges programozási környezetben és eszközökkel. A kliens-szerver alkalmazáspár egy olyan sokakat érintő nehézség köré csoportosul, mint a vállalatok alkalmazottjainak nyomonkövetése és ennek térképes reprezentációja, valamint a számukra kiosztott feladatok kezelése. Napjainkban a piacon lévő vállalkozások versenyében rendkívül fontos szempont a minél aktuálisabb, frissebb információ birtoklása és ebben hivatott segítséget nyújtani ez a program. A fejlesztés hátterében különböző eszközök segítették a minél nagyobb felhasználói élmény elérését, amelyek közé tartozik a Silverlight egyre szélesebb körben elterjedő nagyon gazdag webes felülete, valamint a .NET keretrendszer folyamatosan bővülő eszközkínálata. Alkalmazásom működéséhez szükséges rengeteg adat tárolásához és kezeléséhez szükséges adatbázis-hátteret a MySQL adatbázis-szerver szolgáltatja. A korábban vázolt téma teljes egészében megvalósításra került, melynek során fő szempontok voltak az egyszerű kezelhetőség, a felhasználóbarát grafikus felület, illetve a minél nagyobb klienskiszolgálás biztosítása.
4.1
A megvalósítás folyamata
4.1.1 Mérföldkövek A fejlesztési munkát alapvető mérföldkövek övezték, amelyek közül az első és a legfontosabb a tervezés volt. Ezt olyan, az UML nyelv adta lehetőségekkel készült, mint például a szükséges osztályok diagramjai, azok kapcsolata, valamint a felhasználói esetek vázolása. A következő lépést a MySQL szerver valamint a Windows Mobile 6 SDK telepítésének
a
folyamata
jelentette.
Az
emulátor
beüzemelése
nem
volt
problémamentes, de végül sikerült helyes működésre bírni. Utolsó lépés a Silverlight technológia eszközkészletével való megismerkedés volt, amelyhez rengeteg segítséget nyújtott az egyetem keretein belül tartott előadások sorozata. 22
4.1.2 Visual Studio 2010 és a Silverlight 4.0 A Visual Studio 2010 csomagjában alapvetően nem található meg a Silverlight nyújtotta gazdag felhasználói élmény nyújtásához szükséges eszközkészlet. Ehhez telepítenünk kell a Microsoft Silverlight 4 Tools for Visual Studio 2010 névre keresztelt kiegészítőt a cég hivatalos honlapjáról, ezután már indulhat is a fejlesztés. [8] 4.1.3 Silverlight és a Bing Maps A Silverlight 4.0 eszközkészlete alapértelmezetten nem tartalmazza a Bing térképeket. Ahhoz, hogy ezeket fel lehessen használni a fejlesztés során szükséges a Bing Maps Silverlight Control SDK telepítése, amely letölthető a Microsoft honlapjáról. Ha sikeresen telepítésre került az eszköz, akkor a project referenciáihoz hozzá kell adni a
Microsoft.Maps.MapControl
illetve
a
Microsoft.Maps.MapControl.Common
osztálykönyvtárakat, amelyek az SDK-ban megtalálatóak. [9] Ha mindez megvan, akkor még egy összetevőre szükség, ami biztosítja a Bing térképek útvonal szolgáltatását, ez pedig egy szolgáltatás referencia, amit hozzá kell adni a projekt Service Reference-hez. Előbbit úgy tehetjük meg, hogy a Solution Explorerben a Service Reference-n jobb egérgombbal kattinva kiválasztjuk az Add Service Reference opciót, majd itt megadjuk az elérési útvonalat a szolgáltatáshoz. [10] Ha a cím helyes volt, a Go-ra kattinva meg is találja a szükséges szolgáltatást. 4.1.4 Visual Studio 2008 és a Windows Mobile SDK 6 Alapértelmezetten a Visual Studio 2010-ben nem található meg egyik fajta Mobile SDK sem, ezért telepíteni kell. Azonban ennél a lépésnél problémába ütköztem, ugyanis egy olyan hibaüzenet kaptam, hogy mielőtt az említett SDK-t telepíteném szükséges a Visual Studio 2005 vagy ennél újabb változata. Ezzel az volt a probléma, hogy már a 2010-es verziót korábban felraktam a saját rendszeremre. Ezt a nehézséget nem sikerült leküzdeni, ezért a fejlesztésnek ezen részét Visual Studio 2008-ban készítettem el, mert ez a csomag alapból tartalmazza az SDK egy korábbi változatát, amit később frissítettem a 6-osra. A project referenciáihoz hozzá kell adni az SDK-ban megtalálható Microsoft.WindowsMobile programkönyvtárat. [11]
23
A GPS pozíció folyamatos változtatásának szimulálásához szükség van egy további segédprogramra, ez a FakeGPS, ami szintén megtalálható az SDK-ban. Ezután engedélyezni kell a FakeGPS-t a mobilkészüléken és megadni neki egy txt kiterjesztésű fájlt, amelyben NMEA mondatok találhatóak és már mükődőképes is lesz a szimuláció anélkül, hogy használnunk kéne ténylegesen a GPS vevővel ellátott készüléket. Még egy utolsó lépés volt hátra. Ahhoz, hogy a programban fel lehessen dolgozni az emulátor által szolgáltatott GPS koordinátákat, szükség volt az adatokat feldolgozó segédprogramra.
Ez
a
program
elérhető
a
következő
honlapon:
http://gpstracker.codeplex.com/. Ezt hozzáadva a projektem referenciáihoz, már gond nélkül tudta kezelni a GPS koordinátákat. [12]
4.2
Felhasználói esetek
Az alkalmazás felhasználóit két oldalról lehet szemlélni, aki a szerveralkalmazás webes felületén keresztül jelentkezik be, az ún. adminisztrátor, ő tartja a kapcsolatot az összes többi felhasználóval. A másik oldalon vannak azok, akik valamelyik kliensalkalmazáson keresztül felhasználóként jelentkeznek be a rendszerbe. Ezek a kliensalkalmazások vagy mobilkészüléken, vagy hagyományosan egy számítógépen futnak. Ebből a két szemszögből vizsgáljuk a felhasználói eseteket. 4.2.1 Felhasználói esetek az adminisztrátor szemszögéből Ha valaki a szerveralkalmazás webes felületén keresztül jelentkezik be a rendszerbe az alábbi esetek fordulhatnak elő (16. ábra): Regisztrált felhasználók listázása. Elérhető felhasználók listázása. A Messages nézet kiválasztása: Új üzenet küldése egy elérhető felhasználónak a koordináták kézi kitöltésével. A böngészőablak bezárása. A Map nézet kiválasztása:
24
Új üzenet küldése egy elérhető felhasználónak úgy, hogy a koordinátákat
térképen történő kattintással is megadhatja, vagy
beírja. Egy elérhető felhasználó kiválasztásával az aktuális (utoljára küldött) földrajzi elhelyezkedésének megtekintése a térképen. Egy elérhető felhasználó kiválasztásával az aktuális útvonalának megtekintése a térképen. Egy elérhető felhasználó kiválasztásával az eddigi összes útvonalának megtekintése a térképen. A böngészőablak bezárása. uc Primary Use Cases System Boundary
Registered Users New Message Route
Close AllRoute Av ailable Users
Position Administrator Messages New Message
Close
Map Ev ents
Close
Ev entLog New Message
16. ábra: Felhasználói esetek az adminisztrátor szemszögéből
Az Eventlog nézet kiválasztása: Új üzenet küldése egy elérhető felhasználónak a koordináták kézi kitöltésével.
25
Adminisztrátorként történő belépés után az összes eseménynapló bejegyzés listázása. Egyéb felhasználóként történő belépés után csak a saját tevékenységre vonatkozó eseménynapló bejegyzések listázása. A böngészőablak bezárása.
uc MobilClient UseCase
Send Menu
ConnectToServ er
Map
Exit User
ListMessages
Close
17. ábra: Felhasználói esetek a mobilos bejelentkezés esetén
4.2.2 Felhasználói esetek a mobilos felhasználó szemszögéből Ha mobilkészülékre fejlesztett kliensalkamazáson keresztül történt a bejelentkezés, az alábbi felhasználói esetek állhatnak fenn (17. ábra): Menu menüpont kiválasztása. Kapcsolódás a szerverhez (ConnectToServer): Új üzenet küldése (Send) a szöveg megadásával. Fogadott üzenetek listázása. Aktuális pozíció megtekintése a térképen (Map menüpont) Kilépés (Exit). 26
Az alkalmazás bezárása. 4.2.3 Felhasználói esetek a számítógépes felhasználó szemszögéből Amennyiben a bejelentkezés hagyományos módon a számítógépes alkalmazásról történik, az kövekező felhasználói esetek állhatnak fenn (18. ábra): Connection főmenüpont kiválasztása: Kapcsolódás a szerver (ConnectToServer). Kilépés (Exit). Kapcsolódás soros porton (Port): COM1 fül kiválasztása. COM2 fül kiválasztása. Olvasás indítása (Start Reading). uc DesktopClient Use Cases
ConnectToServ er
Connection Exit
Port
Simulation User
Load Data
Start Reading
Start Processing
View Map
18. ábra: Felhasználói esetek számítógépes bejelentkezés esetén
27
Simulation főmenüpont kiválasztása: Fájl betöltése (Load Data). Szimulációs folyamat indítása (Start Processing). View főmenüpont kiválasztása: Aktuális pozíció megtekintése a térképen (Map).
4.3
A rendszer felépítése
A rendszer öt fő komponensből tevődik össze az adatbázison kívül. Az első és egyben a legfontosabb a MobileTracker.Service, ami a kliensek és a szerver közötti kapcsolat fenntartásáért, valamint az adatbázis-kapcsolatért felelős. Egy másik
hasonlóan
fontos
összetevő
a
MobileTracker.WebClient,
ami
tulajdonképpen egy kitüntetett kliensként csatlakozik a szolgáltatáshoz és webes felületen megjeleníti a többi felhasználó üzeneteit, tevékenységét valamint biztosítja a térképi síkon történő reprezentációt. A harmadik komponens egy GUI-s kliensalkalmazás, amelyen keresztül a felhasználók be tudnak jelentkezni egy azonosítást követően a szerverre és képesek üzeneteket küldeni annak vagy új feladatokat fogadni attól. Továbbá egyfajta szimulálásra is képes GPS adatokat tartalmazó fájl beolvasásával, valamint ezeket reprezentálja térképi felületen. A negyedik alkotóelem a mobilos felhasználói program, mely segítségével a GPS vevővel felszerelt mobilkészülékről be lehet lépni a szerverre megfelelő authentikáció mellett. Ezen felül bejegyzéseket továbbíthatnak illetve kaphatnak a szervernek, vagy a szervertől és térképi nézeten képesek a saját pozíciójukat megtekinteni. Fentiek alapján a kihelyezési diagram a 19. ábrán látható. Végül az utolsó rész a Shared modul, amely olyan osztályokat tartalmaz, melyeket több komponens is felhasznál a működése során.
28
19. ábra: A rendszer kihelyezési diagramja
4.3.1 A Server komponens Service csomagjában a szerver működéséhez elengedhetetlen osztálydefiníciók találhatóak. Ezek bonyolítják le a kliens és a szerver közötti kommunikációt, valamint fenntartják a kapcsolatot az adatbázis-szerverrel, mentik, illetve olvassák annak sorait. Itt történik a felhasználók azonosítása a tárolt adatok alapján. Az osztálydiagam a 20. ábrán megtekinthető.
29
A Service valójában egy Windows szolgáltatás, amely az operációs rendszer indítása után elindul. Rendeltetése szerint folyamatosan futnia kell, hogy várja a kliensektől a csatlakozási szándékot, ezért is van úgy megvalósítva, hogy nem kell mindig elindítani, hanem automatikus módon indul a rendszerrel együtt. Tartalmaz egy OnStart és egy OnStop metódust, amelyben előbbi elindít egy PolicyServert és egy Servert is,
utóbbi pedig ezek futását szünteti meg. Ha ezek
megtörténnek rögzítünk rólunk egy-egy bejegyzést a szolgáltatás eseménynaplójába. A Program osztály ennek a Service-nek az elindításáról kezeskedik. A ServiceInstaller osztály a szolgáltatás telepítését teszi lehetővé. Itt adható meg a neve, az indítás módja (automatikus vagy kézi), ezenkívül az eseménynapló elnevezése is itt állítható be. A Server osztály valósítja meg szolgáltatás alapvető működését, azaz folyamatosan figyeli egy külön szálban (WatchConnections), hogy van-e új TCP csatlakozási szándék a kliensek által, ha igen létrehoz egy Client típusú példányt, amely majd a további kommunikációt bonyolítja egy külön csatornán. Ezen felül felügyeli a klienseket szintén külön szálban (WatchServer), ha valamelyik kapcsolata már nem áll fenn a szerverrel, törli a dictionary típusban tárolt Clients-ből. Mindkét fent említett szálat a Start metódusával indítjuk el, amit a Server Run metódusában hívunk meg. A Stop metódusban lényegében leállítjuk a szervert és a vele folytatott összes kommunikációt is. A PolicyServer a Silverlight-os kliens számára engedélyezi a TCP kapcsolaton történő kommunikációt. Mindezt olyan módon, hogy minden a 943-as porton beérkező kérésre elküldi a tcpaccesspolicy.xml fájl tartalmát bytetömbbé konvertálva. Erre azért van szükség, hogy a fájlban megadott porton sikeresen működjön a TCP kapcsolat.
30
class Serv ice ServiceBase Serv er
Serv ice -
_PolicyServer: PolicyServer _Server: Server _ServerLog: EventLog
# # +
OnStart(string[]) : void OnStop() : void Service()
-_Server + + + -
-_PolicyServer PolicyServ er -
_Running: Boolean _ServerLog: EventLog _ServerThread: Thread connectSock: Socket
+ + +
PolicyServer(EventLog) RunPolicyServer() : void Start() : void Stop() : void
_ClientCounter: Int32 _Listener: Socket _RunServer: Boolean _ServerAddressList: List
_ServerLog: EventLog _ServerName: String _ServerPort: Int32 Run() : void Server(EventLog) Stop() : void WatchConnections() : void WatchServer() : void
«property» + Clients() : Dictionary + UserData() : List<UserData> -_Server
Client -
_AdapterClient: OdbcDataAdapter _AdapterEvent: OdbcDataAdapter _AdapterServer: OdbcDataAdapter _AdapterUsers: OdbcDataAdapter _Buffer: Byte ([]) _ClientSocket: Socket _DataSet: DataSet _MyConnection: OdbcConnection _Server: Server _ServerLog: EventLog
+ + +
CharChange(String) : String Client(Server, Int32, Socket, EventLog) ConnectToDatabase() : void Database_Load() : void MessageReceive_Completed(IAsyncResult) : void MessageSend_Completed(IAsyncResult) : void Refresh(String) : void SaveData(String) : void SaveEvent(String, String) : void SendMessage(String) : void
«property» + Connected() : Boolean + Data() : UserData + event_time() : DateTime + msg_time() : DateTime + Socket() : Socket + State() : ClientState + userId() : Int32 + userName() : String + userPassword() : String
20. ábra: A szerver osztálydiagramja
A Client osztály minden kliens esetében létrehozza az adatbáziskapcsolatot a ConnectToDatabase metóduson keresztül, valamint fogadja az üzeneteket. A kliens és a 31
szerver kommunikációja a MessageCode osztályra épül, ezektől függően küldik a válaszokat egymásnak. Utóbbi a Shared csomagban található, amiről lejjebb részletesebb információk olvashatóak. Tartalmaz egy MessageReceiveCompleted eseménykezelőt, ami a nevéből is adódóan akkot fut le, ha egy üzenetet sikeresen fogadtunk. Az üzenetek mindig egy MessageCode-dal kezdődnek, ami alapján történik a megfelelő válaszok generálása. A
DatabaseLoad,
Refresh,
SaveData,
és
SaveEvent
metódusok
az
adatbázismüveleteket irányítják, úgy mint az adatok betöltése az adatbázisba, azok frissítése és mentése.
4.3.2 A WebClient komponens Lényegében ez a csomag biztosít egyfajta kezelőfelületet a szervernek, melyen keresztül megtekinthetők a felhasználók üzenetei és földrajzi elhelyezkedésük. Emellett ez a webes interfész biztosítja, hogy lehessen feljegyzéseket küldeni a kliensek számára. Két névtérből tevődik össze, melyből az egyik a View, ami a megjelenítéshez szükséges osztályokat definiálja, a másik a Model, ami a háttérkódot tartalmazza. Az osztálydiagram a 21. ábrán látható. A View-ban található ConnectChildWindow osztály egy bejelentkező ablak, ahol IP címet és felhasználónevet lehet megadni. Ezekkel történik a kapcsolódás a szerverhez. Van egy OkButton_Click eseménykezelője, amely beálltja a fent említett adatokat, valamint egy CancelButton_Click, amely csak kilép az ablakból. A MainPage osztályban a főablak kezelése történik, valamint itt használjuk az útvonal
kiszámításához
a
Bing
térképek
útvonal
szolgáltatását
is,
ez
a
RouteServiceReference. Négy eseménykezelőt definiálunk ebben az osztályban a hibák illetve állapotváltozások kezelésére. Ezek feladata, hogy ha hiba történtik a kapcsolat létrehozása (Manager_ConnectionError), a bejelentkezés (Manager_LoginError) vagy az üzenetküldés (Manager_MessageError) során, akkor erről figyelmeztetést adjanak a felhasználónak, ezen felül, ha a kliens állapota megváltozik (Manager_StateChanged), ettől az állapottól függően vezéreljék a főablak elemeit.
32
A PushPinAdd függvényben egy paraméterül kapott koordinátákat is tartalmazó lista elemei alapján jelzés kerül a térképre az adott helyeken, ezenkívül ha szükséges beállítja a térképnézetet úgy, hogy minden ilyen jelzés egyszerre látható legyen. A CreateRoute metódus szintén egy hasonló tartalmú listát kap paraméterül, mint a PushPinAdd, aminek tartalmát feldolgozva kiszámol egy útvonalat az útvonal szolgáltatás
segítségével.
Ha
az
előbbi
számítás
sikeres
volt,
a
RouteClient_CalculateRouteCompleted kirajzolja ezt az útvonalat a térképre. A főablak vezérlői a Model Manager osztályának különböző metódusait hívják meg valamint a ConnectChildWindow ablakot jelenítik meg. A Model-ben található a MessageData osztály definíciója, amely meghatározza a kliens és a szerver között küldött üzenetek szerkezetetét. Mindegyiknek tartalmaznia kell egy felhasználónevet, egy hosszúsági és egy szélességi koordinátát, egy időpontot és magát az üzenet szövegét. A ToString metódusa felül lett definiálva olyan módon, hogy az üzenet egy részei „|” karakterekkel legyenek elválasztva, valamint fordítva is, azaz egy ilyen karakterekkel elválasztott szövegből a Parse metódussal képes MessageData típust csinálni. Ebben az osztályban található még két felsorolási típus is, amelyek a korábban már említett kliensállapotok (ClientState) és üzenetkódok (MessageCode) felsoroló típusa. Végül még két osztály található a MessageData-n belül, ezek a UserData és az EventData. Előbbi a felhasználók adatainak a szerkezetét írja le, míg utóbbi az eseménynapló bejegyzéseinek a felépítését vázolja. Mindkettőnek hasonlóan a MessageData-hoz van Parse és ToString metódusa, melyekből az utóbbi felül van defininálva. A Model-ben található még egy osztály a Manager, ami gyakorlatilag minden kommunikációs feladatot ellát. ConnectToServer metódusának megadva egy címet és egy portot elküldi a szervernek a csatlakozási szándékot. Ha a kapcsolat létrejött (Connection_Completed), elküldi a felhasználó adatait authentikáció céljából, majd várja ennek eredményét. Ha a jogosultság fennáll elindít egy folyamatos keresést új üzenetek és új események érkezésére egy külön szálban (WatchMessages, WatchEvent).
33
class WebClient
Model::Manager
System.Windows.Controls.ChildWindow View ::ConnectChildWindow
-
_ClientSocket: Socket
+ + + + + + + + + +
AddMessageDelegate(String) : void CloseConnection() : void Connection_Completed(object, SocketAsyncEventArgs) : void ConnectToServer(IPAddress, Int32) : void ListServerUsers(string) : void Manager(String) MessageReceive_Completed(object, SocketAsyncEventArgs) : void MessageSend_Completed(object, SocketAsyncEventArgs) : void NewMessage(String, String, String, String) : void ProcessMessage(Byte[]) : void Route(String, String) : void SetView_Calculate(List) : void WatchEvent() : void WatchMessages() : void Where(String) : void
«property» + _MapMessageData() : List<MessageData> + _MaxLat() : Double + _MaxLong() : Double + _MinLat() : Double + _MinLong() : Double + _ServerEventData() : List<EventData> + _ServerMessageData() : List<MessageData> + _ServerUserData() : List<UserData> + Connected() : Boolean + State() : ClientState + Time() : DateTime + UserInfo() : String + UserName() : String
~ ~ ~ ~ ~ ~
_contentLoaded: bool _TextBoxPassword: System.Windows.Controls.PasswordBox _TextBoxServerAddress: System.Windows.Controls.TextBox _TextBoxUserId: System.Windows.Controls.TextBox CancelButton: System.Windows.Controls.Button LayoutRoot: System.Windows.Controls.Grid OKButton: System.Windows.Controls.Button
+
InitializeComponent() : void -_ServerConnectWindow Model::UserData + + Model::MessageData + +
Parse(String) : MessageData ToString() : string
Parse(String) : UserData ToString() : String
«property» + Password() : String + UserAddress() : String + UserId() : String + UserName() : String
«property» + Latitude() : string + Longtitude() : string + Message() : string + Time() : string + UserName() : string
«enumeration» Model::MessageCode IConnected ConnectToServer ListUsers ListMessages NewMessageClient NewMessageServer MessageReceivedClient MessageReceivedServer ListRoute Validation EventReceived
«event» + ConnectionError() : EventHandler + LoginError() : EventHandler + MessageError() : EventHandler + StateChanged() : EventHandler -_Manager
UserControl
«enumeration» Model::ClientState
View ::MainPage -
_Manager: Manager _RouteClient: MobileTracker.WebClient.Route_ServiceReference.RouteServiceClient _ServerConnectWindow: ConnectChildWindow checkusers: Thread UpdateUsers: Boolean
+ + +
_AllRoutesButton_Click(object, RoutedEventArgs) : void _ConnectButton_Click(object, RoutedEventArgs) : void _DataGridUsers_SelectionChanged(object, SelectionChangedEventArgs) : void _Map_MouseClick(object, Microsoft.Maps.MapControl.MapMouseEventArgs) : void _RegUsersButton_Click(object, RoutedEventArgs) : void _RouteButton_Click(object, RoutedEventArgs) : void _SendButton_Click(object, RoutedEventArgs) : void _TabControl_SelectionChanged(object, SelectionChangedEventArgs) : void _UsersButton_Click(object, RoutedEventArgs) : void ConnectWindow_Closed(object, EventArgs) : void Controls_Enabled() : void CreateRoute(List<MessageData>) : void MainPage() MainPage_Loaded(object, RoutedEventArgs) : void Manager_ConnectionError(object, EventArgs) : void Manager_LoginError(object, EventArgs) : void Manager_MessageError(object, EventArgs) : void Manager_StateChanged(object, EventArgs) : void PushPinAdd(List<MessageData>) : void RouteClient_CalculateRouteCompleted(object, Route_ServiceReference.CalculateRouteCompletedEventArgs) : void WatchUsers() : void
Disconnected Connected NewMessage EventReceived ListUsersReceive Validate Send ListMessageReceive ListMessageReceive2 ListUsersReceive2 Route
Model::Ev entData + +
Parse(String) : EventData ToString() : String
«property» + Message() : String + Time() : String + UserName() : String
21. ábra: A WebClient osztálydiagramja
A ProcessMessage metódus
a paraméterben bytetömb formájában kapott
MessageCodetól függően hajtva végre a különböző utasításokat, ami lehet egy felhasználólista (pl. ListUsers), vagy üzenetlista (pl. MessageReceivedServer) elküldése, esetleg ClientState megváltoztatása. A NewMessage paraméterként kapja meg az elküldendő üzenet elemeit az időt leszámítva, majd elküldi ezt a szervernek. Az idő
34
mindig az éppen aktuális időpont. A Where metódus továbbítja a szervernek, hogy éppen melyik felhasználó aktuális helyzetére van szükség, a nevet paraméterben kapja. A Route annak a felhasználónak a nevét küldi el, akinek az útvonalkoordinátáira szükség van. Végül a SetView_Calculate kap egy koordinátákból álló listát, majd ezekből számítja ki a legkisebb és a legnagyobb szélességi illetve hosszúsági adatot.
4.3.3 A MobilClient komponens Ez az alkalmazás gondoskodik a kliens-szerver kommunikáció kliens oldali részéről. Fogadja a neki címzett feljegyzéseket, valamint üzenetküldéskor a mobilkészülék pontos GPS koordinátáját is csatolja az üzenethez. Ezen kívül bármikor megtekinthető egy térképen a készülék aktuális földrajzi pozíciója. Két alapvető csomagra bontható, melyek közül az egyik a megjelenítését (View), másik pedig a háttérben történő műveletekért (Model) felelős. Az osztálydiagram a 22. ábrán található. A View egy eleme a Connect bejelentkező ablak, melynek segítsével a felhasználók bejelentkezhetnek, vagy regisztrálhatnak a rendszerbe. A _LoginButton_Click eseménykezelő beállítja a bejelentkezéshez szükséges adatokat, míg a _RegLabel_Click a regisztráció adataival teszi ugyanezt. A _CancelButton_Click bezárja az ablakot. A MobilClient osztályban a főablak kezelése történik, ezen felül itt van definiálva öt eseménykezelő különböző hibák bekövetkezésére. A Manager_ConnectionError az olyan hibák lekezelésénél használandó, mint a kliens és a szerver közötti kapcsolódási probléma. A Manager_MessageError az üzenetküldés során felmerült akadályokat hivatott jelezni, míg a Manager_LoginError a felhasználó bejelentkezése vagy regisztációja során nem egyező adatokra figyelmeztet. A GPS kapcsolatban bekövetkezett hibákról a Manager_GpsError ad jelzést. Végül az utolsó eseménykezelő nem hibákra figyelmeztet, hanem a ClientState állapotok nyilvántartására szolgáló változó értékének megváltozása esetén az értéktől függően hajt végre különböző utasításokat,
mint
például
a
fogadott
üzenetek
megjelenítése
a
felületen
(ListMessageReceive), esetleg sikeres kapcsolatlétrehozás, üzenetküldés, bejelentkezés esetén visszajelzést ad a felhasználónak.
35
class Mobilproj ect
Model::Manager + + +
_Buffer: Byte ([]) _ClientSocket: Socket _Gps: Gps _Lat: String _Long: String
+ + + + + + +
_Gps_LocationChanged(object, LocationChangedEventArgs) : void Check(String) : void CloseConnection() : void ConnectCallBack(IAsyncResult) : void ConnectToServer(IPAddress, Int32) : void Manager(String) MessageReceiveCallback(IAsyncResult) : void MessageSendCallback(IAsyncResult) : void NewMessage(String, String) : void ProcessMessageReceive(String) : void WatchMessages() : void
«enumeration» Model::MessageCode «enumeration» Model::ClientState
«property» + Connected() : Boolean + messageData() : List<MessageData> + msgData() : MessageData + State() : ClientState + userData() : List<UserData> + UserId() : String + UserInfo() : String + UserName() : String
Disconnected Connected NewMessage EventReceived ListUsersReceive Validate Send ListMessageReceive ListUsersReceive2 Route
IConnected ConnectToServer ListUsers ListMessages NewMessageClient NewMessageServer MessageReceivedClient MessageReceivedServer ListRoute Validation EventReceived
Model::MessageData + +
Parse(String) : MessageData ToString() : string
«property» + Latitude() : string + Longtitude() : string + Message() : string + Time() : string + UserName() : string
«event» + ConnectionError() : EventHandler + GpsError() : EventHandler + LoginError() : EventHandler + MessageError() : EventHandler + StateChanged() : EventHandler
Model::UserData + +
Parse(String) : UserData ToString() : String
«property» + Password() : String + UserAddress() : String + UserId() : String + UserName() : String
-_Manager
Form View ::MobileClient + + + + #
_Manager: Manager _MapForm: MapForm _ServerConnectWindow: Connect
Model::Ev entData
+ Parse(String) : EventData + ToString() : String _Map_Click(object, EventArgs) : void «property» _MenuExit_Click(object, EventArgs) : void + Message() : String _SendButton_Click(object, EventArgs) : void + Time() : String Controls_Enabled() : void + UserName() : String Disabled() : void MainWindow_Closing(object, System.ComponentModel.CancelEventArgs) : void Manager_ConnectionError(object, EventArgs) : void -_ServerConnectWindow Manager_GpsError(object, EventArgs) : void Manager_LoginError(object, EventArgs) : void Manager_MessageError(object, EventArgs) : void Manager_StateChanged(object, EventArgs) : void Form MenuConnect_Click(object, EventArgs) : void View ::Connect MobileClient() MobileClient_Load(object, EventArgs) : void - _CancelButton_Click(object, EventArgs) : void OnClosing(System.ComponentModel.CancelEventArgs) : void - _LoginButton_Click(object, EventArgs) : void - _RegLabel_Click(object, EventArgs) : void + Connect() -_MapForm Form View ::MapForm + +
MapForm() ShowLocation(String, String) : void
«property» + Password() : String + Result() : Boolean + ServerAddress() : IPAddress + UserInfo() : String + UserName() : String
22. ábra: A MobilClient osztálydiagramja
A főablak vezérlői a Manager osztály különböző metódusait hívják meg, illetve a Connect és a MapForm ablakokat hozzák létre és jelenítik meg. A harmadik osztály ami a View-t alkotja a MapForm. Egy olyan felület megjelenítésére szolgál, amelyben van egy böngészőablak, és abban a mindig aktuális pozíció látható Google Maps alapon. A ShowLocation metódus hozzáfűzi a Google 36
Maps weboldalának elérési útvonalához a hosszúsági és szélességi koordinátát, majd ezt a címet adja meg a MapForm-ban található böngészőfelületnek így megjelenítve a jelenlegi földrajzi helyzetet. A komponens másik fő része a Model, mint ahogy azt már feljebb említettem a háttérkódot tartalmazza. A UserData osztályban azok a segédosztályok találhatóak meg, amik a WebClient esetében is a MessageData osztályban, azaz a UserData, a MessageData, az EvenData osztálydefiníciók, valamint a ClientState és a MessageCode felsorolási típusok. A Manager osztály a hálózaton történő kommunikációval kapcsolatos függvényeken kívül tartalmaz egy eseménykezelőt a GPS pozíció változására. Ha ez a változás bekövetkezik a _GpsLocationChanged beállítja a _Lat illetve a _Long globális változókat a jelenlegi pozíciónak megfelelő értkékekre. A ConnectToServer metódus paraméterül kapva egy IP címet és egy portot, kapcsolatot kezdeményez a szerverrel. A kapcsolat sikeres létrejötte következtében (ConnectCallBack) továbbításra kerülnek a felhasználó adatai a szerver irányába authentikáció céljából. Ha az azonosítás közben nem történt semmi probléma, akkor elindul egy folyamatos keresés (WatchMessages) új üzenetek után egy külön szálban. A NewMessage függvény egy új üzenet elküldése során hívódik meg, pareméterben megkapja a feladó nevét és az üzenet szövegét, a GPS koordinátákat pedig a készülékbe épített GPS vevő szolgáltatja, az idő pedig mindig a küldéskor aktuális időpont a mobilkészüléken. A ProcessMessageReceive metódus paraméterben kap egy szöveget, amit átalakít MessageCode alakra, majd ettől függően hajt végre különböző utasításokat. Itt a MessageCode
lehet
Validation
vagy
MesssageReceivedClient.
Előbbi
a
kapcsolatlétrehozás, bejelentkezés, üzenetküldés során bekövetkezett hibák esetén meghívja a hibának megfelelő eseménykezelőt, vagy sikeres üzenetküldés esetén beállítja a megfelelő ClientState állapotot. Az utóbb említett MessageReceivedClient fogadott üzenet esetén hozzáadja azt a felhasználó üzenetlistájához, amit majd később megjelenít a felületen is, valamint beálltja a ListMessageReceive állapotot.
37
4.3.4 A DesktopClient komponens Lényegét tekintve ez a csomag egy plussz lehetőséget biztosít a felhasználó számára, hogy ne csak mobilkészülék segítségével tudjon kapcsolatba lépni a rendszerrel, hanem egy hagyományos számítógépes GUI alapú alkalmazáson keresztül is. class DesktopClient Form View ::Connect +
_CancelButton_Click(object, EventArgs) : void _LoginButton_Click(object, EventArgs) : void _RegLabel_LinkClicked(object, LinkLabelLinkClickedEventArgs) : void Connect()
«property» + Password() : String + Result() : Boolean + ServerAddress() : IPAddress + UserInfo() : String + UserName() : String
Form View ::MapForm + +
MapForm() ShowLocation(Location) : void -_MapForm
-_ServerConnectWindow Form View ::MainForm Model::Manager + + + + + +
_ClientSocket: Socket _Lat: String _Long: String _MessageBuffer: Byte ([])
-
_Manager: Manager _MapForm: MapForm _OpenFileDialog: OpenFileDialog _Sentences: Queue<String> _SerialPort: SerialPort _SerialTimer: System.Windows.Forms.Timer _ServerConnectWindow: Connect _Worker: BackgroundWorker
Check(String) : void CloseConnection() : void ConnectCallBack(IAsyncResult) : void - _DataGridMessages_CellContentClick(object, DataGridViewCellEventArgs) : void ConnectToServer(IPAddress, Int32) : void - _MenuConnectionCOM1_Click(object, EventArgs) : void Manager(String) - _MenuConnectionCOM2_Click(object, EventArgs) : void MessageReceiveCallback(IAsyncResult) : void - _MenuConnectionConnect_Click(object, EventArgs) : void MessageSendCallback(IAsyncResult) : void - _MenuConnectionExit_Click(object, EventArgs) : void -_Manager NewMessage(String, String, String, String) : void - _MenuConnectionStart_Click(object, EventArgs) : void ProcessMessageReceive2(String) : void - _MenuSimulationLoadData_Click(object, EventArgs) : void WatchMessages() : void - _MenuSimulationStart_Click(object, EventArgs) : void - _MenuViewMap_Click(object, EventArgs) : void «property» - _SendButton_Click(object, EventArgs) : void + Connected() : Boolean - Controls_Enabled() : void + messageData() : List<MessageData> + MainForm() + msgData() : MessageData - MainForm_Load(object, EventArgs) : void + State() : ClientState - MainWindow_Closing(object, System.Windows.Forms.FormClosingEventArgs) : void + userData() : List<UserData> - Manager_ConnectionError(object, EventArgs) : void + UserId() : String + Manager_LoginError(object, EventArgs) : void + UserInfo() : String + Manager_MessageError(object, EventArgs) : void + UserName() : String - Manager_StateChanged(object, EventArgs) : void «event» # OnClosing(System.ComponentModel.CancelEventArgs) : void + ConnectionError() : EventHandler - SerialTimer_Tick(object, EventArgs) : void + LoginError() : EventHandler - Worker_DoWork(object, DoWorkEventArgs) : void + MessageError() : EventHandler + StateChanged() : EventHandler
23. ábra: A DesktopClient részosztálydiagramja
Annyiban különbözik a mobilkészülékre specializált változattól, hogy GPS vevő hiányában csak szimulálni lehet az aktuális földrajzi pozíció változását, valamint a térképes reprezentáció során is csak ezek a szimulált adatok jeleníthetőek meg. Ezen felül nem csak TCP-n keresztül lehetséges a kommunikáció, hanem soros porton keresztül történő kapcsolat kiépítése is megvalósítható, ha rendelkezésre áll egy GPS vevő. Ebben az esetben valós GPS adatok jelennek meg mind a felhasználói, mind a 38
térképes felületen. Ezen funkciók alapjait egy térinformatikai mintaprogram [13] biztosítja. class Nmea
NmeaGPGSVSentence
«struct» NmeaSatelliteData
#_SatelliteData
# # # #
_SatelliteCount: Int32 _SatelliteData: NmeaSatelliteData ([]) _SentenceCount: Int32 _SentenceNr: Int32
+ +
NmeaGPGSVSentence(String) NmeaGPGSVSentence(String, IFormatProvider)
«property» + Data() : NmeaSatelliteData[] + SatelliteCount() : Int32 + SentenceCount() : Int32 + SentenceNumber() : Int32 + SentenceType() : NmeaSentenceType
-
_Azimuth: Int32 _Elevation: Int32 _PRN: Int32 _ReadTime: DateTime _SNR: Int32
+ + + +
NmeaSatelliteData(Int32, Int32, Int32, Int32) NmeaSatelliteData(Int32[]) NmeaSatelliteData(String[]) NmeaSatelliteData(String)
«property» + AzimuthDegree() : Int32 + ElevationDegree() : Int32 + PRN() : Int32 + ReadTime() : DateTime + SNR() : Int32
NmeaSentence # #
_Checksum: Int32 _Sentence: String
# + + + +
CalculateChecksum(String) : Int32 NmeaSentence(String) Parse(String) : NmeaSentence Parse(String, IFormatProvider) : NmeaSentence ToString() : string
NmeaGPRMCSentence
«property» + Checksum() : Int32 + SentenceType() : NmeaSentenceType + Valid() : Boolean + Words() : String[]
_Bearing: Single _Fix: Boolean _Position: Location _SatelliteDateTime: DateTime _Speed: Single
+ +
NmeaGPRMCSentence(String) NmeaGPRMCSentence(String, IFormatProvider)
«property» + Bearing() : Single + Fix() : Boolean + Position() : Location + SatelliteDateTime() : DateTime + SentenceType() : NmeaSentenceType + Speed() : Single
NmeaGPGGASentence # # # # #
_FixType: PositionFixType _Position: Location _SatelliteCount: Int32 _SatelliteTime: DateTime _SeaLevel: Distance
+ +
NmeaGPGGASentence(String) NmeaGPGGASentence(String, IFormatProvider)
NmeaGPGSASentence
«property» + FixType() : PositionFixType + Position() : Location + SatelliteCount() : Int32 + SatelliteTime() : DateTime + SeaLevel() : Distance + SentenceType() : NmeaSentenceType
# # # # # #
_AutoDimension: Boolean _FixDimension: PositionFixDimension _HDop: Single _PDop: Single _SatellitePrns: Int32 ([]) _VDop: Single
+ +
NmeaGPGSASentence(String) NmeaGPGSASentence(String, IFormatProvider)
«property» + AutoDimension() : Boolean + FixDimension() : PositionFixDimension + HDOP() : Single + PDOP() : Single + SatelliteCount() : Int32 + SatellitePRNs() : Int32[] + SentenceType() : NmeaSentenceType + VDOP() : Single
#_FixType «enumeratio... PositionFixType None GPS DGPS PPS RTK FloatRTK Estimated Manual Simulation
# # # # #
#_FixDimension «enumeration» PositionFixDimension None TwoDimenional ThreeDimensional
24. ábra: Az NmeaSentence csomag szerkezete
39
Mobilra készült veziójától eltérően négy fő részre osztható, az egyik a grafikus megjelenítésért (View), egy másik a háttérben történő műveletekért (Model) felelős, ezen kívül a szimulációhoz szükséges NMEA mondatok feldolgozását a Nmea névtér biztosítja. (24. ábra) class Positioning IEquatable IComparable ICloneable
IEquatable IComparable ICloneable «struct» Longitude
«struct» Latitude
-_Latitude
-
_DegreeValue: Double
-
_DegreeValue: Double
+ + + + + + + + + + + + + + + + + + + + + + + +
Clone() : Object CompareTo(Longitude) : Int32 CompareTo(Longitude) : Int32 Equals(Longitude) : Boolean Equals(Object) : Boolean FromDegree(Double) : Longitude FromRadian(Double) : Longitude GetHashCode() : Int32 Longitude(Double) Longitude(Int32, Int32, Double) Longitude(Int32, Int32, Double, LongitudeHemisphere) Mirror() : Longitude operator !=(Longitude, Longitude) : Boolean operator <(Longitude, Longitude) : Boolean operator <=(Longitude, Longitude) : Boolean operator ==(Longitude, Longitude) : Boolean operator >(Longitude, Longitude) : Boolean operator >=(Longitude, Longitude) : Boolean Parse(Single) : Longitude Parse(Int32) : Longitude Parse(String) : Longitude Parse(String, IFormatProvider) : Longitude Parse(Int32, Int32, Double) : Longitude Round(Int32) : Longitude ToString() : String
+ + + + + + + + + + + + + + + + + + + + + + + +
Clone() : Object CompareTo(Latitude) : Int32 CompareTo(Latitude) : Int32 Equals(Latitude) : Boolean Equals(Object) : Boolean FromDegree(Double) : Latitude FromRadian(Double) : Latitude GetHashCode() : Int32 Latitude(Double) Latitude(Int32, Int32, Double) Latitude(Int32, Int32, Double, LatitudeHemisphere) Mirror() : Latitude operator !=(Latitude, Latitude) : Boolean operator <(Latitude, Latitude) : Boolean operator <=(Latitude, Latitude) : Boolean operator ==(Latitude, Latitude) : Boolean operator >(Latitude, Latitude) : Boolean operator >=(Latitude, Latitude) : Boolean Parse(Single) : Latitude Parse(Int32) : Latitude Parse(Int32, Int32, Double) : Latitude Parse(String) : Latitude Parse(String, IFormatProvider) : Latitude Round(Int32) : Latitude ToString() : String
«property» + Degree() : Double + Equator() : Longitude + Hemisphere() : LongitudeHemisphere + Hours() : Int32 + Maximum() : Longitude + Minimum() : Longitude + Minutes() : Int32 + NorthPole() : Longitude + Radian() : Double + Seconds() : Double + SouthPole() : Longitude + TropicOfCancer() : Longitude + TropicOfCapricorn() : Longitude + Valid() : Boolean
«enumeratio... DistanceUnit Kilometers Meters Centimeters
-_Unit
IEquatable ICloneable «struct» Location -
_Altitude: Distance _Latitude: Latitude _Longitude: Longitude
+ + + + + + + + +
Clone() : Object Equals(Location) : Boolean Location(Double, Double) Location(Double, Double, Double) Location(Longitude, Latitude) Location(Longitude, Latitude, Distance) Parse(String, String) : Location Parse(String, String, IFormatProvider) : Location ToString() : String
«property» + Altitude() : Distance + Center() : Location + Latitude() : Latitude + Longitude() : Longitude + Valid() : Boolean
-_Altitude IEquatable IComparable ICloneable «struct» Distance - _RoundDecimals: Int32 = 4 - _Unit: DistanceUnit - _Value: Double -_Longitude + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Clone() : Object CompareTo(Distance) : Int32 Distance(Double) Distance(Double, DistanceUnit) Equals(Distance) : Boolean Equals(Object) : Boolean FromCentimeters(Double) : Distance FromKilometers(Double) : Distance FromMeters(Double) : Distance GetHashCode() : Int32 operator -(Distance, Distance) : Distance operator !=(Distance, Distance) : Boolean operator *(Distance, Distance) : Distance operator /(Distance, Distance) : Distance operator +(Distance, Distance) : Distance operator <(Distance, Distance) : Boolean operator <=(Distance, Distance) : Boolean operator ==(Distance, Distance) : Boolean operator >(Distance, Distance) : Boolean operator >=(Distance, Distance) : Boolean Parse(String) : Distance Parse(String, IFormatProvider) : Distance Round(Int32) : Distance ToCentimeters() : Distance ToKilometers() : Distance ToMeters() : Distance ToString() : String ToUnitType(DistanceUnit) : Distance
«property» + Degree() : Double + Equator() : Latitude + Hemisphere() : LatitudeHemisphere + Hours() : Int32 + Maximum() : Latitude + Minimum() : Latitude + Minutes() : Int32 + NorthPole() : Latitude + Radian() : Double + Seconds() : Double + SouthPole() : Latitude + TropicOfCancer() : Latitude + TropicOfCapricorn() : Latitude + Valid() : Boolean
«property» + AbsValue() : Double + Infinity() : Distance + Maximum() : Distance + Minimum() : Distance + Unit() : DistanceUnit + Value() : Double + Zero() : Distance
25. ábra: A Positioning csomag felépítése
40
Végül az előbb említett mondatokból kinyert adatok szerkezetéért, a velük végzett műveletekért (például sebessség és pozíció kiszámítása) a Positioning csomag felel (25. ábra). Az részosztálydiagram a 23. ábrán látható. A felületi részben a már korrában részletezett Connect, MapForm és a főablakként funcionáló MainForm (26. ábra) itt is megtalálható. Ezen kívül tartalmaz még egy felületi osztályt, a SatelliteDataControl-t, amely a GPS pozíció változásának szimulációja közben jeleníti meg az egyes a fogadott, valamint satellite adatokat, amik a szimulációhoz igazodva folyamatosan változnak. A háttérkód ugyanazt a Manager osztályt tartalmazza, amit a 4.2.3-as fejezet már részlezett. class DesktopClient
View ::MainForm - _DataGridMessages: System.Windows.Forms.DataGridView - _Latitude: System.Windows.Forms.TextBox - _LatLabel: System.Windows.Forms.Label - _ListSentences: System.Windows.Forms.ListBox - _Longitude: System.Windows.Forms.TextBox - _LongLabel: System.Windows.Forms.Label - _MenuConnection: System.Windows.Forms.ToolStripMenuItem UserControl - _MenuConnectionCOM1: System.Windows.Forms.ToolStripMenuItem View ::SatelliteDataControl - _MenuConnectionCOM2: System.Windows.Forms.ToolStripMenuItem - _MenuConnectionConnect: System.Windows.Forms.ToolStripMenuItem - _Bearing: Single - _MenuConnectionExit: System.Windows.Forms.ToolStripMenuItem - _CurrentLocation: Location - _MenuConnectionPort: System.Windows.Forms.ToolStripMenuItem - _PreviousLocations: List - _MenuConnectionStart: System.Windows.Forms.ToolStripMenuItem - _SatelliteData: List -_SatelliteDataControl - _MenuSimulation: System.Windows.Forms.ToolStripMenuItem - _MenuSimulationLoadData: System.Windows.Forms.ToolStripMenuItem + Clear() : void - _MenuSimulationStart: System.Windows.Forms.ToolStripMenuItem + RunSentence(NmeaSentence) : void - _MenuView: System.Windows.Forms.ToolStripMenuItem + SatelliteDataControl() - _MenuViewMap: System.Windows.Forms.ToolStripMenuItem «property» - _Message: System.Windows.Forms.TextBox + Bearing() : Single - _MessageLabel: System.Windows.Forms.Label + CurrentLocation() : Location - _SatelliteDataControl: SatelliteDataControl - _SendButton: System.Windows.Forms.Button - _StatusBar: System.Windows.Forms.StatusBar - components: System.ComponentModel.IContainer = null - menuStrip1: System.Windows.Forms.MenuStrip - toolStripMenuItem1: System.Windows.Forms.ToolStripSeparator - toolStripMenuItem2: System.Windows.Forms.ToolStripSeparator # -
Dispose(bool) : void InitializeComponent() : void
26. ábra: A MainForm osztály felépítése
4.3.5 A Shared komponens Ez a csomag azt a UserData osztályt tartalmazza, amely már korábban a WebClient komponens esetében részletezésre került, csak ott MessageData néven szerepelt az osztálydefinició. Azért van szükség erre csomagra, hogy ne kelljen még kétszer
41
ugyanazt az osztályt implementálni. A DesktopClient és a Service komponensek referenciáihoz hozzá lett adva a Shared csomag osztálykönyvtára, így elérhetővé válnak ezen összetevő osztályai a másik két komponens számára. A WebClient-nél azért nem lehet használni ezt a segédcsomagot, mert a gazdag felhasználói élményt nyújtó technológia alkalmazása miatt csak saját Silverlight-os referenciákat enged felhasználni. A MobilClient esetében a Visual Studio 2008-ban történő fejlesztés miatt nem került felhasználásra a Visual Studio 2010-es verzióban létrehozott könyvtári modul.
4.4
Az adatbázis felépítése
Az adatbázis, amelyre az egész alkalmazás épül négy táblából áll. A 27. ábrán látható az adatbázis részletes felépítése. Az első és egyben legfontosabb a users tábla, ami a rendszerbe regisztrált felhasználókat tárolja azok nevével, jelszavával, és IP címével. Regisztráció esetén a felhasználó bekerül ebbe a táblába, majd bejelentkezéskor az itt tárolt adatok alapján történik az authentikáció. A következő tábla a client_messages, amelyben a felhasználók által küldött üzenetek kapnak helyet a felhasználónévvel, a hosszúsági- és a szélességi koordinátákkal, valamint a küldési idejével és magával az üzenet szövegével. Csak olyan felhasználók üzenetei jelenthetnek meg itt, ahol a feladó szerepel a users táblában. Új üzenet küldésekor a szerver ebbe a táblába tárolja el az adatokat, majd amikor a szerver webes felülete (WebClient) keresést folytat eddig még nem feldolgozott üzenetek után, akkor ebből a táblából olvassa a sorokat. Az előzőhöz hasonló felépítésű a server_messages tábla is, melyben a szerver által küldött üzenetek vannak tárolva. A szerkezete ugyanaz, mint a client_messagesnek, azzal a különbséggel, hogy itt a felhasználónév a címzettet takarja. Ha a szerver új üzenetet küldd egy kliensnek, akkor az üzenet adatai ebbe a táblába kerülnek, majd amikor a MobilClient vagy a DesktopClient új üzenetek keresésére irányuló kérést intéz a szerver felé, az ennek a táblának a sorait olvassa. Végül az utolsó tábla az eventlog, melynek tartalmát az eseménynapló bejegyzései alkotják. Szerkezetét tekintve egy felhasználónévből és egy naplóbejegyzésből áll. Ha a szerver tevékenységét naplózza, akkor a felhasználónév az administrator, minden más
42
esetben a kliensalkalmazásba bejelentkezett felhasználó neve kerül ebbe a mezőbe. Olyan jellegű bejegyzéseket tartalmaz, mint, hogy egy felhasználó csatlakozni próbált, sikeresen vagy sikertelenül próbált bejelentkezni, vagy üzenetet küldött. Utóbbiakat természetesen az administrator is teheti.
27. ábra: Az adatbázis felépítése
43
4.5
Implementációs megoldások
A rendszer implementálásra során használtam Visual Studio 2008-as és Visual Studio
2010-es
verziójú
fejlesztőkörnyezetet,
ezért
az
alkalmazásom
egy
projektcsoportból és egy külön álló projektből áll össze. A külön álló project Visual Studio 2008-ban készült a korábban említett telepítési problémák következtében, míg a többi projekt a későbbi Visual Studio 2010-ben. Ezek a következők: MobileTracker.Service: Windows szolgáltatás projekt. MobileTracker.WebClient: Silverlight kontrol. MobileTracker.WebClient.Web: ASP.NET webalkalmazás. MobileTracker.DesktopClient: Windows Form alkalmazás. MobileTracker.Shared: .NET dinamikus könyvtárprojekt. MobileTracker.Setup: Telepítő projekt. A különálló projekt pedig : Mobilclient : Windows Form alkalmazás mobilkészülékre.
4.6
Tesztelés
A rendszer tesztelése leginkább a fehérdoboz módszeren alapult ami annyit tesz, hogy a tesztelés folyamata során ismert a programkód és a struktúrális felépítés. Kisebb nehézségeket jelentett, hogy a Visual Studio nem támogatja a Silverlight technológiával készült alkalmazások futásánának nyomonkövetését, de ezt a problémát sikerült áthidalni. Ezen kívül lassított a tesztelési folyamatot, hogy a Windows szogáltatások nyomonkövetése sem megoldott a Visual Studio-ban, ezért a hibákat az eseménynapló bejegyzései alapján lehetett javítani. Minden módosítás után törölni, majd újratelepíteni kellett a szolgáltatást, hogy a módosított verziót használni tudjuk, ami szintén nagy hátránya ezeknek a szolgáltatásoknak.
44
A szerver webes felületének (WebClient) tesztelése során küldtem a kliensek által közelebbi, majd távolabbi koordinátákat is, amelyeket a térképen ki kellett volna rajzolnia, de ekkor egy olyan problémával szembesültem, hogy ha két egymástól viszonylag távol eső koordinátát adtam meg neki, akkor az útvonal kirajzolása közben túl sok köztes pontot kellett vizsgálnia, ami nem fért bele az alapértelmezett bufferméretbe. Ezt a nehézséget sikerült javítani egy kellően nagy pufferméret beállításával. A Silverlight alkalmazásban található Bing térkép nagyítása dinamikusan töltődik be, ennek gyorsasága erősen függ az internetkapcsolat sebességétől, valamint a használt számítógép teljesítményétől. A további tesztelések érdekében létrehoztam egy tesztprojectet (Test.Connection), amely a szerver teherbíróképességét hivatott felmérni. Olyan osztályok kerültek megvalósításra, amelyekkel szimulálható a szerver működése. Vizsgáltam, hogyan viselkedik a szerver, ha egyszerre nagyobb számú kliensmennyiséget kell fogadnia, illetve ha egyszerre sok üzenetet kell feldolgoznia. A projektben található osztályok a következők: TestTCPServer: létrehoz egy TCP kapcsolatokat fogadó szervert, amely a fogadott üzeneteket kiirja a konzolfelületre. TestPolicyServer: ugyanazt a funkciót tölti be, mint az eredeti szolgáltatásban szereplő PolicyServer. Program: Létrehoz tetszőlegesen sok kliensobjektumot, amelyek párhuzamosan kapcsolatatot
létesítenek
a
szerverrel,
majd
folyamatosan
üzeneteket
küldözgetnek neki. Ezzel felmérhető, hogy hogyan viselkedik a rendszer sok felhasználó esetén. A fent említett projekttel történő tesztelés kiegészítve az egész teszeltési folyamatot, az alábbi következtetéseket tudtam levonni: A hálózati kommunikáció nagy mennyiségű adatforgalom és sok kliens esetén is megfelelően műkődik. A Silverlight alkalmazás betöltése függ az internetkapcsolat sebességétől, valamint a számítógép teljesítményétől is.
45
Az adatbázisműveletek nem, vagy nem észrevehető módon lassítják a hálózati kommunikációt. Az fentiekben ismertett tesztelések alkalmával észlelt hibák javításra kerültek, a korábban megígért szolgáltatásokat a rendszer teljeskörűen biztosítja és hibamentesen működik.
46
5.
Összefoglalás A szakdolgozat célja, egy olyan több alkalmazásból álló feljegyző és nyomkövető
rendszer készítése volt, amely képes párhuzamosan több felhasználót kiszolgálni. Saját meglátásom szerint a program teljes mértékben megfelel ezeknek a kritériumoknak. Funkcionalitásában segíti a vállalatokat alkalmazottaik adatainak kezelésében, újabb felhasználók beléptetésében, nyomonkövetésében, a velük történő kommunikációban, és feladatok kiosztásában. A fejlesztés során nem volt elegendő a már birtokomban lévő tudás, szükség volt újabb ismeretek elsajátítására is, többek között ez volt a Silverlight technológia eszközkészlete valamint a Bing térképek kezelése. A program továbbfejlesztési lehetőségei ki lesznek aknázva az ELTE térinformatikai projektje keretében. Többek között itt gondolok a térképes reprezenteció funcióinak bővítésére, például sebesség kiszámítása és megjelenítése, esetleg a mobilos alkalmazás szolgáltatásainak kiterjeszése egy útvonaltervezővel. Fejlesztői
oldalról
a
későbbiekben
ajánlott
korszerűsíteni
az
alkalmazott
technológiákat, például már folyik a Silverlight 5.0 fejlesztése, ami még gazdagabb felhasználói élményt képes majd nyújtani. A mobilkliens oldaláról nézve célszerű lenne az alkalmazást a legújabb operációs rendszernek (Microsoft Windows Phone 7) megfelelően átalakítani. Egy jelentősebb továbbfejlesztése lenne az alkalmazásnak, ha több platformon elérhető válna, több vállalatot kiszolgálva ezzel. A fejlesztés során nem tapasztaltam jelentős vagy nem áthidalható nehézségeket az alkalmazott technológiákkal kapcsolatban, ezért úgy gondolom, hogy a választott eszközök tökéletesen megfelelnek egy ilyen komplexitású rendszer megvalósításához. A vállalatoknak versenyképességük fenntartásához szükségük van az ilyen és ehhez hasonló alkalmazásokra, hogy mindig naprakész információkkal rendelkezzenek alkalmazottaik munkavégzéséről. A mobilkészükékekre készült programok már ma is nagyon elterjedtek, és ez az arány a jövőben valószínűleg nőni fog. Mindezek következtében az informatikai fejlesztések ezen ága mindig keresett, és egyre keresettebb lesz a piacon.
47
Ábrajegyzék 1. ábra: Az aszinkron hálózati kommunikáció ............................................................. 6 2. ábra: A Silverlight architektúra ................................................................................ 7 3. ábra: Bing Maps ....................................................................................................... 8 4. ábra: Egy relációs adatbázis modell ....................................................................... 10 5. ábra: Üzenetek megjelenítése ................................................................................. 14 6. ábra: Az útvonal megjelenítése .............................................................................. 15 7. ábra: Az eseménynapló bejegyzéseinek megtekintése ........................................... 16 8. ábra: Bejelentkező ablak ........................................................................................ 17 9. ábra: Regisztrációs ablak........................................................................................ 17 10. ábra: A felhasználói felület .................................................................................. 18 11. ábra: Google Map Location ................................................................................. 19 12. ábra: Bejelentkező ablak ...................................................................................... 19 13. ábra: Regisztrációs ablak...................................................................................... 19 14. ábra: Üzenet küldő/fogadó ablak ......................................................................... 20 15. ábra: Térképmegjelenítő ...................................................................................... 21 16. ábra: Felhasználói esetek az adminisztrátor szemszögéből ................................. 25 17. ábra: Felhasználói esetek a mobilos bejelentkezés esetén ................................... 26 18. ábra: Felhasználói esetek számítógépes bejelentkezés esetén ............................. 27 19. ábra: A rendszer kihelyezési diagramja ............................................................... 29 20. ábra: A szerver osztálydiagramja ......................................................................... 31 21. ábra: A WebClient osztálydiagramja .................................................................. 34 22. ábra: A MobilClient osztálydiagramja ................................................................. 36 23. ábra: A DesktopClient részosztálydiagramja ....................................................... 38 24. ábra: Az NmeaSentence csomag szerkezete ........................................................ 39 25. ábra: A Positioning csomag felépítése ................................................................. 40 26. ábra: A MainForm osztály felépítése ................................................................... 41 27. ábra: Az adatbázis felépítése ................................................................................ 43
48
Irodalomjegyzék [1]
Jeffrey D. Ullmann, Jenifer Widom: Adatbázisrendszerek – Alapvetés, Panem Könyvkiadó, 2009, [591], ISBN- 978 963 545 481 5
[2]
Microsoft Windows Mobile Device Center 6, http://www.microsoft.com/downloads/hu-hu/details.aspx?FamilyID=83d513ea9df9-4920-af33-3a0e2e4e7beb, 2011
[3]
Virtual PC 2007, http://www.microsoft.com/downloads/en/details.aspx?FamilyID=04d264023199-48a3-afa2-2dc0b40a73b6, 2011
[4]
MySQL Connector ODBC, http://dev.mysql.com/downloads/connector/odbc/, 2011
[5]
MySQL Community Server, http://dev.mysql.com/downloads/mysql/5.1.html, 2011
[6]
Silverlight Official HomePage, http://www.silverlight.net/, 2011
[7]
NMEA Sentences, http://www.nmea.org/content/nmea_standards/retired_sentenc.asp, 2011
[8]
Microsoft Silverlight 4 Tools for Visual Studio 2010, http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b3deb194ca86-4fb6-a716-b67c2604a139, 2011
[9]
Bing Maps Silverlight Control SDK, http://www.microsoft.com/downloads/en/details.aspx?FamilyID=beb29d276f0c-494f-b028-1e0e3187e830, 2011
[10]
Bing Maps Route Service, http://msdn.microsoft.com/enus/library/cc966738.aspx, 2011
[11]
Windows Mobile 6 Professional SDK, http://www.microsoft.com/downloads/en/details.aspx?familyid=06111a3a-a6514745-88ef-3d48091a390b&displaylang=en, 2011
[12]
GPS Tracker for Windows Mobile, http://gpstracker.codeplex.com/, 2011 49
[13]
Mapping.Locator, http://people.inf.elte.hu/groberto/elte_taf/elte_taf_gyakorlati_anyagok.htm, 2011
50