Z´apadoˇcesk´a univerzita v Plzni Fakulta aplikovany´ch vˇed Katedra informatiky a vy´poˇcetn´ı techniky
Diplomov´ a pr´ ace Hern´ı aplikace pro demonstraci pouˇ zit´ı komponent na OS Android
Plzeˇ n 2012
Jan Z´aruba
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem diplomovou pr´aci vypracoval samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. V Plzni dne 15. kvˇetna 2012 Bc. Jan Z´aruba
Abstract My thesis Development of component-based mobile applications with OSGi is supposed to demostrate possibilities of usage OSGi framework in mobile application development. First part of my thesis summarizes prerequisities for using OSGi on Android. Then capabilities of data persistence on JPA are presented. Second practical part is aimed at development of gaming application, which consists of two parts: server application (OSGi on servlet container), client application (based on Android). Keywords: android development, OSGi, JPA, smartphone
Obsah ´ 1 Uvod 2 Platformy pro mobiln´ı zaˇ r´ızen´ı 2.1 iOS . . . . . . . . . . . . . . . . . . . . 2.1.1 Publikov´an´ı aplikac´ı . . . . . . 2.1.2 V´ yvoj aplikac´ı . . . . . . . . . . 2.2 Android . . . . . . . . . . . . . . . . . 2.2.1 Historie . . . . . . . . . . . . . 2.2.2 Architektura syst´emu Android . 2.2.3 V´ yvoj aplikaci pro Android . . 2.2.4 Komunikace zaˇr´ızen´ı s Android 2.3 Windows Phone 7 . . . . . . . . . . . 2.3.1 V´ yvoj pod platformou Windows 2.3.2 Publikace aplikac´ı . . . . . . . .
1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Phone . . . .
. . . . . . . . . 7 .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
3 OSGi 3.1 Bundle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ˇ 3.1.1 Zivotn´ ı cyklus bundlu . . . . . . . . . . . . . . . . . 3.1.2 Sluˇzby v OSGi . . . . . . . . . . . . . . . . . . . . . 3.2 OSGi Enterprise . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Vyuˇzit´ı webov´e sluˇzby frameworku vs. framework embedded na serveru . . . . . . . . . . . . . . . . . . . 3.3 Felix na OS Android . . . . . . . . . . . . . . . . . . . . . . 3.3.1 Spuˇstˇen´ı Felixe na Androidu . . . . . . . . . . . . . . 3.3.2 Pˇr´ıstup do spuˇstˇen´eho frameworku . . . . . . . . . . 3.3.3 Vyuˇzit´ı sluˇzeb Android z OSGi . . . . . . . . . . . . 3.3.4 Pˇr´ıprava bundlu pro pouˇzit´ı na Android . . . . . . .
. . . . . . . . . . .
2 2 3 3 5 6 6 8 12 13 13 14
. . . .
16 16 18 18 19
. . . . . .
21 29 29 32 32 34
4 Persistence dat 36 4.1 JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.2 Objektovˇe relaˇcn´ı mapov´an´ı - pouˇzit´ı JPA . . . . . . . . . . . 37
OBSAH
OBSAH
5 Aplikace GPS game 5.1 Z´amˇer aplikace . . . . . . . . . . . . . . . . 5.1.1 Co hra dˇel´a . . . . . . . . . . . . . . 5.2 Architektura aplikace . . . . . . . . . . . . . 5.3 Popis komunikaˇcn´ıho protokolu . . . . . . . 5.3.1 Login . . . . . . . . . . . . . . . . . 5.3.2 Game list . . . . . . . . . . . . . . . 5.3.3 Join game . . . . . . . . . . . . . . . 5.3.4 Create game . . . . . . . . . . . . . . 5.3.5 Position report . . . . . . . . . . . . 5.3.6 Fire . . . . . . . . . . . . . . . . . . 5.3.7 Duel . . . . . . . . . . . . . . . . . . 5.3.8 Get players . . . . . . . . . . . . . . 5.4 Serverov´a aplikace . . . . . . . . . . . . . . 5.4.1 Model dat a persistenˇcn´ı bundle . . . 5.4.2 Aplikaˇcn´ı logika . . . . . . . . . . . . 5.4.3 Dashboard . . . . . . . . . . . . . . . 5.5 Klientsk´a aplikace . . . . . . . . . . . . . . . 5.5.1 Architektura aplikace . . . . . . . . . 5.5.2 Prezentaˇcn´ı vrstva - Android . . . . . 5.5.3 Aplikaˇcn´ı logika a s´ıt’ov´a komunikace 5.6 Ovˇeˇren´ı v´ ysledn´e aplikace . . . . . . . . . . 5.7 Rozˇs´ıˇren´ı aplikace . . . . . . . . . . . . . . . 5.7.1 V´ıce typ˚ u her . . . . . . . . . . . . . 5.7.2 V´ıce ˇzivot˚ u pro hr´aˇce . . . . . . . . . 5.7.3 Lepˇs´ı lokaˇcn´ı bundle . . . . . . . . . 5.7.4 Dashboard na mobil . . . . . . . . . 6 Zkuˇ senosti s pouˇ zit´ım OSGi 6.1 Pouˇzit´ı emul´atoru nebo re´aln´eho zaˇr´ızen´ı . . 6.2 ADT plugin pro Eclipse . . . . . . . . . . . 6.3 Pˇr´ıprava bundl˚ u. . . . . . . . . . . . . . . . 6.4 Spr´avn´e nastaven´ı poˇrad´ı spouˇstˇen´ı bundl˚ u . 6.5 Spr´avn´e nastaven´ı frameworku . . . . . . . . 6.6 Nastaven´ı z´avislost´ı pro Android pod Maven 6.7 Zhodnocen´ı pouˇzit´ı OSGi komponent . . . . 7 Z´ avˇ er
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
42 42 42 43 43 45 46 47 48 49 51 51 52 53 55 59 62 63 63 65 73 75 75 75 76 76 76
. . . . . . .
77 77 78 78 78 79 79 79 81
4
OBSAH
OBSAH
A Uˇ zivatelsk´ a pˇ r´ıruˇ cka A.1 Serverov´a ˇc´ast . . . . . . . . . . . . . . A.1.1 Instalace na server . . . . . . . A.2 Klientsk´a ˇc´ast . . . . . . . . . . . . . . A.2.1 Pˇrihl´aˇsen´ı . . . . . . . . . . . . A.2.2 Konfigurace serveru . . . . . . . A.2.3 Vytvoˇren´ı a pˇripojen´ı se ke hˇre A.2.4 Samotn´a hra . . . . . . . . . . A.2.5 V´ ymˇena komponent . . . . . . A.2.6 Ukonˇcen´ı aplikace . . . . . . . .
5
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
84 84 84 84 85 85 85 87 87 88
´ 1 Uvod ˇ Zijeme v dobˇe, kdy kaˇzd´ ym dnem roste poˇcet smartphon˚ u a tablet˚ u, a to pˇres oˇcek´av´an´ı nˇekter´ ych odborn´ık˚ u. Rozvoj chytr´ ych“ mobiln´ıch zaˇr´ızen´ı ” nab´ız´ı obrovsk´e mnoˇzstv´ı sluˇzeb, kter´e mohou tato zaˇr´ızen´ı zprostˇredkov´avat (r˚ uzn´e hern´ı aplikace, propojen´ı se soci´aln´ımi s´ıtˇemi, propojen´ı s r˚ uzn´ ymi ERP syst´emy). Nˇekter´e aplikace ˇcasem nab´ yvaj´ı na sloˇzitosti a z´aroveˇ n se jejich ˇc´asti velmi ˇcasto opakuj´ı, napˇr´ıklad ˇc´asti komunikuj´ıc´ı se serverem, ˇc´asti komunikuj´ıc´ı se senzory zaˇr´ızen´ı atd. Zde se pˇr´ımo nab´ız´ı myˇslenka vyuˇz´ıt komponentov´eho pˇr´ıstupu k v´ yvoji aplikac´ı, kter´ y poskytuje moˇznost u ´ˇcinn´e dekompozice aplikace, znovupouˇzit´ı vytvoˇren´ ych komponent, pˇr´ıpadnou snadnou v´ ymˇenu nˇekter´e komponenty (komponenta se m´a chovat jako blackbox“, tzn. ” zn´ame rozhran´ı jak s komponentou komunikovat, ale ne jak je implementov´ana vnitˇrn´ı logika). Jedn´ım z c´ıl˚ u t´eto pr´ace bude provˇeˇrit moˇznosti tvorby aplikac´ı zejm´ena pro iOS a Android. Hlavn´ım c´ılem bude vytvoˇrit hern´ı aplikaci, kter´a bude demonstrovat architekturu a v´ yvoj klient-server aplikace zaloˇzen´e na komponent´ach, konkr´etnˇe takov´e, kdy komponentov´ ym modelem je OSGi a klientsk´a ˇc´ast je provozov´ana na OS Android. V´ ystupem pr´ace budou d´ale zkuˇsenosti, popˇr´ıpadˇe rady, z´ıskan´e pˇri v´ yvoji aplikace.
1
2 Platformy pro mobiln´ı zaˇr´ızen´ı Podle Ablesona v [1] jsou dnes na trhu dva typy mobiln´ıch zaˇr´ızen´ı: • hloup´e“ telefony - feature phones ” Telefony, kter´e slouˇz´ı pˇredevˇs´ım na vol´an´ı, pˇr´ıpadnˇe pos´ıl´an´ı SMS zpr´av, mohou m´ıt napˇr´ıklad fotoapar´at nebo na nich lze proch´azet webov´e str´anky (zde ovˇsem vˇetˇsinou z´akazn´ık nar´aˇz´ı na ne moc velk´ y uˇzivatelsk´ y komfort). • chytr´e“ telefony - smart phones ” Chytr´e telefony poskytuj´ı ty sam´e moˇznosti, co hloup´e“ telefony. Ale ” poskytuj´ı je trochu jin´ ym zp˚ usobem. Vˇetˇsinou obsahuj´ı vˇetˇs´ı mnoˇzstv´ı funkc´ı a jejich charakteristickou vlastnost´ı je nutnost“ pˇripojen´ı na ” internet, bez kter´eho pˇrich´az´ı o mnoho sv´ ych funkc´ı. D´ale bych se r´ad zab´ yval pouze chytr´ ymi“ telefony. Na trhu m´ame nˇeko” lik rozˇs´ıˇren´ ych OS: • iOS • Android • Windows Phone 7 Ve v´ yˇctu jsem nezm´ınil Symbian, kter´ y pravdˇepodobnˇe skonˇc´ı, protoˇze spoleˇcnost Nokia, kter´a ho vyv´ıjela, pˇrech´az´ı na Windows Phone 7. D´ale jsou tu dalˇs´ı menˇs´ı OS jako Maemo a jeho n´astupce MeeGo (tak´e vyv´ıjen´e spoleˇcnost´ı Nokia). Tyto syst´emy byly nasazeny na m´alo pˇr´ıstroj˚ u a podle prohl´aˇsen´ı ˇceln´ıch pˇredstavitel˚ u Nokia nebudou nasazeny jiˇz nikam.
2.1
iOS
iOS je operaˇcn´ı syst´em pro zaˇr´ızen´ı vyr´abˇen´e spoleˇcnost´ı Apple. Oproti syst´emu Android nen´ı otevˇren´ y a je vyv´ıjen´ y pro konkr´etn´ı architekturu zaˇr´ızen´ı 2
Platformy pro mobiln´ı zaˇr´ızen´ı
iOS
vyr´abˇen´ ych Applem, jako je v souˇcasn´e dobˇe iPhone a iPad. Tak jako se pˇri v´ yvoji pro Android pouˇz´ıv´a programovac´ı jazyk Java, tak pro iOS se vyuˇz´ıv´a jazyk Objective-C.
2.1.1
Publikov´ an´ı aplikac´ı
Abychom mohli aplikaci publikovat, mus´ıme ji v pˇr´ıpadˇe iOS d´at na AppStore. K tomu je nutn´a registrace do iOS Developer Program1 . K dispozici jsou dvˇe moˇznosti: enterprise pro vˇetˇs´ı spoleˇcnosti a standard, za kter´ y se v roce 2012 plat´ı $ 99. V r´amci t´eto ceny v´ yvoj´aˇr dostane v´ yvojov´e prostˇred´ı, pˇr´ıstup na f´ora a moˇznosti dotaz˚ u na podporu spoleˇcnosti Apple.
2.1.2
V´ yvoj aplikac´ı
K tomu, abyste mohli vyv´ıjet aplikace pro nˇejak´ y z produkt˚ u Apple, je nutn´e vlastnit Mac, bez nˇeho je v´ yvoj nemoˇzn´ y. Apple poskytuje pro v´ yvoj SDK, kter´e obsahuje mimo jin´e i integrovan´e v´ yvojov´e prostˇred´ı Xcode. Pro v´ yvoj aplikac´ı na iOS se pouˇz´ıv´a Cocoa. Cocoa je aplikaˇcn´ı prostˇred´ı jak pro Mac OS X tak i pro iOS, je to sada r˚ uzn´ ych objektov´ ych framework˚ u, kter´e se pouˇz´ıvaj´ı pro bˇeh aplikac´ı na Mac OS X a iOS. Obsahuje velk´e mnoˇzstv´ı tˇr´ıd, na z´akladˇe kter´ ych lze vytv´aˇret robustn´ı i pomˇernˇe rozs´ahl´e aplikace. Z´akladn´ım programovac´ım jazykem je Objective-C, ale lze vyuˇz´ıt i jin´ ych. D´ıky tomu, ˇze je Objective-C zaloˇzen´ y na jazyku ANSI C, lze bez probl´em˚ u vyuˇz´ıt zdrojov´eho k´odu z ANSI C. D´ale lze volat funkce z r˚ uzn´ ych jiˇz zkompilovan´ ych knihoven, dokonce lze do k´odu zam´ıchat i ˇc´asti k´odu z C++. Cocoa obsahuje 2 nejd˚ uleˇzitˇejˇs´ı bal´ıky tˇr´ıd [19] • Pro Mac OS X jsou to Foundation a AppKit • Pro iOS jsou to Foundation a UIKit Rozdˇelen´ım knihoven lze dos´ahnout oddˇelen´ı prezentaˇcn´ı vrstvy, coˇz napˇr´ıklad poskytuje moˇznost, aby aplikaˇcn´ı logika, popˇr´ıpadˇe zpracov´an´ı dat, bylo stejn´e pro zaˇr´ızen´ı na Mac OS X a iOS. 1
https://developer.apple.com/programs/ios/
3
Platformy pro mobiln´ı zaˇr´ızen´ı
iOS
Architektura Cocoa na iOS N´asleduj´ıc´ı obr´azek(2.1) ukazuje jak vypad´a Cocoa na zaˇr´ızen´ı iOS.
Obr´azek 2.1: Cocoa v architektuˇre iOS2 • Core OS J´adro syst´emu obsahuje, jak lze pˇredpokl´adat, z´akladn´ı funkce jako je spr´ava souborov´eho syst´emu, pˇr´ıstup k s´ıti. . . • Core Services Core services poskytuj´ı sluˇzby, kter´e umoˇzn ˇuj´ı zaˇr´ızen´ı r˚ uzn´e funkce s ˇretˇezci a jin´ ymi programov´ ymi strukturami a tak´e pˇr´ıstup k hardwaru zaˇr´ızen´ı (GPS sensory, s´ıt’ov´a komunikace). • Media Jak napov´ıd´a n´azev vrstvy poskytuje r˚ uzn´e grafick´e a multimedi´aln´ı sluˇzby. • Cocoa Touch Vrstva, na kter´e pˇr´ımo bˇeˇz´ı koncov´a aplikace.
Objective-C Je objektov´ y jazyk, ve kter´em se p´ıˇsou aplikace pro iOS. Jazyk a jeho syntaxe je zaloˇzena na jazyku ANSI C (je jeho nadmnoˇzinou)[20], od kter´eho pˇrevzal napˇr´ıklad primitivn´ı datov´e typy jako int, float. . . Objective-C je proti ANSI C rozˇs´ıˇren´e o objekty a zas´ıl´an´ı zpr´av z jazyka Smalltalk. 2
pˇrevzato z http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/ Conceptual/CocoaFundamentals/Art/architecture stack.jpg dne 30.4.2012
4
Platformy pro mobiln´ı zaˇr´ızen´ı
Android
Jistˇe zaj´ımavou vlastnost´ı Objective-C je nˇekolik moˇznost´ı, jak spravovat pamˇet’: • ARC (Automatic Reference Counting) - pˇrekladaˇc s´am ˇr´ıd´ı ˇzivotn´ı cyklus objekt˚ u. • MRC (Manual Reference Counting) - Nˇekdy se naz´ yv´a tak´e MRR (Memory Retain/Release). Program´ator m´a objekty plnˇe pod kontrolou a z´aroveˇ n je plnˇe odpovˇedn´ y za ˇzivotn´ı cyklus objekt˚ u. • Garbage Collection - V tomto reˇzimu pˇred´av´a program´ator spr´avu objekt˚ u sbˇeraˇci, kter´ y se za bˇehu programu star´a o ˇzivotn´ı cyklus objekt˚ u. Pro srovn´an´ı uvedu p´ar rozd´ıln´ ych z´apis˚ u mezi C++ a Objective-C C++ Objective-C #include ”library.h” #import ”library.h” this self @private private: protected: @protected public: @public Y = new MyClass(); Y = [[MyClass alloc] init]; try, throw, catch, finally @try, @throw, @catch, @finally Tabulka 2.1: Rozd´ıly z´apis˚ u mezi C++ a Objective-C3 Z uveden´e tabulky (tabulka 2.1) lze vidˇet podobnosti i rozd´ılnosti z´apisu v obou jazyc´ıch.
2.2
Android
Android je platforma pro mobiln´ı zaˇr´ızen´ı jako jsou smartphony nebo tablety obsahuj´ıc´ı operaˇcn´ı syst´em, middleware a dalˇs´ı aplikace[18]. Operaˇcn´ı syst´em Android je vyv´ıjen konsorciem Open Handset Alliance, kter´e je veden´e spoleˇcnost´ı Google. Syst´em je vyd´av´an pod open-source licenc´ı a je 3
pˇrevzata z http://www.codeproject.com/Articles/88929/Getting-Started-withiPhone-and-iOS-Development - tabulka popisuj´ıc´ı rozd´ıl mezi C++/Objective-C 30.4.2012
5
Platformy pro mobiln´ı zaˇr´ızen´ı
Android
zaloˇzen na j´adru operaˇcn´ıho syst´emu Linux. Pˇri v´ yvoji muselo b´ yt myˇsleno na omezen´ı, kter´a plynou z uˇz´ıvan´ı na mobiln´ıch zaˇr´ızen´ıch jako je hlavnˇe v´ ydrˇz baterie, menˇs´ı v´ ykon v porovn´an´ı s desktopov´ ymi syst´emy nebo m´enˇe pamˇeti. Android je vytvoˇren tak, aby mohl bˇeˇzet na r˚ uzn´ ych typech hardware.
2.2.1
Historie
Kr´atce bych zm´ınil historick´ y v´ yvoj, kter´ y vedl k souˇcasn´emu stavu syst´emu Android. Vˇse zaˇcalo zaloˇzen´ım Android Inc. v Palo Altu ve Spojen´ ych St´atech Americk´ ych v ˇr´ıjnu roku 2003. Spoleˇcnost byla zaloˇzena skupinou lid´ı, kteˇr´ı mˇeli zkuˇsenosti s komunikacemi a mobiln´ım zaˇr´ızen´ımi, a nˇejakou dobu vyv´ıjela t´emˇeˇr tajnˇe operaˇcn´ı syst´em na mobiln´ı platformy. V srpnu roku 2005 firmu plnˇe pˇrevzala spoleˇcnost Google Inc. a jej´ı zamˇestnanci se stali zamˇestnanci Googlu, kter´ y mˇel jiˇz v t´e dobˇe nejsp´ıˇse v u ´myslu vstoupit na trh s mobiln´ımi zaˇr´ızen´ımi. V listopadu 2007 byla vytvoˇrena Open Handset Alliance, veden´a Googlem, ale sdruˇzuj´ıc´ı 34 ˇclen˚ u[12], kteˇr´ı maj´ı nˇeco spoleˇcn´eho s v´ yvojem pro mobiln´ı zaˇr´ızen´ı (v´ yrobci zaˇr´ızen´ı, tv˚ urci software, v´ yrobci dalˇs´ıho hardware apod.). Vlajkovou lod´ı tohoto sdruˇzen´ı je Android[2].
2.2.2
Architektura syst´ emu Android
Android je pˇripraven hlavnˇe pro hardwarovou architekturu ARM, aˇckoliv existuj´ı i projekty pro pouˇzit´ı Androidu na x86. Pˇri dalˇs´ım popisu architektury bych se r´ad drˇzel pomˇernˇe zn´am´eho obr´azku (viz obr´azek 2.2) architektury syst´emu Android, jak je zveˇrejnˇena na jejich str´ank´ach [18]. J´adro operaˇcn´ıho syst´emu je naps´ano v C/C++, ale uˇzivatelsk´e i vestavˇen´e aplikace jsou ps´any v Javˇe.
Linuxov´ e j´ adro Syst´em je zaloˇzen linuxov´em j´adru. Oproti bˇeˇzn´emu Linuxu zde ovˇsem chyb´ı syst´em X Window, tak´e musely b´ yt upraveny nˇekter´e vlastnosti kv˚ uli ˇr´ızen´ı spotˇreby, kter´e je na mobiln´ıch zaˇr´ızen´ı naprosto kritick´e.
6
Platformy pro mobiln´ı zaˇr´ızen´ı
Android
Obr´azek 2.2: Architektura syst´emu Android4 Aplikace Souˇc´asti bal´ıku, ve kter´em je syst´em dod´av´an, je samozˇrejmˇe i mnoˇzstv´ı aplikac´ı. Tyto aplikace poskytuj´ı z´akladn´ı funkˇcnosti zaˇr´ızen´ı jako je psan´ı SMS zpr´av, spr´ava kontakt˚ u, dnes jiˇz asi nezbytn´ y webov´ y prohl´ıˇzeˇc apod. Tyto aplikace mohou b´ yt nahrazeny jin´ ymi aplikacemi ˇs´ıˇren´ ymi bud’ pˇres Google Play (dˇr´ıve Android market), nebo pˇr´ımo pˇres .apk soubory.
Aplikaˇ cn´ı framework K syst´emu Android je k dispozici Software Development Kit (zkr´acenˇe SDK). V´ yvoj´aˇri pro tvorbu sv´ ych aplikac´ı mohou vyuˇz´ıt prakticky neomezenˇe zdroje zaˇr´ızen´ı, kter´e jsou k dispozici prostˇrednictv´ım API. Aplikaˇcn´ı framework pr´avˇe toto API poskytuje. Pod prakticky kaˇzdou aplikac´ı na Android bˇeˇz´ı sada sluˇzeb a syst´em˚ u. Napˇr´ıklad bych zm´ınil syst´em View, kter´ y poskytuje uˇzivatelsk´e rozhran´ı. Tyto knihovny obsahuj´ı pomˇernˇe velk´e mnoˇzstv´ı 4
pˇrevzato z http://developer.android.com/ dne 18.4.2012
7
Platformy pro mobiln´ı zaˇr´ızen´ı
Android
r˚ uzn´ ych komponent grafick´eho uˇzivatelsk´eho prostˇred´ı (formul´aˇrov´e komponenty, seznamy, r˚ uzn´e layouty atd.).
Knihovny Android poskytuje sadu r˚ uzn´ ych knihoven, kter´e jsou psan´e v C/C++, a poskytuj´ı r˚ uzn´e dalˇs´ı moˇznosti pro v´ yvoj´aˇre Androidu jako jsou manipulace s r˚ uzn´ ymi m´edii, 2D a 3D grafika a datab´aze.
Android runtime Na obr´azku mal´a, avˇsak velmi podstatn´a souˇc´ast syst´emu. Pro chod aplikac´ı je zde pouˇzit Dalvik Virtual Machine. Dalvik Virtual Machine pouˇz´ıv´a registrovou architekturu na rozd´ıl od Java VM, kter´ y m´a z´asobn´ıkovou architekturu. Dalˇs´ı vlastnost´ı Dalvik VM je vyuˇz´ıv´an´ı Just-in-time compilation. Dalvik VM spouˇst´ı tzv. Dalvik Executable (tak´e dex-code nebo jen dex) soubory. DEX soubory lze vytvoˇrit z javovsk´ ych .class soubor˚ u, tedy z javovsk´eho bytecodu.
2.2.3
V´ yvoj aplikaci pro Android
Aplikace pro Android se vyv´ıj´ı v jazyce Java. Android je postaven tak, ˇze veˇsker´e aplikace (samozˇrejmˇe kromˇe j´adra) pouˇz´ıvaj´ı stejn´e API. To v praxi znamen´a, ˇze kaˇzd´ y v´ yvoj´aˇr m˚ uˇze vytv´aˇret aplikace, kter´e jsou stejnˇe dobr´e, rozs´ahl´e, popˇr. mocn´e jako jsou vestavˇen´e aplikace. To je jedna z opravdu velk´ ych pˇrednost´ı Androidu. Pro u ´ˇcely v´ yvoje je moˇzn´e (a nutn´e) st´ahnout SDK ze str´anek An5 droid . SDK obsahuje z´akladn´ı n´astroje pro v´ yvoj jako je napˇr´ıklad emul´ator a n´astroje pro jeho spr´avu. K v´ yvoji je samozˇrejmˇe nutn´e m´ıt nainstalov´ano Java JDK, pro pˇreklad zdrojov´ ych k´od˚ u. V´ yrobce doporuˇcuje 6 pouˇz´ıvat Eclipse IDE , pro kter´ y je k dispozici plugin, kter´ y umoˇzn ˇuje v´ yvoj aplikac´ı na Android pˇr´ımo v IDE. 5 6
http://developer.android.com http://www.eclipse.org/
8
Platformy pro mobiln´ı zaˇr´ızen´ı
Android
Publikace aplikac´ı Ve chv´ıli, kdy program´ator dokonˇc´ı aplikaci, nebo i dˇr´ıve, se zaˇcne zaj´ımat o to, jak svoji aplikaci publikovat. Zde se nab´ız´ı nˇekolik moˇznost´ı: ˇıˇrit pouze apk soubor • S´ V´ yslednou aplikaci je moˇzn´e exportovat do apk archivu, kter´ y, kdyˇz se pˇrenese na zaˇr´ızen´ı, je jednoduˇse nainstalovateln´ y. • D´at aplikaci volnˇe k dispozici na Google Play (dˇr´ıve Android Market) V´ yslednou aplikaci je moˇzn´e d´at k dispozici na Google Play, coˇz je obdoba AppStore spoleˇcnosti Apple pro iOS. Instalace je potom pro uˇzivatele jednoduˇsˇs´ı, aplikaci si jednoduˇse najde, zm´aˇckne nainstalovat a o v´ıce se nemus´ı starat (Google Play potom hl´ıd´a i pˇr´ıpadnou dostupnost aktualizac´ı). • Prod´avat aplikace na Google Play (dˇr´ıve Android Market) Aplikace m˚ uˇze b´ yt na Google Play zpoplatnˇena. Princip je u ´plnˇe stejn´ y jako v minul´em bodˇe, zmiˇ nuji ho jenom kv˚ uli jedn´e pozn´amce. U n´as ˇ byla podpora prod´av´an´ı na Google Play slab´a, skoro ˇz´adn´a (nˇekv CR ter´e spoleˇcnosti to obch´azely napˇr´ıklad t´ım, ˇze si zakl´adaly u ´ˇcty napˇr´ıklad v sousedn´ım Nˇemecku). Dnes uˇz je zaveden´a pln´a podpora v´ yvoj´aˇr˚ u, takˇze s prodejem aplikac´ı nen´ı ˇz´adn´ y vˇetˇs´ı probl´em.
Z´ akladn´ı prvky aplikac´ı na Android Kaˇzd´a aplikace na Android obsahuje (pouˇz´ıv´a) urˇcit´e prvky (lze ˇr´ıci, ˇze kaˇzd´a aplikace pouˇz´ıv´a alespoˇ n jeden z tˇechto objekt˚ u). • Intent Dalo by se ˇr´ıci, ˇze kaˇzd´a aplikace vyuˇz´ıv´a principu Intent˚ u. Intent (angl. z´amˇer nebo u ´mysl) se pouˇz´ıv´a, pokud chceme v aplikaci napˇr´ıklad nˇeco otevˇr´ıt. Intent je vlastnˇe model ud´alosti, na kterou syst´em reaguje. Intenty lze dˇelit v z´asadˇe do dvou skupin: – Implicitn´ı Zde je zn´am u ´ˇcel operace (napˇr´ıklad v´ ybˇer kontaktu v telefonu). Vyhodnocen´ı a v´ ybˇer aplikace zajiˇst’uje syst´em s´am. 9
Platformy pro mobiln´ı zaˇr´ızen´ı
Android
– Explicitn´ı V tomto pˇr´ıpadˇe zn´am pˇresnˇe aktivitu (tˇr´ıdu), kter´a m´a na Intent reagovat. Tud´ıˇz vyhodnocen´ı se pˇresouv´a od syst´emu k program´atorovi. Pokud se zmiˇ nujeme o Intentech, nem˚ uˇzeme se nezm´ınit o Intent filtrech. Tyto filtry mohou jist´ ym zp˚ usobem rozˇsiˇrovat funkˇcnost syst´emu. ˇ ık´a vlastnˇe syst´emu, ˇze je tu nˇeco, co m˚ R´ uˇze vyuˇz´ıt k zpracov´an´ı Intentu. K rozˇsiˇrov´an´ı syst´emu by se, ale mˇelo pˇristupovat opatrnˇe ([1]). • Activity Tˇr´ıda Activity je jednou ze z´akladn´ıch tˇr´ıd obsaˇzen´a v Runtime. Kaˇzd´a aplikace, kter´a m´a UI, mus´ı m´ıt i alespoˇ n jednu aktivitu. Aktivitu lze velmi ˇcasto ch´apat jako jednu obrazovku na zaˇr´ızen´ı, ale je moˇzn´e je vyuˇz´ıt i jinak. Vˇsechny komponenty UI jsou potomky tˇr´ıdy View. Activity je spouˇstˇena pomoc´ı Intentu pˇr´ıkazem startActivity(Intent). Kaˇzd´a Activita m´a sv˚ uj ˇzivotn´ı cyklus, kter´ y je dobˇre vidˇet na obr´azku 2.3. Z obr´azku lze vidˇet, ˇze aplikace m˚ uˇze b´ yt kdykoliv zastavena syst´emem, pokud usoud´ı, ˇze potˇrebuje jej´ı prostˇredky. Je zde jasn´a hierarchie aplikac´ı, jak budou zav´ır´any: – Nejd˚ uleˇzitˇejˇs´ı jsou aktivity, kter´e uˇzivatel pˇr´ımo pouˇz´ıv´a, tzn. jsou zobrazeny – Dalˇs´ı jsou aktivity, kter´e jsou jen vidˇet (napˇr´ıklad jsou vidˇet aktivity, kter´e jsou pod mod´aln´ım dialogov´ ym oknem). – Pak n´asleduj´ı ostatn´ı. • Service V mnoh´em je podobn´a activity, ale vˇetˇsinou bˇeˇz´ı na pozad´ı, vykon´av´a bud’ nˇejakou periodickou nebo jednor´azovou ˇcinnost, kter´a je ˇcasovˇe n´aroˇcn´a. Spouˇst´ı se podobnˇe jako Activity pomoc´ı Intentu. Hlavn´ı rozd´ıl oproti Activity je, ˇze nem´a UI. • Broadcast receiver Podobnˇe jako service nem´a UI. Funguje jako pˇr´ıjemce ud´alost´ı v syst´emu. Pouˇzijeme ho napˇr´ıklad, pokud bychom si chtˇeli napsat vlastn´ıho SMS klienta. Po registraci nen´ı nutn´e, aby aplikace bˇeˇzela. Aplikace reaguje na podnˇety ze syst´emu (pro zaregistrov´an´ı do syst´emu se pouˇz´ıv´a v´ yˇse zm´ınˇen´ y Intent filter). Hlavn´ı metodou t´eto tˇr´ıdy je onReceive, vˇetˇsinou neobsahuje rozs´ahl´ y k´od. 10
Platformy pro mobiln´ı zaˇr´ızen´ı
Android
ˇ Obr´azek 2.3: Zivotn´ ı cyklus aktivity7 • Content provider Pouˇz´ıv´a se hlavnˇe, pokud je potˇreba sd´ılet data aplikace s jin´ ymi aplikacemi na zaˇr´ızen´ı. Content provider m˚ uˇze poskytovat data jak Activity, tak i Service. Sd´ılen´ı dat pˇr´ımo pomoc´ı souborov´eho syst´emu se nedoporuˇcuje, aplikace vyˇzaduje povolen´ı na pˇr´ıstup k souborov´emu syst´emu a i tak m˚ uˇze b´ yt pˇr´ıstup kv˚ uli bezpeˇcnosti syst´emem omezen. Content provider m˚ uˇze poskytovat velk´e mnoˇzstv´ı r˚ uzn´ ych typ˚ u dat soubory, datab´aze. . .
7
pˇrevzato 26.4.2012 z http://developer.android.com/images/activity lifecycle.png
11
Platformy pro mobiln´ı zaˇr´ızen´ı
Android
• AndroidManifest Manifest nen´ı v prav´em slova smyslu komponentou aplikace, ale je jej´ı ned´ılnou souˇc´ast´ı. Po tom, co jsme si pˇredstavili z´akladn´ı stavebn´ı prvky aplikace, pˇrich´az´ı na ˇradu nˇeco, co je spoj´ı dohromady, a t´ım je AndroidManifest.xml. Moˇznost´ı, co lze d´at do manifestu je mnoho, ale potˇreby t´eto pr´ace ho jen kr´atce pˇredstav´ım. Z´akladn´ı informac´ı obsaˇzenou v manifestu je n´azev aplikace. D´ale pak mus´ı obsahovat vˇsechny activity (pokud m´a aplikace UI) s jejich popisem - jm´eno, tˇr´ıda, d´ale pak popis dalˇs´ıch dˇr´ıve zm´ınˇen´ ych z´akladn´ıch prvk˚ u aplikace. Dalˇs´ı velmi d˚ uleˇzitou ˇc´ast´ı jsou pouˇzit´e knihovny, samozˇrejmˇe velmi ˇcasto nen´ı nutn´e zmiˇ novat v˚ ubec nic, protoˇze z´akladn´ı knihovny Androidu se nemus´ı uv´adˇet (pokud chceme napˇr´ıklad pouˇz´ıt Google Maps, je to jiˇz nutn´e).
2.2.4
Komunikace zaˇ r´ızen´ı s Android
Zaˇr´ızen´ı s Androidem muˇze komunikovat mnoha zp˚ usoby (Bluetooth, NFC - Near Field Communication, Wi-Fi). D´ıky tomu, ˇze zaˇr´ızen´ı umˇej´ı pouˇz´ıvat Wi-Fi, tak lze komunikovat pˇres libovoln´ y protokol. Pro u ´ˇcely t´eto pr´ace se budu zab´ yvat komunikac´ı zaˇr´ızen´ı se serverem pˇres HTTP.
Komunikace Android zaˇ r´ızen´ı se serverem pˇ res HTTP Zaˇr´ızen´ı s Androidem samozˇrejmˇe mohou komunikovat s vnˇejˇs´ım prostˇred´ım. Pro komunikaci je moˇzn´e pouˇz´ıt pˇr´ımo sockety a komunikaci si ˇr´ıdit od zaˇc´atku nebo je moˇzn´e pro komunikaci pˇres HTTP pouˇz´ıt pˇr´ımo bal´ık rozhran´ı a tˇr´ıd org.apache.http. Komunikace pˇres sockety je pˇr´ıliˇs obecn´a, proto se nyn´ı budu kr´atce zab´ yvat komunikac´ı pomoc´ı bal´ıku org.apache.http. N´asleduj´ıc´ı pˇr´ıklady jsou zaloˇzen´e na pˇr´ıkladech ze serveru w3cmentor.com. Odkazy: • http://w3mentor.com/learn/java/android-development/ android-httpservices/example-of-http-get-request-using-httpclient-in-android/ • http://w3mentor.com/learn/java/android-development/ android-httpservices/performa-a-http-post-request-with-the-httpclient-in-android/
12
Platformy pro mobiln´ı zaˇr´ızen´ı
Windows Phone 7
Aby jak´akoliv komunikace, at’ uˇz pˇres sockety nebo pomoc´ı HTTP fungovala, je nutn´e nastavit aplikaci spr´avn´e opr´avnˇen´ı. V tomto pˇr´ıpadˇe opr´avnˇen´ı k pˇr´ıstupu na internet. To znamen´a pˇridat do AndroidManifest.xml: <uses-permission android:name="android.permission.INTERNET" />
2.3
Windows Phone 7
. Windows Phone 7 byl vyvinut spoleˇcnost´ı Microsoft jako n´astupce Windows Mobile (b´ yval´ ych Windows CE). Narozd´ıl od sv´eho pˇredch˚ udce je postaven u ´plnˇe jinak. Zat´ımco Windows Mobile byl vyvinut mimo jin´e pro pouˇzit´ı v n´aroˇcn´ ych podm´ınk´ach, jako jsou r˚ uzn´e tov´arny a podobnˇe. Windows Phone 7 byl vyvinut s velk´ ym d˚ urazem na uˇzivatelsk´e pohodl´ı. Windows Phone 7 pouˇz´ıv´a grafick´e uˇzivatelsk´e prostˇred´ı pojmenovan´e Metro UI (viz [10]). Metro se zamˇeˇruje na jednoduchost pro uˇzivatele. Metro m´a uˇzivateli poskytovat jednotn´ y pˇr´ıstup pro podobn´e ˇcinnosti. Zaj´ımav´ y je tak´e syst´em tzv. HUB˚ u (hub lze do ˇceˇstiny pˇreloˇzit jako uzlov´ y bod). Pˇr´ıklad pouˇzit´ı HUBu je komunikace s nˇek´ ym dalˇs´ım, HUB umoˇzn ˇuje m´ıt veˇskerou komunikaci r˚ uzn´ ymi zp˚ usoby (e-mail, SMS, Facebook atd.) na jednom m´ıstˇe. Podobnˇe lze z´ıskat napˇr´ıklad komunikaci, kter´a probˇehla pˇred delˇs´ı dobou. Veˇsker´a data na platformˇe Windows Phone 7 se synchronizuj´ı na cloudu(viz [9]). Uˇzivatel se tedy nemus´ı ob´avat ztr´aty dat (aˇckoliv si um´ım pˇredstavit, ˇze pr´avˇe synchronizace m˚ uˇze b´ yt, zvl´aˇst’ za podm´ınek mobiln´ıho internetu u n´as, probl´emem, pokud uˇzivatel nem˚ uˇze pˇristupovat napˇr´ıklad pˇres Wi-Fi).
2.3.1
V´ yvoj pod platformou Windows Phone 7
V´ yvoj pro Windows Phone 7 je pod platformou .NET, tedy v jazyce C#. Zaˇr´ızen´ı pouˇz´ıvaj´ıc´ı Windows Phone 7 maj´ı unifikovan´ y hardware, jsou tedy urˇceny podm´ınky, co mus´ı zaˇr´ızen´ı m´ıt (napˇr´ıklad CPU ARMv7 Cortex/Scorpion nebo novˇejˇs´ı, akcelerometr. . . ). V souˇcasn´e dobˇe existuje pouze jeden standard, v bl´ızk´e dobˇe maj´ı vzniknout dva dalˇs´ı - pro low-endov´e zaˇr´ızen´ı a pro zaˇr´ızen´ı splˇ nuj´ıc´ı HD([21]). 13
Platformy pro mobiln´ı zaˇr´ızen´ı
Windows Phone 7
Pro v´ yvoj je k dispozici SDK, kter´e spolupracuje s Microsoft Visual Studiem. Pro v´ yvoj lze vyuˇz´ıt dva frameworky: • Silverlight Framework p˚ uvodnˇe urˇcen´ y pro v´ yvoj webov´ ych aplikac´ı. V kontextu v´ yvoje na mobiln´ıch zaˇr´ızen´ıch se hod´ı prakticky pro vˇsechny aplikace, kter´e nepouˇz´ıvaj´ı graficky n´aroˇcn´e operace (napˇr´ıklad hern´ı aplikace nebo aplikace, kter´e r˚ uznˇe manipuluj´ı s obr´azky, napˇr´ıklad fotky - jejich ot´aˇcen´ı a jin´e transformace). • XNA XNA je platforma urˇcen´a pro snadn´ y v´ yvoj her. Je vˇsak moˇzn´e ji i vyuˇz´ıt i pro jin´e u ´ˇcely. Mobiln´ı aplikace nemus´ı b´ yt nutnˇe vyv´ıjen´a jen pomoc´ı jednoho z framework˚ u. Je moˇzn´e je kombinovat. Napˇr´ıklad programov´a nab´ıdka (menu) se dˇel´a mnohem sn´aze s pod Silverlightem, na druhou stranu na zobrazen´ı a manipulace s 3D objekty je mnohem vhodnˇejˇs´ı XNA ([21]). Vyv´ıj´ı se obvykle proti emul´atoru, kter´ y je celkem dobˇre vybaven´ y, um´ı emulovat GPS polohu, akcelerometr, dokonce urˇcit´ ym zp˚ usobem i fotoapar´at.
2.3.2
Publikace aplikac´ı
Podobnˇe jako Apple (AppStore) nebo Google (Google Play) m´a i Microsoft pro svou platformu m´ısto, kde se d´a aplikace zveˇrejnit - Windows Phone Marketplace. Aplikace se publikuje ve formˇe tzv. XAP soubor˚ u. Lze publikovat ˇ plnˇe nˇekolika zp˚ usoby z pohledu ceny - zadarmo nebo za poplatek (v CR podporov´ano), m˚ uˇze b´ yt k dispozici trial verze. Aplikace m˚ uˇze b´ yt pˇr´ıstupn´a jen v nˇekter´ ych zem´ıch nebo jen nˇekter´ ym uˇzivatel˚ um. Po nahr´an´ı aplikace na Marketplace mus´ı b´ yt aplikace nejdˇr´ıve certifikov´ana z technick´eho hlediska (jestli je bezpeˇcn´a, jestli dodrˇzuje z´akladn´ı ide´aly syst´emu) a z hlediska obsahu (neobsahuje-li z´avadn´e materi´aly. . . ). Certifikace aplikace (SLA - Service-level Agreement) trv´a 5 dn˚ u ([21]). Aplikace je podobnˇe jako u Androidu rozdˇelen´a na r˚ uzn´e obrazovky. Lze na nˇe pohl´ıˇzet jako na webov´e str´anky, maj´ı svoji URL. Je moˇzn´e mezi nimi 14
Platformy pro mobiln´ı zaˇr´ızen´ı
Windows Phone 7
navigovat (jsou tu ud´alost´ı jako OnNavigateTo nebo OnNavigateFrom). Syst´em Windows Phone 7 nem´a pˇr´ımo multitasking (z uˇzivatelsk´eho hlediska ano, ale z hlediska v´ yvoj´aˇre ne). Pro ilustraci bych r´ad uvedl stavov´ y diagram aplikace na Windows Phone 7 (obr´azek 2.4). Deactivated Executing
Dormant
Tombstoned
Fast resume
Slow resume
Closing
Closing Closed
ˇ Obr´azek 2.4: Zivotn´ ı cyklus aplikace na Windows Phone 7 - [21]
15
3 OSGi OSGi je platforma (framework) pro modularizaci aplikac´ı a zjednoduˇsen´eho pouˇzit´ı r˚ uzn´ ych sluˇzeb. OSGi je urˇceno pro programovac´ı jazyk Java. Je zamˇeˇreno na spolupr´aci, nahraditelnost a znovupouˇzitelnost jednotliv´ ych ˇc´ast´ı aplikac´ı. OSGi samo o sobˇe je pouze specifikace, jak´ ysi n´astin toho, jak m´a b´ yt framework implementov´an (aˇckoliv zde je nutn´e podotknout, ˇze nˇekter´e ˇc´asti specifikace OSGi jsou pops´any velmi podrobnˇe). Kaˇzd´a z implementac´ı mus´ı plnˇe dodrˇzovat stanoven´e API. Existuje nˇekolik r˚ uzn´ ych implementac´ı OSGi, asi nejzn´amˇejˇs´ı jsou dva: Apache Felix a Equinox (na Equinoxu bˇeˇz´ı napˇr´ıklad zn´am´ y programovac´ı n´astroj Eclipse). Pod OSGi jsou aplikace rozdˇelen´e do tzv. bundl˚ u. Tyto bundly mohou b´ yt (i vzd´alenˇe) instalov´any, spouˇstˇeny, aktualizov´any nebo odinstalov´av´any bez potˇreby restartu cel´eho frameworku. Pro u ´ˇcely t´eto pr´ace jsem se rozhodl pouˇz´ıvat Apache Felix. D˚ uvod je velmi snadn´ y. Zat´ımco pro serverovou ˇc´ast aplikace by se dal pouˇz´ıt Equinox, na mobiln´ım zaˇr´ızen´ı zat´ım nev´ım, ˇze by bylo moˇzn´e Equinox spustit.
3.1
Bundle
Bundle je z´akladn´ı stavebn´ı jednotkou kaˇzd´e OSGi aplikace. Jako takov´ y lze definovat bundle jako skupinu Java tˇr´ıd, zpravidla zaˇrazen´ ych do nˇekolika bal´ık˚ u (package) a r˚ uzn´ ych zdroj˚ u (ikony, obr´azky. . . ). Kaˇzd´ y bundle je zabalen do .jar archivu, kter´ y jeˇstˇe mus´ı obsahovat tzv. manifest. Manifest je uloˇzen v koˇrenov´em adres´aˇri v archivu jako soubor MANIFEST.MF, popisuje vlastnosti bundlu jako je n´azev, symbolick´e jm´eno nebo m˚ uˇze obsahovat ´ poskytovan´e bal´ıky a sluˇzby. Uˇcelem t´eto pr´ace nen´ı detailnˇe rozebrat, co vˇsechno m˚ uˇze manifest obsahovat. Zde je uk´azka jak m˚ uˇze vypadat manifest: Bundle-Name: Hello World Bundle-SymbolicName: cz.zcu.kiv.zaruba Bundle-Description: A Hello World bundle Bundle-ManifestVersion: 2 16
OSGi
Bundle
Bundle-Version: 1.0.0 Bundle-Activator: cz.zcu.kiv.zaruba.Activator Export-Package: cz.zcu.kiv.zaruba.libraries;version="1.1.1" Import-Package: cz.zcu.kiv.zaruba.runtime;version="2.2.2" Bundly mohou vyˇzadovat pro sv˚ uj chod r˚ uzn´e bal´ıky (package), pak jsou uveden´e v manifestu jako Import-Package. Nebo naopak mohou poskytovat nˇejak´e svoje bal´ıky pro ostatn´ı bundly. T´ım logicky m˚ uˇze vzniknout i pomˇernˇe sloˇzit´ y graf z´avislost´ı, kter´ y ovˇsem dvˇe nejpouˇz´ıvanˇejˇs´ı implementace tedy Apache Felix a Equinox nijak neˇreˇs´ı. Vˇsechny bundly (kromˇe tˇech, kter´e funguj´ı jako ryze knihovn´ı) maj´ı sv˚ uj Activator, coˇz je tˇr´ıda, kter´a implementuje rozhran´ı BundleActivator a slouˇz´ı k nastartov´an´ı bundlu ve frameworku. Vˇetˇsinou obsahuje inicializaci bundlu, nastaven´ı jeho promˇenn´ ych, vytvoˇren´ı tˇr´ıd, nav´az´an´ı sluˇzeb, pˇr´ıpadnˇe zaregistrov´an´ı sv´ ych sluˇzeb do frameworku pro jin´e bundly. V Activatoru je tak´e metoda, kter´a umoˇzn ˇuje proveden´ı operac´ı pˇri skonˇcen´ı ˇzivota bundlu. T´ım se dost´av´ame k ˇzivotn´ımu cyklu bundlu, kter´ ym se budu lehce zab´ yvat d´ale. Zde bych r´ad uk´azal velmi jednoduch´ y Activator: package cz.zcu.kiv.zaruba; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; public class Activator implements BundleActivator { private BundleContext context; public void start(BundleContext context) throws Exception { // inicializace this.context = context; } public void stop(BundleContext context) throws Exception { // inicializace this.context = null; } }
17
OSGi
3.1.1
Bundle
ˇ Zivotn´ ı cyklus bundlu
Pˇri popisu OSGi se nelze nezm´ınit o ˇzivotn´ım cyklu bundlu. Bundle m˚ uˇze b´ yt v r˚ uzn´ ych stavech. Pokud ho nainstaluji do frameworku, pak m´a stav INSTALLED. Po instalaci mohu cht´ıt bundle spustit, potom pˇrech´az´ı do stavu STARTING, ze kter´eho po skonˇcen´ı metody start pˇrech´az´ı do stavu ACTIVE. Podobn´e to je pˇri zastavov´an´ı bundlu, kde nejdˇr´ıv pˇrejde do stavu STOPPING a d´ale do stavu RESOLVED. Stav RESOLVED je jeˇstˇe zvl´aˇstn´ı t´ım, ˇze do nˇej pˇrech´az´ı okamˇzitˇe bundle, kter´ y nem´a Activator. RESOLVED je stav, kdy framework (jeho resolver) jiˇz zanalyzoval jeho obsah a je pˇripraven´ y ho pouˇz´ıt. Posledn´ı stav, kter´ y m˚ uˇze bundle m´ıt je UNINSTALLED.
3.1.2
Sluˇ zby v OSGi
Jednotliv´e bundly mohou r˚ uznˇe vyuˇz´ıvat nebo poskytovat sluˇzby. Je to jeden ze z´akladn´ıch princip˚ u, jak mohou bundly mezi sebou komunikovat. Frameworku s´am (resp. jeho implementace) poskytuje sluˇzby. Jako pˇr´ıklad bych uvedl logging service, configuration admin service apod. Kaˇzd´a sluˇzba by mˇela implementovat nˇejak´e rozhran´ı. Toto rozhran´ı je pak vyhled´av´ano pomoc´ı resolveru frameworku. Pro ilustraci bych r´ad uvedl zp˚ usob, jak lze sluˇzby na bundle nav´azat a jak lze sluˇzbu ve frameworku poskytovat. Z´ıskat sluˇzbu z frameworku lze nˇekolika zp˚ usoby, j´a bych tu r´ad zm´ınil dva z´akladn´ı. Prvn´ı z nich pˇr´ım´e z´ısk´an´ı reference sluˇzby[7]: ServiceReference[] refs = m_context.getServiceReferences( DictionaryService.class.getName(),~"(Language=*)"); Object service = m_context.getService(refs[i]); Ve v´ yˇse uveden´em k´odu je naznaˇceno, ˇze hled´am sluˇzbu, kter´a poskytuje rozhran´ı DictonaryService a nav´ıc je zaregistrov´ana s vlastnost´ı Language= jak´ykoliv ˇretˇezec. K tomuto zp˚ usobu je ale nutn´e dodat, ˇze je celkem hrub´ y a ne moc spolehliv´ y. Kamenem u ´razu je, ˇze pokud nen´ı sluˇzba k dispozici ve chv´ıli, kdy ji popt´av´am, tak ji nedostanu, coˇz vˇetˇsinou nen´ı pˇr´ıliˇs ˇz´adouc´ı. Druh´ y zp˚ usob, kter´ y jsem chtˇel zm´ınit, je pouˇzit´ı tzv. ServiceTrackeru. ServiceTracker je mechanizmus, kter´ ym d´ame najevo frameworku, ˇze m´ame 18
OSGi
OSGi Enterprise
z´ajem o danou sluˇzbu. Jakmile je k dispozici spust´ı se metoda, ve kter´e m˚ uˇzeme na tuto ud´alost reagovat. Vˇetˇsinou n´am staˇc´ı si pouze uloˇzit referenci na sluˇzbu.
3.2
OSGi Enterprise
Pojem OSGi Enterprise je v nˇekolika ohledech tˇeˇzko uchopiteln´ y. Takovou aplikaci, kter´a je zaloˇzen´a na principech OSGi a poskytuje urˇcit´e obchodn´ı“ ” moˇznosti, lze povaˇzovat za OSGi Enterprise. Ovˇsem pro potˇreby t´eto pr´ace bych se radˇsi pˇriklonil k definici zm´ınˇen´e Cumminsem a Wardem v [6]. Tedy, ˇze Enterprise OSGi aplikace je aplikace zaloˇzen´a na OSGi, kter´a poskytuje jednu z enterprise sluˇzeb, popsanou ve specifikaci OSGi Service Platform Enterprise Specification(viz [14]), kter´a poskytuje obchodn´ı“ sluˇzby a hod” noty. ˇ Standardn´ı specifikace je zamˇeˇrena sp´ıˇse na embedded syst´emy. Casem zaˇcalo b´ yt jasn´e, ˇze OSGi mus´ı b´ yt pruˇznˇejˇs´ı, a proto vznikla specifikace pro Enterprise. Enterprise specifikace je sadou r˚ uzn´ ych sluˇzeb. • Component Models – Declarative Services Specification – Blueprint Container Specification • Distributed Services – Remote Services – Remote Service Admin Specification – SCA Configuration Type • Web Applications and HTTP Servlets – Web Application Specification – Http Service Specification • Event models – Event Admin Service Specification 19
OSGi
OSGi Enterprise
• Management and Configuration services – JMXTM Management Model Specification – User Admin Service Specification – Initial Provisioning Specification – Configuration Admin Service Specification – Metatype Service Specification • Naming and Directory services – JNDI Services Specification • Database Access – JDBCTM Service Specification – JPA Service Specification • Transaction Support – JTA Transaction Services Specification • Miscellaneous Supporting Services – Log Service Specification – XML Parser Service Specification – Tracker Specification Z pˇrehledu lze vidˇet, ˇze sluˇzby jsou ˇrazeny do kategori´ı. Nebudu zde popisovat vˇsechny kategorie. Zm´ın´ım jen kr´atce dvˇe, kter´e se dot´ ykaly t´eto pr´ace: Web application and HTTP Servlets a Database Access. Web application and HTTP Servlets - poskytuje moˇznosti ps´at aplikaci do servlet˚ u, kter´e je pak moˇzn´e registrovat. D´ale poskytuje obecnˇe komunikaci pomoc´ı HTTP, HTML, XML. Database Access - poskytuje moˇznosti komunikace s datab´azemi. A to dvˇema z´akladn´ımi moˇznostmi: JDBC a JPA. Implementac´ı OSGi Enterprise je cel´a ˇrada. Ve sv´e pr´aci jsem zvaˇzoval dvˇe: 20
OSGi
OSGi Enterprise
• Eclipse Gemini • Apache Aries Pro u ´ˇcely t´eto pr´ace jsem se rozhodl pouˇz´ıvat projekt Eclipse Gemini ([8]). D˚ uvod byl jednoduch´ y. Tento projekt poskytuje funkˇcnost, kterou aplikace potˇrebovala a z´aroveˇ n je pomˇernˇe jednoduch´ y na pouˇzit´ı (lze pouˇz´ıt jen nˇekter´e jeho ˇc´asti). Pˇri v´ ybˇeru frameworku jsem jeˇstˇe zvaˇzoval pouˇz´ıt projekt Apache Aries ([3]), kter´ y se mi ovˇsem nepodaˇrilo zprovoznit (framework m´a b´ yt nejsp´ıˇse spouˇstˇen jako celek, coˇz se nepodaˇrilo, nebo se mi nepodaˇrilo zjistit jak extrahovat jen nˇekter´e jeho ˇc´asti). Protoˇze c´ılem m´e pr´ace nebylo porovnat nebo vyzkouˇset v´ıce Enterprise framework˚ u, rozhodl jsem po zprovoznˇen´ı Eclipse Gemini, ˇze se t´ım jiˇz d´ale nebudu zab´ yvat.
3.2.1
Vyuˇ zit´ı webov´ e sluˇ zby frameworku vs. framework embedded na serveru
V r´amci OSGi bˇeˇzet i servletov´ y kontejner. T´ım se nab´ız´ı dvˇe moˇznosti, jak m˚ uˇzeme pˇr´ıpadnou servletovou OSGi aplikaci koncipovat: • Servletov´ y kontejner m˚ uˇze bˇeˇzet v r´amci frameworku • Dalˇs´ı moˇznost´ı je spustit framework (embedded) v servletov´em kontejneru
Samostatn´ y framework na serveru Framework m˚ uˇze b´ yt spuˇstˇen samostatnˇe a pak v nˇem mohou b´ yt spuˇstˇeny bundly, kter´e zajist´ı komunikaci. Apache Felix implementuje HTTP Service z definice OSGi bal´ıkem org.apache.felix.http.jetty, kter´ y zajiˇst’uje implementaci servletov´eho kontejneru. Instalace Jetty pod Felixem je velmi snadn´a. Jsou dvˇe cesty, jak Jetty nainstalovat. Jednou z nich je staˇzen´ı pˇr´ısluˇsn´eho jar ze str´anek Apache Felix, druhou moˇznost´ı je staˇzen´ı pˇr´ımo ve spuˇstˇen´em frameworku z Bundle repository pomoc´ı pˇr´ıkazu obr (v tomto pˇr´ıpadˇe obr:deploy ”Apache Felix HTTP Service Jetty”). Je d˚ uleˇzit´e, aby v´ yraz v uvozovk´ach byl pˇresn´ y. 21
OSGi
OSGi Enterprise
Pro z´ısk´an´ı seznamu dostupn´ ych bundl˚ u lze pouˇz´ıt pˇr´ıkaz obr:list. Nastaven´ı reposit´aˇre vˇetˇsinou b´ yv´a v adres´aˇri conf/config.properties, kde na konci souboru najdeme: obr.repository.url=http://felix.apache.org/obr/releases.xml Pokud jsme tedy nainstalovali Jetty (framework z´aroveˇ n mohl nainstalovat bundly, na kter´ ych je Jetty z´avisl´ y), je na ˇcase tento bundle (bundly) spustit. Je moˇzn´e, ˇze pˇri spuˇstˇen´ı se operaˇcn´ı syst´em zept´a na opr´avnˇen´ı ke spuˇstˇen´ı (testov´ano pod Windows 7). Standardnˇe je pak Jetty pˇr´ıstupn´ y na adrese localhost:8080.
Konfigurace Jetty Konfigurace HTTP Service m˚ uˇze b´ yt provedena nˇekolika zp˚ usoby. Pro z´akladn´ı konfiguraci lze vyuˇz´ıt pˇr´ımo v´ yˇse zm´ınˇen´e properties frameworku (standardnˇe conf/config.properties). Zde lze nastavit napˇr´ıklad port, na kter´em Jetty bˇeˇz´ı: org.osgi.service.http.port=8888 Dalˇs´ı moˇznost´ı je pouˇzit´ı Config Admin Service. Touto moˇznost´ı se budu v´ıce zab´ yvat v kapitole o Web Console. Seznam moˇzn´ ych parametr˚ u Jetty 1 lze naj´ıt na str´ank´ach Apache Felix .
Vytvoˇ ren´ı bundlu se servletem Pro vytvoˇren´ı bundlu se servletem je moˇzn´e vyuˇz´ıt maven-bundle-plugin. Z´avislosti a pˇribalen´e knihovny potom staˇc´ı nastavit v pom.xml projektu a plugin zajist´ı zbytek (vytvoˇren´ı manifestu, zabalen´ı do jar. . . ). V tomto pˇr´ıpadˇe byly potˇreba tyto z´avislosti: <dependency>
org.apache.felix <artifactId>org.osgi.core
1.0.0 1
http://felix.apache.org/site/apache-felix-http-service.html#ApacheFelixHTTPServiceConfigurationProperties
22
OSGi
OSGi Enterprise
<dependency>
org.apache.felix <artifactId>org.apache.felix.framework
1.0.0 <dependency>
org.apache.felix <artifactId>org.apache.felix.http.bundle
2.0.4 <dependency>
javax.persistence <artifactId>persistence-api
1.0 A tato konfigurace maven-bundle-plugin:
org.apache.felix <artifactId>maven-bundle-plugin <extensions>true cz.zcu.kiv.zaruba.* <Bundle-Activator> cz.zcu.kiv.zaruba.activator.Activator Zde je konfigurace velmi jednoduch´a. Pomoc´ı tohoto pluginu, lze nastavit v´ıce, napˇr´ıklad lze nastavit, kter´e package se budou exportovat, kter´e se budou importovat, pˇr´ıpadnˇe kter´e se vloˇz´ı do bundlu pˇr´ımo jako knihovna. Samotn´a tˇr´ıda servletu nen´ı niˇc´ım zaj´ımav´a. Je to standardn´ı tˇr´ıda dˇed´ıc´ı od tˇr´ıdy HttpServlet. Pˇr´ıklad: public class HelloWorld extends HttpServlet { 23
OSGi
OSGi Enterprise
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/plain"); resp.getWriter().write("Hello World"); } } Pokud m´ame nastaven´e pom.xml a vytvoˇren´ y servlet, pak lze pˇrikroˇcit pˇr´ımo k vytvoˇren´ı tˇr´ıdy Activator tˇr´ıdy servletu. Ve tˇr´ıdˇe Activator zaregistrujeme servlet k HTTP Service frameworku. Pˇr´ıklad: public final class Activator implements BundleActivator { private ServiceTracker tracker; private HttpServlet servlet = new HelloWorld(); public void start(BundleContext context) throws Exception { this.tracker = new ServiceTracker(context, ExtHttpService.class.getName(),~null) { @Override public Object addingService(ServiceReference ref) { Object service = super.addingService(ref); try { // You can map the servlet to any context. This will // actually map it to all requests. ((HttpService) service).registerServlet("/hello", servlet, null, null); } catch (Exception e) { e.printStackTrace(); } return service; } @Override public void removedService(ServiceReference ref, Object service) { ((ExtHttpService) service).unregisterServlet(servlet); super.removedService(ref, service); 24
OSGi
OSGi Enterprise
} }; this.tracker.open(); } public void stop(BundleContext context) throws Exception { this.tracker.close(); } } V uveden´em k´odu jsme z´ıskali pomoc´ı ServiceTrackeru HTTP Service, zaregistrovali a namapovali servlet HelloWorld na adresu /hello. V pˇr´ıpadˇe, ˇze pouˇz´ıv´ame samostatn´ y Felix, bude standardnˇe dostupn´ y na adrese http://localhost:8080/ hello. Pokud pouˇz´ıv´ame sv˚ uj servletov´ y kontejner, potom ho najdeme na adrese: adresa kontejneru/nazev aplikace/hello. Jestliˇze pouˇz´ıv´ame sv˚ uj servletov´ y kontejner, je tu jeˇstˇe jeden rozd´ıl. Je potˇreba pomoc´ı ServiceTrackeru hledat ne HttpService ale ExtHttpService.
Spuˇ stˇ en´ı frameworku v r´ amci servletov´ eho kontejneru Framework m˚ uˇze b´ yt spuˇstˇen v r´amci Java k´odu v embedded m´odu. To poskytuje moˇznosti pro spuˇstˇen´ı pˇr´ımo v r´amci jiˇz spuˇstˇen´eho servletov´eho kontejneru (jako je napˇr´ıklad Apache Tomcat, GlassFish nebo Jetty). Instanci Felixu potom lze zprovoznit pouze v r´amci jednotliv´eho servletu, kter´ y bude pouˇz´ıvat sluˇzby nainstalovan´ ych bundl˚ u. Nebo m˚ uˇzeme zajistit, aby se poˇzadavky na servletov´ y kontejner pˇr´ımo pˇresmˇerov´avaly do frameworku. Prvn´ı moˇznost poskytuje pouze omezen´e moˇznosti a nen´ı pˇr´ıliˇs zaj´ımav´e se j´ı zab´ yvat, proto se budu zab´ yvat druhou. Aby bylo pˇresmˇerov´an´ı moˇzn´e, mus´ıme zaˇr´ıdit p´ar vˇec´ı. N´asleduj´ıc´ı pˇr´ıklad je zprovoznˇen na z´akladˇe pˇr´ıklad˚ u ze str´anek Apache Felix [5] a popisu blogu Chrise Uptona ([16]). Prvn´ı vˇec´ı, kterou mus´ıme zaˇr´ıdit, je vytvoˇren´ı instance Felixe dˇr´ıve, neˇz kontejner zaˇcne pˇrij´ımat poˇzadavky. Nejlepˇs´ı m´ısto pro to je ServletContextListener, coˇz je rozhran´ı, kter´e m´a pouze dvˇe metody: contextInitialized a contextDestroyed. Takov´a tˇr´ıda m˚ uˇze vypadat takto:
25
OSGi
OSGi Enterprise
public class StartupListener implements ServletContextListener { private FrameworkService service; @Override public void contextInitialized(ServletContextEvent event) { // framework initialization this.service = new FrameworkService(event.getServletContext()); this.service.start(); } @Override public void contextDestroyed(ServletContextEvent event) { // stop framework this.service.stop(); } } import org.apache.felix.framework.Felix; public class FrameworkService { private final ServletContext context; private Felix felix; public FrameworkService(ServletContext context) { this.context = context; } public void start() { try { doStart(); } catch (Exception e) { log("Failed to start framework", e); } } public void stop() { try { doStop(); } catch (Exception e) { log("Error stopping framework", e); } } private void doStart() throws Exception { 26
OSGi
OSGi Enterprise
Felix tmp = new Felix(createConfig()); tmp.start(); this.felix = tmp; log("OSGi framework started", null); } private void doStop() throws Exception { if (this.felix != null) { this.felix.stop(); } log("OSGi framework stopped", null); } private Map<String, Object> createConfig() throws Exception { Properties props = new Properties(); // load config from properties file props.load(this.context .getResourceAsStream("/WEB-INF/framework.properties")); HashMap<String, Object> map = new HashMap<String, Object>(); for (Object key : props.keySet()) { map.put(key.toString(), props.get(key)); } map.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, Arrays.asList(new ProvisionActivator(this.context))); return map; } private void log(String message, Throwable cause) { this.context.log(message, cause); } } Kdyˇz nap´ıˇseme takovou tˇr´ıdu, je nutn´e d´at o n´ı vˇedˇet kontejneru. Coˇz nen´ı pˇr´ıliˇs sloˇzit´e, staˇc´ı pˇripsat do web.xml n´asleduj´ıc´ı: <listener> <listener-class> cz.zcu.kiv.zaruba.StartupListener Kdyˇz m´ame tedy zajiˇstˇeno, ˇze instance frameworku bude vˇcas vytvoˇrena 27
OSGi
OSGi Enterprise
a spuˇstˇena, mus´ı se zaˇr´ıdit, aby byly poˇzadavky pˇresmˇerov´any do nˇej. V r´amci spuˇstˇen´ı Felixe byla zm´ınˇena instalace bundlu org.apache.felix.http.bridge do frameworku. Instalace bundle do frameworku se prov´ad´ı pˇres BundleContext z´ıskan´ y z instance frameworku: BundleContext context = felix.getBundleContext(); Instalace potom prob´ıh´a manu´alnˇe: felix.getBundleContext().installBundle("cesta k bundlu"); Nebo lze napˇr´ıklad nainstalovat postupnˇe vˇsechny bundly v adres´aˇri: ArrayList<String> stringList = new ArrayList<String>(); for (Object o : this.context.getResourcePaths("/WEB-INF/MyBundles/")) { String name = (String) o; if (name.endsWith(".jar")) { URL url = this.context.getResource(name); if (url != null) { Bundle bundle = felix.getBundleContext().installBundle( url.toExternalForm()); bundle.start(); // start bundle } } } K tomu je jeˇstˇe zapotˇreb´ı zajistit p´ar z´avislost´ı bud’ pˇrid´an´ım tˇechto .jar soubor˚ u do WEB-INF/lib (nebo odpov´ıdaj´ıc´ıch z´avislost´ı v r´amci Maven projektu): • felix.jar • org.apache.felix.http.api-x.x.x.jar • org.apache.felix.http.base-x.x.x.jar • org.apache.felix.http.proxy-x.x.x.jar 28
OSGi
Felix na OS Android
• osgi R4 compendium-x.x.jar Pˇresmˇerov´an´ı poˇzadavk˚ u se potom zajist´ı dalˇs´ı u ´pravou souboru web.xml: <listener> <listener-class> org.apache.felix.http.proxy.ProxyListener <servlet> <servlet-name>proxy <servlet-class> org.apache.felix.http.proxy.ProxyServlet
1 <servlet-mapping> <servlet-name>proxy
/*
3.3
Felix na OS Android
Implementaci OSGI Apache Felix je moˇzn´e spustit embeddovanou v prakticky jak´ekoliv java aplikaci. Ani aplikace pro android nen´ı v´ yjimkou.
3.3.1
Spuˇ stˇ en´ı Felixe na Androidu
Z´akladn´ı stavebn´ı jednotkou pro Android jsou Activity. Z´akladn´ı strukturou jednotliv´e Activity jsou dvˇe metody: • onCreate – metoda volan´a pˇri vytvoˇren´ı Activity. Je j´ı moˇzn´e vyuˇz´ıt k inicializaci promˇenn´ ych a v naˇsem pˇr´ıpadˇe k vytvoˇren´ı instance Felixu.
29
OSGi
Felix na OS Android
• onStart – metoda volan´a pˇri startu aplikace. V naˇsem pˇr´ıpadˇe jsem ji vyuˇzil k nastartov´an´ı Felixe a k instalaci bundl˚ u do frameworku. Pˇred samotn´ ym spuˇstˇen´ım frameworku je nutn´e nejdˇr´ıve vytvoˇrit konfiguraci. Konfigurace je mapa reprezentov´ana instanc´ı tˇr´ıdy StringMap. Pˇred spuˇstˇen´ım frameworku je nutn´e do konfigurace pˇridat nˇekolik vˇec´ı: • FelixConstants.LOG LEVEL PROP – voliteln´ e – nastaven´ı logov´an´ı ve frameworku – napˇr´ıklad String.valueOf(Logger.LOG DEBUG) e • FelixConstants.FRAMEWORK SYSTEMPACKAGES – nutn´ – seznam bal´ık˚ u, kter´e budeme potˇrebovat uvnitˇr frameworku e • Constants.FRAMEWORK SYSTEMPACKAGES EXTRA – nutn´ – mus´ı b´ yt nastaven na ”android.content” – bal´ıˇcek, kter´ y budeme vyuˇz´ıvat pro z´ısk´an´ı aplikaˇcn´ıho kontextu androidu • Constants.FRAMEWORK STORAGE – nutn´ e – um´ıstˇen´ı cache pro framework
Cache pro framework Ke sv´emu fungov´an´ı potˇrebuje framework m´ıt pˇr´ıstup k adres´aˇri, kde si bude moct ukl´adat bundly a informace o frameworku. Cache je moˇzn´e m´ıt jak ve vnitˇrn´ı pamˇeti zaˇr´ızen´ı, tak na SD kartˇe. D˚ uvody pro um´ıstˇen´ı cache na SD kartu: • u nˇekter´ ych zaˇr´ızen´ı nepˇr´ıliˇs velk´a vnitˇrn´ı pamˇet’ • omezen´ y pˇr´ıstup do vnitˇrn´ı pamˇeti Vzhledem k tomu je lepˇs´ı um´ıstit cache frameworku na SD kartˇe. Aby mˇela aplikace na Androidu pˇr´ıstup k SD kartˇe, je nutn´e v AndroidManifest.xml pˇridat aplikaci pr´avo k pˇr´ıstup na SD kartu. 30
OSGi
Felix na OS Android
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"> Zde uvedu k´od pro inicializaci cache: String baseDir = Environment.getExternalStorageDirectory() .getAbsolutePath(); try { // overeni jestli cache existuje File felixCache = new File(baseDir + File.separator + FELIX_DIR + File.separator + "felix_cache"); // pokud adresar cache neexistuje pak ho vytvorime if(!felixCache.exists()) felixCache.mkdir(); // vytvoreni docasneho souboru pro cache m_cache = File.createTempFile("felix-cache", null,felixCache); } catch (IOException ex) { throw new IllegalStateException(ex); } // prevzato z luminis - nastaveni um´ ısteni cache m_configMap.put(Constants.FRAMEWORK_STORAGE, m_cache.getAbsolutePath()); // konec luminis m_cache.delete(); // vymazani cache m_cache.mkdirs(); // vytvoren´ ı nove cache Kdyˇz m´ame pˇripravenou cache, uˇz n´am nic nebr´an´ı ve spuˇstˇen´ı samotn´eho frameworku. Samotn´e spuˇstˇen´ı frameworku je velmi jednoduch´e: try { m_felix = new Felix(m_configMap); m_felix.start(); } catch (BundleException e) { e.printStackTrace(); } Chov´an´ı ihned pˇri spuˇstˇen´ı frameworku je moˇzn´e ovlivnit pomoc´ı seznamu Activator˚ u (ArrayList instanc´ı tˇr´ıdy BundleActivator), kter´ y se uloˇz´ı do konfigurace jak FelixConstants.SYSTEMBUNDLE ACTIVATORS PROP, nebo pˇr´ımo pˇr´ıstupem do frameworku. 31
OSGi
3.3.2
Felix na OS Android
Pˇ r´ıstup do spuˇ stˇ en´ eho frameworku
Pokud tedy m´ame spuˇstˇenou instanci frameworku, dostaneme se k bundleContextu. D´ıky tomu m˚ uˇzeme spravovat framework (instalovat bundly, zastavovat bundly, z´ısk´avat a registrovat sluˇzby). Ze spr´avy frameworku bych r´ad zm´ınil dvˇe moˇznosti, kter´e jsou d˚ uleˇzit´e pro mou aplikaci pro Android. • Registrace sluˇzby • Vyuˇzit´ı sluˇzby frameworku
Pˇ r´ıstup ke sluˇ zb´ am frameworku Obvykle m´ame ve frameworku nainstalov´ano nˇekolik bundl˚ u, kter´e jsou spojen´e sluˇzbami a importy. D´ıky pˇr´ıstupu k bundleContextu je moˇzn´e z´ıskat instanci sluˇzby ve frameworku a tud´ıˇz k cel´e sluˇzbˇe. Pˇr´ıklad k´odu: ServiceReference sRefAct = m_felix.getBundleContext() .getServiceReference(Activity.class.getName()); Activity act = m_felix.getBundleContext().getService(sRefAct);
Instance z vnˇ ejˇ sku jako sluˇ zba frameworku Na podobn´em principu funguje dod´an´ı instance, napˇr. activity, ze kter´eho je Felix spuˇstˇen´ y, aby byla pˇr´ıstupn´a ve frameworku: m_felix.getBundleContext() .registerService(Activity.class.getName(), this, null);
3.3.3
Vyuˇ zit´ı sluˇ zeb Android z OSGi
Vytvoˇren´ı bundlu, kter´ y vyuˇz´ıv´a sluˇzby, kter´e si zaregistrujeme z aplikace v Androidu, je v podstatˇe stejn´e jako vytv´aˇren´ı jak´ehokoliv jin´eho bundlu. 32
OSGi
Felix na OS Android
Vytvoˇr´ıme bundle, kter´ y z frameworku z´ısk´a napˇr´ıklad Android bundleContext nebo instanci Activity. Abychom toho mohli dos´ahnout, je nutn´e vloˇzit do naˇseho frameworku nˇeco, co poskytne tˇr´ıdy Androidu. Lze to bud’ speci´aln´ım bundlem, kter´ y v sobˇe bude m´ıt bud’ android*.jar nebo pˇr´ımo rozbalen´e tˇr´ıdy z t´ehoˇz archivu. Nebo tuto knihovnu vloˇz´ıme do naˇseho bundlu nebo lze bal´ıky uv´est do FelixConstants.FRAMEWORK SYSTEMPACKAGES. Na vloˇzen´ı z´avislost´ı lze opˇet vyuˇz´ıt uˇz v´ yˇse zm´ınˇen´ y maven-bundle-plugin do konfigurace vloˇz´ıme: <Embed-Dependency> *;scope=compile|runtime;inline=false T´ım zajist´ıme, ˇze veˇsker´e z´avislosti potˇrebn´e ke kompilaci a k bˇehu (samozˇrejmˇe z pom.xml) budou vloˇzeny do archivu bundlu. Bohuˇzel to ale nefunguje u ´plnˇe bez chyby. Protoˇze jakmile je aktivn´ı tato volba, tak plugin nereaguje na nastaven´ı import a export package (je moˇzn´e, ˇze jsem pˇrehl´edl nˇejakou moˇznost konfigurace). Tyto probl´emy se pak daj´ı ˇreˇsit pouze ruˇcn´ı u ´pravou manifestu bundlu. Jako pˇr´ıklad bundlu, kter´ y vyuˇz´ıv´a sluˇzby z androidu, uvedu bundle, kter´ y po startu nastav´ı uˇzivatelsk´e rozhran´ı (samozˇrejmˇe pouze velmi ¨ jednoduch´e, v TextView vyp´ıˇse Hello World”). public class Activator implements BundleActivator { private ServiceTracker trackerAndroid; private ServiceTracker trackerActivity; private Context androidContext; private Activity activity; public void start(BundleContext context) throws Exception { this.trackerAndroid = new ServiceTracker(context, Context.class.getName(),~null) { @Override public Object addingService(ServiceReference ref) { Object service = super.addingService(ref); // here we can do some inicialization 33
OSGi
Felix na OS Android
return service; } @Override public void removedService(ServiceReference ref, Object service) { super.removedService(ref, service); } }; this.trackerAndroid.open(); this.trackerActivity = new ServiceTracker(context, Activity.class.getName(), null) { @Override public Object addingService(ServiceReference ref) { Object service = super.addingService(ref); Activity activity = (Activity)service; // here we can do some inicialization return service; } @Override public void removedService(ServiceReference ref, Object service) { super.removedService(ref, service); } }; this.trackerActivity.open(); this.activity = (Activity) trackerActivity.getService(); this.androidContext = (Context) trackerAndroid.getService(); android.widget.TextView tv = new TextView(androidContext); tv.setText("Hello, Android Bundle"); activity.setContentView(tv); } public void stop(BundleContext arg0) throws Exception { } }
3.3.4
Pˇ r´ıprava bundlu pro pouˇ zit´ı na Android
Aplikace na Androidu bˇeˇz´ı na Dalvik VM. Dalvik VM nen´ı stejn´ y jako standardn´ı Java VM. Pro tuto pr´aci nejsou rozd´ıly moc d˚ uleˇzit´e. D˚ uleˇzit´e je, ˇze 34
OSGi
Felix na OS Android
mus´ıme v´ ysledn´ y bundle (.jar soubor) upravit pˇred t´ım, neˇz ho m˚ uˇzeme na Android pouˇz´ıt. Android SDK poskytuje naˇstˇest´ı n´astroje na tuto u ´pravu (postup je pˇrevzat z [4]). Postup je n´asleduj´ıc´ı: 1. Kaˇzd´ y .jar souboru mus´ı obsahovat sv˚ uj DEX ekvivalent. Toho m˚ uˇzeme dos´ahnout pomoc´ı n´astroje dx. dx --dex --output=classes.dex JAR_file.jar 2. Potom co jsme vytvoˇrili soubor classes.dex ho mus´ıme pˇridat do .jar souboru. aapt add JAR_file.jar classes.dex 3. Posledn´ım krokem je nyn´ı um´ıstit bundle na m´ısto, kde bude pˇr´ıstupn´ y ze syst´emu Android (vnitˇrn´ı pamˇet’, pamˇet’ov´a karta). Potom je bundle pˇripraven pro pouˇzit´ı na Android.
35
4 Persistence dat T´emˇeˇr kaˇzd´a aplikace mus´ı nˇekam ukl´adat data. V z´asadˇe se zde nab´ız´ı dvˇe moˇznosti ukl´ad´an´ı: do souboru a ukl´ad´an´ı do datab´aze. Ukl´ad´an´ı do soubor˚ u nebudu ˇreˇsit, protoˇze jsou pro u ´ˇcely t´eto pr´ace nevhodn´e, pr´ace s datab´az´ı nab´ız´ı pohodlnˇejˇs´ı pˇr´ıstup. Co se t´ yˇce ukl´ad´an´ı do datab´aze nab´ız´ı Java dvˇe moˇznosti: • JDBC • Objektovˇe relaˇcn´ı mapov´an´ı (ORM)
4.1
JDBC
Do datab´aze je moˇzn´e v Javˇe pˇristupovat pomoc´ı JDBC (The Java Database Connectivity). JDBC je pr˚ umyslov´ y standard pro datab´aze (ˇcerp´ano z [13]), kter´ y poskytuje program´atorovi spojen´ı a moˇznosti manipulace se ˇsirokou ˇsk´alovou datab´az´ı ovl´adan´ ych pomoc´ı jazyka SQL (Structured Query Language - jazyk pouˇz´ıvan´ y pro pr´aci s datab´azemi). Pˇri pr´aci s JDBC se nejdˇr´ıve vytvoˇr´ı spojen´ı s datab´az´ı, kter´e se realizuje pomoc´ı tˇr´ıdy Connection. K vytvoˇren´ı spojen´ı s datab´az´ı je potˇreba m´ıt k dispozici ovladaˇc pro danou datab´azi. Zp˚ usoby instalace ovladaˇce jsou sice r˚ uzn´e, ale vˇetˇsinou staˇc´ı d´at cestu k ovladaˇci do classpath. Pˇres toto spojen´ı je potom moˇzn´e s datab´az´ı manipulovat SQL dotazy. Tyto dotazy lze spouˇstˇet nˇekolika r˚ uzn´ ymi metodami. Pro zaveden´ı dotazu je potˇreba nejdˇr´ıve vytvoˇrit instanci tˇr´ıdy Statement, popˇr´ıpadˇe PreparedStatement. Tyto instance se vytv´aˇrej´ı pomoc´ı tˇr´ıdy spojen´ı Connection. Pokud je tedy k dispozici instance jedn´e z tˇr´ıd, je zde nˇekolik moˇznost´ı, jak prov´est dotaz. Z´aleˇz´ı na tom, jestli chceme prov´est v´ ybˇerov´ y dotaz nebo manipulaˇcn´ı dotaz. Moˇznosti spuˇstˇen´ı SQL dotazu: • execute 36
Persistence dat
Objektovˇe relaˇcn´ı mapov´ an´ı - pouˇzit´ı JPA
Tato metoda vykon´a libovoln´ y SQL dotaz, a to jak v´ ybˇerov´ y dotaz, tak i manipulaˇcn´ı dotaz. V pˇr´ıpadˇe manipulaˇcn´ıho dotazu samozˇrejmˇe nedostaneme z datab´aze ˇz´adn´a data. Tato konkr´etn´ı metoda vrac´ı boolean podle toho, jestli je ResultSet roven null (pokud je null pak vrac´ı false). • executeQuery Metoda slouˇz´ı pouze k vykon´av´an´ı v´ ybˇerov´eho dotazu. V´ ysledky dotazu se vrac´ı ve tˇr´ıdˇe ResultSet. • executeUpdate Metoda slouˇz´ıc´ı k vykon´av´an´ı manipulaˇcn´ıch dotaz˚ u. N´avratov´a hodnota t´eto funkce je poˇcet ˇr´adk˚ u, kter´e byly dotazem ovlivnˇeny. Pokud byl vykon´an v´ ybˇerov´ y dotaz, jsou data vr´acena ve tˇr´ıdˇe ResultSet. Tˇr´ıda ResultSet poskytuje z´akladn´ı metody pro pr´aci s v´ ysledky. V´ ysledky je nutn´e ˇc´ıst sekvenˇcnˇe po jednotliv´ ych ˇr´adc´ıch (ˇcehoˇz lze napˇr´ıklad dos´ahnout pouˇzit´ım while cyklu). Kaˇzd´ y ˇr´adek se naˇc´ıt´a pomoc´ı metody next(). Data z kaˇzd´eho ˇr´adku lze z´ıskat sadou metod jako je getString(), getInt(). . .
4.2
Objektovˇ e relaˇ cn´ı mapov´ an´ı - pouˇ zit´ı JPA
JPA (Java Persistence API) je speci´aln´ım pˇr´ıpadem ORM. Principem tohoto pˇr´ıstupu je namapov´an´ı entit (tabulek) z datab´aze na Java tˇr´ıdy. Program´ator potom pracuje s entitami jako s objekty tˇr´ıd. JPA je Java framework pro spr´avu relaˇcn´ıch dat, kter´ y umoˇzn ˇuje objektovˇe relaˇcn´ı mapov´an´ı. Lze ho vyuˇz´ıt jak v Java SE tak i v Java EE. Specifikace JPA 1.0 bylo uveˇrejnˇena v kvˇetnu roku 2006, nynˇejˇs´ı verze JPA 2.0 byla uveˇrejnˇena na konci roku 2009. Z´akladem pouˇzit´ı JPA je m´ıt nˇejakou tˇr´ıdu, kter´a m´a b´ yt uloˇzena v datab´azi. K tomu, aby framework vˇedˇel, ˇze m´a b´ yt objekt uloˇzen (v angliˇctinˇe persist odtud persistence), je moˇzn´e pouˇz´ıt dva z´akladn´ı zp˚ usoby, a to bud’ vyuˇzit´ı souboru orm.xml, ve kter´em specifikujeme, jak m´a persistence vypadat nebo lze pˇr´ımo vyuˇz´ıt anotace v k´odu. Specifikace JPA doporuˇcuje pouˇz´ıvat sp´ıˇse anotace neˇz mapovac´ı XML soubor. Aˇckoliv je zˇrejm´e, ˇze i mapov´an´ı pomoc´ı XML m´a sv´e v´ yhody. Obecnˇe lze tˇeˇzko rozsoudit, kter´ y pˇr´ıstup je lepˇs´ı. Obecnˇe se lze shodnout 37
Persistence dat
Objektovˇe relaˇcn´ı mapov´ an´ı - pouˇzit´ı JPA
na tom, ˇze ani jedno ˇreˇsen´ı nen´ı stˇr´ıbrn´a kulka. Oba pˇr´ıstupy maj´ı sv´e opodstatnˇen´ı a vyuˇzit´ı. Pro anotace napˇr´ıklad mluv´ı to, ˇze je dobr´ ym zvykem m´ıt informace o tˇr´ıdˇe pˇr´ımo u zdrojov´eho k´odu. Na druhou stranu pokud chceme pouˇz´ıvat pro stejn´e tˇr´ıdy r˚ uzn´e mapov´an´ı, pak je mapovac´ı soubor jasnou volbou. Nakonec lze konstatovat, ˇze oba pˇr´ıstupy lze kombinovat a obecn´e ˇreˇsen´ı neexistuje. Pro JPA je d˚ uleˇzit´ y dalˇs´ı soubor, kter´ y je povinn´ y pro oba pˇr´ıstupy, a t´ım je persistence.xml. V tomto souboru definujeme pˇr´ıstup do datab´aze, pˇr´ıpadnˇe dalˇs´ı vlastnosti a chov´an´ı ukl´ad´an´ı a naˇc´ıt´an´ı dat. Pro ilustraci uv´ad´ım uk´azku tohoto souboru:
<provider> org.eclipse.persistence.jpa.PersistenceProvider cz.zcu.kiv.zarubaDiplomka.server.model.Game cz.zcu.kiv.zarubaDiplomka.server.model.Player cz.zcu.kiv.zarubaDiplomka.server.model.GameType cz.zcu.kiv.zarubaDiplomka.server.model.Position cz.zcu.kiv.zarubaDiplomka.server.model.Scoreboard cz.zcu.kiv.zarubaDiplomka.server.model.PositionLog 38
Persistence dat
Objektovˇe relaˇcn´ı mapov´ an´ı - pouˇzit´ı JPA
cz.zcu.kiv.zarubaDiplomka.server.model.AlertLog <exclude-unlisted-classes>true <properties> <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/GPSGameDB; create=true" /> <property name="javax.persistence.jdbc.user" value="app" /> <property name="javax.persistence.jdbc.password" value="app" /> <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver" /> V souboru napˇr´ıklad vid´ıme, ˇze se chceme pˇripojit do datab´aze derby na portu 1527. D´ale je dobr´e si uk´azat, jak m˚ uˇze vypadat anotace tˇr´ıdy: @Entity public class Game implements Serializable { private static final long serialVersionUID = 1L; @Id @SequenceGenerator(name = "GAME_ID_GENERATOR", sequenceName = "GAME_ID") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GAME_ID_GENERATOR") private int id; @Column(name = "GAME_STARTED") private Timestamp gameStarted;
39
Persistence dat
Objektovˇe relaˇcn´ı mapov´ an´ı - pouˇzit´ı JPA
private String name; @Column(name = "SHOOT_RANGE") private int shootRange; @Column(name = "DUEL_RANGE") private int duelRange; @Column(name = "GAMELENGTH") private int gamelength; @Column(name = "REFRESH_RATE") private int refreshRate; // bi-directional many-to-one association to GameType @ManyToOne @JoinColumn(name = "GAME_TYPE") private GameType gameTypeBean; // bi-directional many-to-one association to Player @OneToMany(mappedBy = "gameBean") private Set
players; // bi-directional many-to-one association to Position @OneToMany(mappedBy = "game", cascade = CascadeType.REMOVE) private Set positions; // bi-directional many-to-one association to Position @OneToMany(mappedBy = "game", cascade = CascadeType.REMOVE) private Set<Scoreboard> scoreboards; } K tomu, aby naˇse tˇr´ıda mohla b´ yt uloˇzena do pamˇeti, jsou d˚ uleˇzit´e dvˇe vˇeci: anotace @Entity u tˇr´ıdy a pak tak´e uveden´ı tˇr´ıdy v persistence.xml, jak lze vidˇet v uk´azce. D´ale je nutn´e, aby byla tˇr´ıda jako bean, tzn. mˇela implicitn´ı konstruktor, gettery a settery pro kaˇzdou datovou poloˇzku. Implementac´ı JPA je samozˇrejmˇe nˇekolik. ORM se pouˇz´ıv´a jiˇz nˇejakou dobu a JPA se dost´av´a na vrchol aˇz pˇred ned´avnou dobou (do t´e doby se pouˇz´ıval hlavnˇe Hibernate). Dnes je referenˇcn´ı implementac´ı JPA 40
Persistence dat
Objektovˇe relaˇcn´ı mapov´ an´ı - pouˇzit´ı JPA
EclipseLink. Samozˇrejmˇe jsou zde i konkurenti pˇr´ımo na JPA jako je OpenJPA, tak i d´ale bˇeˇz´ı Hibernate, kter´ y m´a st´ale velkou komunitu uˇzivatel˚ u.
41
5 Aplikace GPS game ´ Ukolem pr´ace bylo vytvoˇrit aplikaci, kter´a uk´aˇze pouˇzit´ı komponentov´eho frameworku OSGi na zaˇr´ızen´ı na platformˇe Android. Byla zvolena hern´ı aplikace pro v´ıce hr´aˇc˚ u s pouˇzit´ım GPS. Aplikace je rozdˇelen´a na 2 ˇc´asti. Jedna ˇc´ast je serverov´a (zde je tak´e pouˇzito OSGi). Druh´a ˇc´ast (klientsk´a) je pro Android.
5.1
Z´ amˇ er aplikace
C´ılem modern´ıch her jiˇz nen´ı pouze zabavit hr´aˇce. St´ale v´ıce se v hern´ım prostˇred´ı prosazuj´ı socializaˇcn´ı a interaktivn´ı aspekty spojen´e s rozvojem online hran´ı. Tato aplikace zprostˇredkov´av´a hru na honˇenou za pouˇzit´ı GPS. Tedy pˇredpokl´ad´a se, ˇze bude hran´a na vˇetˇs´ım nekryt´em prostranstv´ı, kv˚ uli pˇresnosti GPS sensor˚ u (kter´e jsou v ˇr´adech 10 metr˚ u). Aplikace je urˇcena jak pro dˇeti, tak i pro dospˇel´e. V podstatˇe pro kaˇzd´eho kdo vlastn´ı chytr´ y telefon[15]. Hra m˚ uˇze b´ yt nastavena i tak, ˇze bude slouˇzit jako pom˚ ucka pˇri hran´ı jin´ ych her, jako je napˇr´ıklad paintball (pak m˚ uˇze hra slouˇzit jen jako orientaˇcn´ı pom˚ ucka). D˚ uleˇzit´ ym u ´kolem aplikace je ale dostat lidi ven, v dobˇe, kdy se pˇr´ıliˇs mnoho ˇcasu tr´av´ı za poˇc´ıtaˇcem v kancel´aˇri. Hra je zaloˇzen´a na fyzick´e aktivitˇe a nen´ı moˇzn´e ji provozovat doma z ob´ yv´aku.
5.1.1
Co hra dˇ el´ a
Zaˇcneme od zaˇc´atku. Hr´aˇc se pˇrihl´as´ı do aplikace pod svou pˇrezd´ıvkou. Pot´e bud’ vytvoˇr´ı hru nebo se pˇripoj´ı k jiˇz vytvoˇren´e hˇre. Hra m´a nˇekolik z´akladn´ıch parametr˚ u: • N´azev • Vzd´alenost pro stˇrelbu • Vzd´alenost pro duel 42
Aplikace GPS game
Architektura aplikace
• D´elka hry • Obnovovac´ı doba Nastaven´ım parametr˚ u ˇr´ık´ame, jakou hru chceme hr´at, pokud napˇr´ıklad chceme hr´at hru bez stˇr´ılen´ı a duel˚ u, napˇr´ıklad pokud chceme hru pouˇz´ıt jako orientaˇcn´ı pom˚ ucku na paintball, nastav´ım vzd´alenost pro duel i pro stˇrelbu na 0. Pokud jsme hru vytvoˇrili nebo se k n´ı pˇridali objev´ı se n´am hern´ı obrazovka. Ta n´am ukazuje kˇr´ıˇzkem, kde jsme a vodorovnou ˇci svislou ˇcarou n´am ukazuje jednu ze souˇradnic protivn´ıka. Hr´aˇc se pot´e pohybuje v hern´ım prostoru, kde vyhled´av´a protivn´ıka. Pokud ho uvid´ı je moˇzn´e ho zastˇrelit na d´alku“, tzn. nedoch´az´ı k duelu. Pokud se protivn´ıci pˇribl´ıˇz´ı na kratˇs´ı ” vzd´alenost, neˇz je nastavena, nast´av´a duel. Duel spoˇc´ıv´a v tom, ˇze hr´aˇci se zobraz´ı hl´aˇska, ˇze byl zapoˇcat duel. Mus´ı co nejrychleji reagovat, protoˇze ten z nich, kter´ y zareaguje rychleji, v´ıtˇez´ı a pˇreˇzije. Kaˇzd´ y z hr´aˇc˚ u m´a pouze jeden ˇzivot.
5.2
Architektura aplikace
Aplikace je rozdˇelena na dvˇe nez´avisl´e ˇc´asti. Serverov´a ˇc´ast je servletov´a aplikace, takˇze bˇeˇz´ı na nˇejak´em servletov´em kontejneru (v m´em pˇr´ıpadˇe jsem pouˇz´ıval Apache Tomcat 6.0.35). Klientsk´a ˇc´ast bˇeˇz´ı na Androidu. Obˇe ˇc´asti spolu komunikuj´ı pomoc´ı HTTP protokolu. Klientsk´a aplikace pos´ıl´a poˇzadavky pomoc´ı HTTP GET a serverov´a ˇc´ast vrac´ı data ve form´at XML. Abych dokonˇcil v´ yˇcet pouˇzit´ ych technologi´ı, tak na stranˇe serveru se pouˇz´ıv´a JPA EclipseLink jako persistenˇcn´ı vrstva a datab´aze Apache Derby.
5.3
Popis komunikaˇ cn´ıho protokolu
Klient a server spolu komunikuj´ı pomoc´ı HTTP protokolu. Klient pos´ıl´a poˇzadavky serveru pomoc´ı HTTP GET, napˇr´ıklad: http://localhost:8080/GameServerApplication/game 43
Aplikace GPS game
Popis komunikaˇcn´ıho protokolu
Application started Login User logged in
Logout
Leave game Game list
Game list Create game
Join game Map
Duel win/lost -> no server communication if duel lost, disable controls
No alerts-> no server communication only update positions
Position report
Fire
Fire confirmed/rejected
Confirm/Reject fire
Report sent, processing new players positions, processing alerts
Duel
Obr´azek 5.1: Diagram pˇrechod˚ u v z´avislosti na komunikaˇcn´ım protokolu ?action=report&messageType=positionReport &playerId=305&longitude=11.11&latitude=22.22 Server zas´ıl´a odpovˇedi jako XML, napˇr´ıklad: <message> <positions coordinates="longitude"> <position longitude="11.11" playerId="205"/>
44
Aplikace GPS game
5.3.1
Popis komunikaˇcn´ıho protokolu
Login
Pˇri spuˇstˇen´ı aplikace nebo po odhl´aˇsen´ı je uˇzivatel vyzv´an k zad´an´ı sv´eho uˇzivatelsk´eho jm´ena. Po jeho zad´an´ı se pos´ıl´a na server poˇzadavek s parametrem action nastaven´ ym na login. Jako odpovˇed’ dostane od serveru XML s id hr´aˇce nebo chybovou hl´aˇsku, pokud nen´ı zadan´ y login dostupn´ y.
Povinn´ e parametry poˇ zadavku na server • action - v tomto pˇr´ıpadˇe login • name - uˇzivatelsk´e jm´eno Uk´azka: serverURL?action=login&name=chicko
Form´ at XML ze serveru • pokud vˇse probˇehne jak m´a, pak server vr´at´ı XML v tomto tvaru · <message type="login"> • pokud nastane chyba server vrac´ı XML v tomto tvaru · <message type="error"> <errorMessage> Chybov´ e hl´ aˇ sen´ ı (napˇ r´ ıklad "Login is not available")
45
Aplikace GPS game
5.3.2
Popis komunikaˇcn´ıho protokolu
Game list
Po pˇrihl´aˇsen´ı m´a hr´aˇc moˇznost pˇridat se k nˇejak´e zapoˇcat´e hˇre. K tomu potˇrebuje seznam her s jejich id (vyuˇz´ıv´a se v joinGame viz d´ale). Pˇr´ıkaz gameList dostane ze serveru seznam dostupn´ ych her s jejich parametry vˇcetnˇe id.
Povinn´ e parametry poˇ zadavku na server Jedin´ ym povinn´ ym parametrem je parametr action. • action - gameList Uk´azka: serverURL?action=gameList
Form´ at XML ze serveru • pokud vˇse probˇehne jak m´a, pak server vr´at´ı XML v tomto tvaru · <message type="gamelist"> • pokud nastane chyba server vrac´ı XML v tomto tvaru · <message type="error"> <errorMessage> 46
Aplikace GPS game
Popis komunikaˇcn´ıho protokolu
Chybov´ e hl´ aˇ sen´ ı (napˇ r´ ıklad "Server not responding")
5.3.3
Join game
Jakmile m´a hr´aˇc k dispozici seznam her, m˚ uˇze se k nˇejak´e z nich pˇripojit. To obstar´av´a poˇzadavek typu joinGame. Jeho parametry jsou jen id hry a id hr´aˇce. Odpovˇed’ serveru, pokud vˇse probˇehlo v poˇr´adku je zopakov´an´ı id hry a ˇcetnost zas´ıl´an´ı report˚ u.
Povinn´ e parametry poˇ zadavku na server Jedin´ ym povinn´ ym parametrem je parametr action. • action - joinGame • playerId - id hr´aˇce, kter´ y se chce pˇripojit • gameId - id hry, ke kter´e se chce hr´aˇc pˇripojit Uk´azka: serverURL?action=joinGame&playerId=205&gameId=1851
Form´ at XML ze serveru • pokud vˇse probˇehne jak m´a, pak server vr´at´ı XML v tomto tvaru · <message type="joinGame"> • pokud nastane chyba server vrac´ı XML v tomto tvaru 47
Aplikace GPS game
Popis komunikaˇcn´ıho protokolu
· <message type="error"> <errorMessage> Chybov´ e hl´ aˇ sen´ ı (napˇ r´ ıklad "Game does not exists")
5.3.4
Create game
Hr´aˇc si nemus´ı nutnˇe vybrat pouze hru, ke kter´e se chce pˇridat, m˚ uˇze cht´ıt novou hru zaloˇzit. K tomu slouˇz´ı poˇzadavek na server typu createGame. Na server se mus´ı odeslat vˇsechny parametry vytv´aˇren´e hry, takˇze poˇzadavek je trochu ”delˇs´ı”.
Povinn´ e parametry poˇ zadavku na server Jedin´ ym povinn´ ym parametrem je parametr action. • action - createGame • playerId - id hr´aˇce, kter´ y se chce hru vytvoˇrit • name - n´azev hry • gameType - typ hry, reprezentov´an ˇc´ıslem (aplikace je pˇripravena na v´ıce typ˚ u her, ale implementov´an je re´alnˇe jen jeden a proto volba zat´ım nem´a smysl) • shootRange - vzd´alenost v metrech, na kterou je moˇzn´e zastˇrelit protivn´ıka • duelRange - vzd´alenost v metrech, ve kter´e je vyvol´an duel • gamelength - ˇcas v minut´ach, po kterou m´a trvat hra • refreshRate - ˇcas v sekund´ach, za kter´ y se bude pravidelnˇe pos´ılat report serveru
48
Aplikace GPS game
Popis komunikaˇcn´ıho protokolu
Uk´azka: serverURL/game?action=createGame&playerId=205 &name=nova hra&gameType=1 &shootRange=200&duelRange=100 &gamelength=222&refreshRate=2
Form´ at XML ze serveru • pokud vˇse probˇehne jak m´a, pak server vr´at´ı XML v tomto tvaru · <message type="createGame"> • pokud nastane chyba server vrac´ı XML v tomto tvaru · <message type="error"> <errorMessage> Chybov´ e hl´ aˇ sen´ ı (napˇ r´ ıklad "You are not logged or you were too long inactive")
5.3.5
Position report
Po tom, co se hr´aˇc pˇripoj´ı ke hˇre, at’ uˇz ji vytvoˇr´ı nebo ne, je nutn´e, aby pos´ılal informace o sv´e poloze (GPS souˇradnice). Souˇcasnˇe pˇri hl´aˇsen´ı tˇechto souˇradnic dost´av´a ˇr´ıd´ıc´ı zpr´avy v podobˇe Alert˚ u. Ty mohou b´ yt v´ıce typ˚ ua podrobnˇe se o nich zmiˇ nuji jinde.
Povinn´ e parametry poˇ zadavku na server • action - v tomto pˇr´ıpadˇe report • messageType - positionReport 49
Aplikace GPS game
Popis komunikaˇcn´ıho protokolu
• playerId - id hr´aˇce, kter´ y se chce hru vytvoˇrit • longitude - u ´daj o zemˇepisn´e d´elce • latitude - u ´daj o zemˇepisn´e ˇs´ıˇrce Uk´azka: serverURL/game?action=report&messageType=positionReport &playerId=305&longitude=11.11&latitude=22.22
Form´ at XML ze serveru • pokud vˇse probˇehne jak m´a, pak server vr´at´ı XML v tomto tvaru ·
<message> <positions coordinates="latitude"> <position latitude="22.22" playerId="205"/>
• pokud nastane chyba server vrac´ı XML v tomto tvaru · <message type="error"> <errorMessage> You are not logged or you were too long inactive
50
Aplikace GPS game
5.3.6
Popis komunikaˇcn´ıho protokolu
Fire
Pokud hr´aˇc vid´ı jin´eho hr´aˇce, m˚ uˇze na nˇej vystˇrelit. Serveru to d´a najevo, modifikaci zpr´avy Position report.
Povinn´ e parametry poˇ zadavku na server • action - report • messageType - fire • playerId - id hr´aˇce, kter´ y stˇr´ıl´ı • enemyId - id hr´aˇce, na kter´eho se stˇr´ıl´ı • longitude - pozice hr´aˇce • latitude - pozice hr´aˇce Uk´azka: serverURL/game?action=report&messageType=fire &playerId=205&enemyId=305 &longitude=11.11&latitude=22.22
Form´ at XML ze serveru Server vrac´ı zpr´avu ve stejn´em form´atu jako u Position report.
5.3.7
Duel
Pokud se hr´aˇci k sobˇe pˇribl´ıˇz´ı bl´ıˇze neˇz je specifikov´ano v duel range, pak hr´aˇc˚ um pˇrijde Alert, ˇze se maj´ı u ´ˇcastnit duelu.
51
Aplikace GPS game
Popis komunikaˇcn´ıho protokolu
Povinn´ e parametry poˇ zadavku na server • action - duel • playerId - id hr´aˇce • enemyId - id nepˇr´ıtele • reaction - reakˇcn´ı doba na duel v ms Uk´azka: serverURL/game?action=duel&playerId=205&enemyId=305 &reaction=2100
Form´ at XML ze serveru • pokud vˇse probˇehne jak m´a, pak server vr´at´ı XML v tomto tvaru · <message type="duelParticipation"> • pokud nastane chyba server vrac´ı XML v tomto tvaru · <message type="error"> <errorMessage> Duel does not exist
5.3.8
Get players
Kromˇe pravideln´ ych zpr´av o poloze se hr´aˇc jeˇstˇe mus´ı pravidelnˇe pt´at, kteˇr´ı hr´aˇci jsou ve hˇre.
52
Aplikace GPS game
Serverov´ a aplikace
Povinn´ e parametry poˇ zadavku na server • action - getPlayers • playerId - id hr´aˇce • gameId - id hry Uk´azka: serverURL/game?action=getPlayers&gameId=6901&playerId=305
Form´ at XML ze serveru • pokud vˇse probˇehne jak m´a, pak server vr´at´ı XML v tomto tvaru · <message> • pokud nastane chyba server vrac´ı XML v tomto tvaru · <message type="error"> <errorMessage> You are not logged or you were too long inactive
5.4
Serverov´ a aplikace
Serverov´a aplikace bˇeˇz´ı v r´amci serveru Apache Tomcat. Byl tedy zvolen pˇr´ıstup, kdy je OSGi framework embeddov´an v servletov´em kontejneru. V´ yhody tohoto pˇr´ıstupu byly jiˇz zm´ınˇeny, velmi d˚ uleˇzit´ ym d˚ uvodem je, ˇze pro spr´avce server˚ u je jednoduch´e restartovat aplikaci. 53
Aplikace GPS game
Serverov´ a aplikace
Aplikace mus´ı ukl´adat stav hry, tzn. seznam her, hr´aˇc˚ u apod. To zajiˇst’uje persistenˇcn´ı vrstva, kter´a mohla b´ yt implementov´ana nˇekolika zp˚ usoby (viz kapitola Persistence dat). Pro aplikaci je vhodnˇejˇs´ı pouˇz´ıt JPA, a to z nˇekolika d˚ uvod˚ u. Jedn´ım z nich je zad´an´ı pr´ace, kter´e hovoˇr´ı jasnˇe. Vytvoˇrit aplikaci za pouˇzit´ı Enterprise OSGi, jehoˇz souˇc´ast´ı je i JPA a webov´a sluˇzba. Byla pouˇzita datab´aze Apache Derby DB. D˚ uvodem byla snadnost pouˇzit´ı. Apache Derby DB je pˇr´ımo podporovan´a Eclipse Gemini (zvolenou implementac´ı Enterprise OSGI), takˇze jsou k dispozici pˇr´ımo bundly, kter´e zprostˇredkuj´ı pˇripojen´ı do datab´aze. Samotn´a komunikace byla jiˇz naznaˇcena v popisu komunikaˇcn´ıho protokolu. Servlet dostane u ´daje, kter´e zpracuje a poˇsle zpˇet informace pro klienta. Zde je d˚ uleˇzit´e zm´ınit, ˇze pro hern´ı aplikaci tohoto druhu by se velmi hodilo, aby server mohl pouˇz´ıvat push zpr´avy na klienta. Aplikace je navrˇzena tak, ˇze je zde faleˇsn´ y“ push - aplikace kontroluje u ´daje pokaˇzd´e, kdyˇz je za” vol´ana. Pokud je nˇejakou dobu neˇcinn´a, nen´ı schopna kontaktovat klienta. Pro aplikaci by bylo lepˇs´ı pouˇz´ıt nˇejakou jinou technologii, kter´a by dovolovala push (duplexn´ı kan´al, jin´ y protokol pro pˇrenos neˇz HTTP. . . ). Takov´a technologie by byla ovˇsem drah´a, takˇze byl nakonec pouˇzit HTTP protokol, kter´ y je sice bezestavov´ y, ovˇsem lze s n´ım doc´ılit poˇzadovan´eho v´ ysledku. Serverov´a aplikace se skl´ad´a z n´asleduj´ıc´ıch bundl˚ u: • SupportBundle Bundle obsahuje rozhran´ı pro sluˇzby a model dat persistenˇcn´ıho bundle (IGameDAO a IPlayerDAO). • PersistenceBundle Odpov´ıd´a za ukl´ad´an´ı dat do datab´aze. Bundle poskytuje dvˇe sluˇzby do frameworku, odpov´ıdaj´ıc´ı rozhran´ım ze SupportBundle. • GameServletBundle Nese hlavn´ı ˇc´ast ˇcinnosti serverov´e aplikace, zaregistruje se jako servlet, pˇrij´ım´a poˇzadavky klienta, odpov´ıd´a za kontroly her a hr´aˇc˚ u. • DashboardBundle Slouˇz´ı jako bundle, kter´ ym m˚ uˇzeme monitorovat a ovl´adat hry, hr´aˇce a obecnˇe stav serveru.
54
Aplikace GPS game
5.4.1
Serverov´ a aplikace
Model dat a persistenˇ cn´ı bundle
Vˇetˇsina dat, kter´e aplikace pouˇz´ıv´a, jsou ukl´ad´any do datab´aze. V t´eto kapitole bych r´ad popsal, jak vypadaj´ı tabulky datab´aze a jak´ ym zp˚ usobem se z nich ˇcte v aplikaci.
Datab´ aze Jako datab´aze byla zvolena Apache Derby DB. Datab´aze obsahuje 7 tabulek a sama o sobˇe nen´ı pˇr´ıliˇs sloˇzit´a (viz obr´azek 5.2). Scoreboard *
-shootType : Integer
*
0..1
0..1
Player
Game
-name : String -logged : boolean -lastActivity : Timestamp
0..1
0..1
-name : String -gameStarted : Timestamp -duelRange : Integer * -shootRange : Integer +gamelength : Integer -refreshRate : Integer
0..1
0..1
0..1
GameType 1
-name : String
*
Position *
-longitude : double -latitude : double
*
PositionLog *
*
AlertLog *
0..1
Obr´azek 5.2: E-R-A model datab´aze Pro hru jsou z´asadn´ı 4 tabulky: • Player - tabulka, kter´a obsahuje vˇsechny informace o hr´aˇc´ıch (login, posledn´ı aktivitu a jestli je moment´alnˇe pˇrihl´aˇsen) • Game - tabulka obsahuje vˇsechny aktivn´ı hry (po ukonˇcen´ı hry se hra maˇze z datab´aze) vˇcetnˇe d˚ uleˇzit´ ych parametr˚ u hry (n´azev, kdy byla hra 55
Aplikace GPS game
Serverov´ a aplikace
zaloˇzena, jak dlouho bude trvat, jak ˇcasto se hr´aˇci hl´as´ı, vzd´alenosti pro duel a stˇrelbu) • Scoreboard - tabulka z´asah˚ u hr´aˇc˚ u, obsahuje vˇzdy, jak´ y hr´aˇc zas´ahl jak´eho a kter´ ym zp˚ usobem • Position - tato tabulka udrˇzuje aktu´aln´ı pozice hr´aˇc˚ u ve hˇre. Teoreticky je moˇzn´e, aby hr´aˇc mˇel v tabulce v´ıce pozic, ale vˇzdy m´a pouze jednu pozici pro danou hru
Pˇ r´ıstup do datab´ aze Pro pˇr´ıstup do datab´aze bylo zvoleno JPA, konkr´etnˇe jeho implementace EclipseLink. Pˇr´ıstup do datab´aze je zprostˇredkov´an bundlem PersistenceBundle, kter´ y poskytuje aplikaci a frameworku sluˇzby typu IPlayerDAO a IGameDAO, kter´e jsou specifikov´any v SupportBundle. PersistenceBundle vyuˇz´ıv´a modelu dat, kter´ y je tak´e poskytov´an SupportBundle. Nebudu zde popisovat kaˇzdou metodu rozhran´ı IGameDAO nebo IPlayerDAO, pro ilustraci dod´am uk´azku anotovan´e tˇr´ıdy modelu a uk´azku metody z DAO. Jako uk´azku jsem zvolil ˇc´ast tˇr´ıdy Player, kter´a je nav´azan´a stejnojmennou tabulku.
@Entity public class Player implements Serializable { private static final long serialVersionUID = 1L; @Id @SequenceGenerator(name = "PLAYER_ID_GENERATOR", sequenceName = "PLAYER_ID") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PLAYER_ID_GENERATOR") private int id; private String name; // bi-directional many-to-one association to Game @ManyToOne @JoinColumn(name = "GAME") 56
Aplikace GPS game
Serverov´ a aplikace
private Game gameBean; @Column(name = "LOGGED") private boolean logged; @Column(name = "LAST_ACTIVITY") private Timestamp lastActivity; // bi-directional many-to-one association to Position @OneToMany(mappedBy = "player") private Set positions; // bi-directional many-to-one association to Position @OneToMany(mappedBy = "player") private Set<Scoreboard> sourcePlayerScoreboards; // bi-directional many-to-one association to Position @OneToMany(mappedBy = "destinationPlayer") private Set<Scoreboard> destinationPlayerScoreboards;
Jak je vidˇet, kousek tˇr´ıdy chyb´ı. Tˇr´ıda m´a pro kaˇzdou svoji datovou poloˇzku jeˇstˇe getter a setter. Ze tˇr´ıdy jde vidˇet tak´e, jak jsou definov´any vztahy s jin´ ymi entitami v datab´azi. Na uk´azce lze vidˇet vztah N..1 s entitou Position, nebo s Game. V JPA je totiˇz nutn´e vztah definovat na obou stran´ach, takˇze ve tˇr´ıd´ach Position a Game mus´ı b´ yt anotov´an vztah 1..N. N´asleduje uk´azka metody z DAO, konkr´etnˇe z metody savePosition: public void savePosition(Game game,~Player player, double longitude,~double latitude) { EntityManager em = emf.createEntityManager(); // nejdriv musim najit jestli tam uz pozice neni Query query = em.createQuery ("SELECT X FROM Position x WHERE x.player.id = " + player.getId() + " AND x.game.id = " + game.getId()); 57
Aplikace GPS game
Serverov´ a aplikace
Position position; boolean createRecord = false; if (query.getResultList().size() > 0) { position = (Position) query.getResultList().get(0); } else { position = new Position(); createRecord = true; } position.setGame(game); position.setPlayer(player); position.setLatitude((float) latitude); position.setLongitude((float) longitude); PositionLog positionLog = new PositionLog(); positionLog.setCreationTime(new Timestamp( System.currentTimeMillis())); positionLog.setGame(game); positionLog.setLatitude((float) latitude); positionLog.setLongitude((float) longitude); positionLog.setPlayer(player); EntityTransaction transaction = em.getTransaction(); if (!transaction.isActive()) transaction.begin(); if (createRecord) { em.persist(position); } else { em.merge(position); } em.persist(positionLog); em.flush(); transaction.commit(); em.close(); } Metoda je trochu delˇs´ı, protoˇze pˇri uloˇzen´ı souˇcasn´e pozice hr´aˇce se mus´ı vykonat nˇekolik krok˚ u:
58
Aplikace GPS game
Serverov´ a aplikace
1. Nejdˇr´ıve se mus´ı zjistit, jestli hr´aˇc jiˇz nem´a pozici uloˇzenou. Pokud ano, mus´ı se dan´a pozice pˇrepsat a ne pˇridat dalˇs´ı. 2. D´ale se mus´ı nastavit spr´avn´e hodnoty do tabulky Position. 3. Dalˇs´ım krokem je zalogov´an´ı pozice do tabulky PositionLog. 4. Nakonec se data uloˇz´ı do datab´aze.
5.4.2
Aplikaˇ cn´ı logika
Aplikaˇcn´ı logika je obsaˇzena hlavnˇe v GameServlet bundlu. Bundle si v aktiv´atoru ovˇeˇr´ı, jestli m´a k dispozici sluˇzby persistenˇcn´ıho bundlu (implementovan´e v rozhran´ı IGameDAO a IPlayerDAO). Pokud ano, pak se zaregistruje jako servlet a ˇcek´a na poˇzadavky. Popis aplikaˇcn´ıho protokolu naznaˇcil, ˇze hr´aˇc se pravidelnˇe hl´as´ı zpr´avou typu report. Jako odpovˇed’ dost´av´a nejen jednu ze souˇradnic vˇsech soupeˇr˚ u, ale tak´e seznam varov´an´ı (na serveru je implementov´an pomoc´ı tˇr´ıdy Alert, takˇze d´ale budu pouˇz´ıvat pojem alert). Pˇri kaˇzd´em poˇzadavku je nutn´e zkontrolovat stav hry (jestli uˇz hra nem´a skonˇcit, vzd´alenost hr´aˇc˚ u kv˚ uli duelu, st´aˇr´ı alert˚ u a duel˚ u). Pˇri kaˇzd´em poˇzadavku probˇehnou 3 d˚ uleˇzit´e metody: • checkGames - kontroluje, jestli hry jiˇz nemaj´ı konˇcit. . . • checkPlayers - kontroluje vzd´alenost hr´aˇc˚ u od sebe, dobu od posledn´ı aktivity - hr´aˇc je totiˇz pˇri neaktivitˇe delˇs´ı neˇz 5 minut odhl´aˇsen ze hry. . . • checkAlerts - kontroluje jestli jiˇz nebyly nˇekter´e Alerty a Duely na serveru pˇr´ıliˇs dlouho (standardn´ı ˇcas je 5 minut) a pˇr´ıpadnˇe je ˇreˇs´ı
Tˇ r´ıda Alert Tˇr´ıda Alert je klasick´a datov´a tˇr´ıda, kter´e obsahuje n´asleduj´ıc´ı poloˇzky: • sourcePlayer - hr´aˇc, od kter´eho poch´az´ı Alert (m˚ uˇze b´ yt null, pokud varov´an´ı vzniklo ze serveru) 59
Aplikace GPS game
Serverov´ a aplikace
• destinationPlayer - hr´aˇc, kter´eho se Alert t´ yk´a • game - hra, ve kter´e k Alertu doˇslo • createTime - ˇcas, kdy byl Alert vytvoˇren. Je to d˚ uleˇzit´ yu ´daj, protoˇze je pravidelnˇe kontrolov´ano, jestli Alerty nejsou pˇr´ıliˇs star´e • alertType - mohou b´ yt n´asleduj´ıc´ı druhy varov´an´ı: – Fire Hl´as´ı, ˇze na hr´aˇce nˇekdo vystˇrelil, tˇr´ıda samozˇrejmˇe obsahuje i hr´aˇce, kter´ y byl zdrojem tohoto v´ ystˇrelu, hr´aˇce pot´e m´a moˇznost bud’ stˇrelbu pˇrijmout nebo odm´ıtnout. Alerty i pozice hr´aˇc˚ u jsou logov´any do datab´aze, takˇze je moˇzn´e pozdˇeji posoudit situaci, kdy hr´aˇc odm´ıtl uznat, ˇze byl zastˇrelen, aˇckoliv mˇel. Pokud hr´aˇc neodpov´ıd´a na Alert po dobu delˇs´ı neˇz 1 minutu, je br´ano, jako ˇze v´ ystˇrel pˇrijal. Pˇri kaˇzd´em v´ ystˇrelu je nejdˇr´ıve ovˇeˇrena vzd´alenost mezi hr´aˇci, nesm´ı b´ yt vˇetˇs´ı neˇz ta, kter´a byla nastavena pˇri zakl´ad´an´ı hry. – Time over Tento alert, jak n´azev napov´ıd´a, ˇr´ık´a hr´aˇci (klientsk´e aplikaci), ˇze hra skonˇcila a m´a opustit hru. – Fire confirmed Pokud hr´aˇc uzn´a, ˇze byl zastˇrelen, samozˇrejmˇe nepokraˇcuje d´ale aktivnˇe ve hˇre. Vid´ı ostatn´ı hr´aˇce, ale nem˚ uˇze stˇr´ılet ani nen´ı uvaˇzov´an do duelu. – Fire rejected Hr´aˇc m˚ uˇze samozˇrejmˇe v´ ystˇrel odm´ıtnout (pˇredpokl´ad´a se, ˇze hr´aˇc, kter´ y vystˇrelil, se druh´emu uk´aˇze, aby bylo vidˇet, ˇze na nˇej opravdu mohl vystˇrelit a jen tak to nezkouˇsel). Pokud hr´aˇc v´ ystˇrel odm´ıtne, je to ozn´ameno stˇr´ılej´ıc´ımu hr´aˇci t´ımto Alertem. – Duel Pokud se hr´aˇci pˇribl´ıˇz´ı na vzd´alenost stanovenou pˇri vytv´aˇren´ı hry nast´av´a duel. Obˇema hr´aˇc˚ um se zobraz´ı hl´aˇska o tom, ˇze se u ´ˇcastn´ı duelu a mus´ı rychle zm´aˇcknout tlaˇc´ıtko. Oba hr´aˇci odes´ılaj´ı serveru sv˚ uj reakˇcn´ı ˇcas. Ten, kter´ y byl rychlejˇs´ı vyhr´av´a a pˇreˇz´ıv´a. – Duel win Ozn´amen´ı hr´aˇci, ˇze vyhr´al duel. 60
Aplikace GPS game
Serverov´ a aplikace
– Duel lost Ozn´amen´ı hr´aˇci, ˇze prohr´al duel.
Tˇ r´ıda Duel Tˇr´ıda podobn´a tˇr´ıdˇe Alert, slouˇz´ı k ukl´ad´an´ı stavu duelu. Duel mus´ı b´ yt ukl´ad´an, protoˇze nen´ı moˇzn´e vracet hr´aˇci okamˇzitˇe v´ ysledek jeho vol´an´ı o u ´ˇcasti v duelu (mus´ı se poˇckat, aˇz se ohl´as´ı protivn´ık nebo uplyne ˇcasov´ y limit). Podobnˇe jako tˇr´ıda Alert je i tato tˇr´ıda pomˇernˇe jednoduchou datovou tˇr´ıdou. V n´asleduj´ıc´ım v´ ypisu uk´aˇzi jednotliv´e poloˇzky tˇr´ıdy: • player1 - odkaz na prvn´ıho hr´aˇce v duelu • player2 - odkaz na druh´eho hr´aˇce v duelu • game - odkaz na hru, ve kter´e se duel odehr´av´a • player1Reaction - reakˇcn´ı ˇcas prvn´ıho hr´aˇce v milisekund´ach (milisekundy zvoleny, protoˇze je vrac´ı syst´emov´a metoda System.currentMillis()) • player2Reaction - reakˇcn´ı ˇcas druh´eho hr´aˇce • createTime - posledn´ı, ale velmi d˚ uleˇzitou datovou poloˇzkou tˇr´ıdy, je ˇcas vytvoˇren´ı duelu (je uloˇzen jako Timestamp, kter´ y je vytvoˇren ze syst´emov´eho ˇcasu)
V´ ypoˇ cet vzd´ alenosti Server potˇrebuje poˇc´ıtat vzd´alenosti mezi hr´aˇci hned pˇri dvou pˇr´ıleˇzitostech pˇri ovˇeˇrov´an´ı, jestli m´a doj´ıt k duelu a pokud jeden hr´aˇc vystˇrel´ı na druh´eho. Pro v´ ypoˇcet vzd´alenosti dvou bodu podle GPS souˇradnic jsem pouˇzil tzv. Haversinovu formuli. Algoritmus byl ˇc´asteˇcnˇe pˇrevzat od Chrise Venesse ([17]). Pro ilustraci uv´ad´ım celou metodu v´ ypoˇctu:
private long getDistance(double lat1, double lon1, double lat2, double lon2) { 61
Aplikace GPS game
Serverov´ a aplikace
int R = 6371000; // km double dLat = Math.toRadians(lat2 - lat1); double dLon = Math.toRadians(lon2 - lon1); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math. toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); double c = 2 * Math.asin(Math.sqrt(a)); return Math.round(R * c); }
Uveden´ y v´ ypoˇcet vrac´ı vzd´alenosti mezi body v metrech.
5.4.3
Dashboard
Aplikace m˚ uˇze b´ yt ˇc´asteˇcnˇe spravov´ana a monitorov´ana pomoc´ı DashboardServletu. Bohuˇzel zp˚ usob, kter´ y je pouˇzit pro aplikaci (Felix bˇeˇz´ı jako embedded v r´amci servletov´eho kontejneru), neumoˇzn ˇuje pouˇz´ıt JSP ani podobn´ y zp˚ usob pro zobrazen´ı informac´ı. Konkr´etn´ı implementace ExtHttpService a HttpService od Apache Felix vrac´ı totiˇz pro getDispatcher vˇzdy null, coˇz v praxi znamen´a, ˇze nen´ı moˇzn´e jak´ekoliv pˇresmˇerov´an´ı (forward) na jin´ y servlet nebo i JSP. Obecnˇe se zd´a, ˇze forwardov´an´ı nen´ı dobˇre napsan´e. Jako n´ahradn´ı variantu jsem tedy zvolil pouˇzit´ı PrintWriteru, kter´ y je z´ısk´av´an z HttpServletResponse: PrintWriter = response.getWriter(); Pomoc´ı nˇeho je tedy zapisov´an pˇr´ımo HTML k´od. Toto ˇreˇsen´ı nen´ı zrovna ˇst’astn´e a je pomˇernˇe pracn´e pomoc´ı nˇeho nˇeco tvoˇrit nebo upravovat, ale na jin´ y zp˚ usob jsem nepˇriˇsel.
62
Aplikace GPS game
5.5
Klientsk´a aplikace
Klientsk´ a aplikace
Klientsk´a aplikace je vytvoˇrena pro mobiln´ı zaˇr´ızen´ı s operaˇcn´ım syst´emem Android. Pro svoje fungov´an´ı potˇrebuje, aby zaˇr´ızen´ı mˇelo pamˇet’ovou kartu a GPS sensor.
5.5.1
Architektura aplikace
V r´amci aplikace bˇeˇz´ı framework Apache Felix (viz kapitola 3.3). Pˇri tvorbˇe jsem st´al pˇred nˇekolika probl´emy, jak zajistit, aby instance bˇeˇz´ıc´ıho frameworku byla k dispozici vˇsem aktivit´am, jak´ ym zp˚ usobem pˇrep´ınat z frameworku aktivity a jak´ ym zp˚ usobem v˚ ubec aktivity definovat.
Framework pro vˇ sechny aktivity Je jasn´e, ˇze framework se nastartuje v prvn´ı aktivitˇe (v tomto pˇr´ıpadˇe LoginActivity). D´ale je nutn´e nˇejak´ ym zp˚ usobem pˇred´avat instance frameworku. Mezi aktivitami lze pˇred´avat data napˇr´ıklad pomoci tzv. Extra. Bohuˇzel pro tento pˇr´ıpad se moc nehod´ı. Hod´ı se napˇr´ıklad pro pˇred´av´an´ı jednoduch´ ych dat, reference na objekt takto pˇred´avat jednoduˇse nejdou. Tedy moˇzn´e to je, ale pˇred´avat lze pouze objekty, kter´e implementuj´ı rozhran´ı Parcelable. Protoˇze nen´ı jednoduch´e pouˇz´ıt Extra, tak jsem zvolil jinou variantu spustit framework v r´amci sluˇzby. Na platformˇe Android je moˇzn´e spustit v z´asadˇe dva druhy sluˇzeb: sluˇzba m˚ uˇze b´ yt nav´azan´a pˇr´ımo na aktivitu (coˇz se pˇr´ıliˇs nehod´ı), nebo m˚ uˇze b´ yt aktivitou pouze spuˇstˇena a sv˚ uj ˇzivotn´ı cyklus si ˇr´ıd´ı sama (takov´eto sluˇzby se vyuˇz´ıvaj´ı napˇr´ıklad pro dlouh´e v´ ypoˇcty, nebo stahov´an´ı rozs´ahl´ ych dat). Pro n´aˇs probl´em jsem zvolil druhou jmenovanou variantu. V r´amci LoginActivity se vˇzdy spust´ı sluˇzba, kter´a poskytuje pˇr´ıstup k frameworku. Tato sluˇzba m´a ovˇsem jedno specifikum, je z´aroveˇ n vˇzdy i nav´azan´a na aktivitu.
Pˇ rep´ın´ an´ı aktivit z frameworku Bylo ˇz´adouc´ı, aby aktivity byly pˇrep´ın´any (obecnˇe ˇr´ızen´ı ˇzivotn´ıho cyklu aktivity) pˇr´ımo z frameworku (ne pˇr´ımo z aktivit). Aktivita se v Androidu 63
Aplikace GPS game
Klientsk´a aplikace
pˇrep´ın´a pomoc´ı Intentu. Pro tento Intent ovˇsem potˇrebujeme konkr´etn´ı tˇr´ıdu (objekt typu Class) aktivity. Tyto objekty jsou k dispozici pouze v r´amci Android aplikace, nikoliv v r´amci frameworku. Proto je nutn´e objekty aktivit uloˇzit do frameworku jako OSGi sluˇzby. Potom je jiˇz moˇzn´e pouˇz´ıt tyto tˇr´ıdy pro pˇrep´ın´an´ı. Uk´azka registrace aktivity do frameworku: // login activity Properties props = new Properties(); props.put("ActivityName","LoginActivity"); m_felix.getBundleContext().registerService(Class.class.getName(), LoginActivity.class, props); Uk´azka pˇrepnut´ı aktivity v r´amci frameworku: public String loginUser(Activity activity, String login, String password) { ServiceReference[] sRef2; sRef2 = bundleContext.getServiceReferences(Class.class.getName(), "(ActivityName=JoinOrCreateActivity)"); Class activityClass = (Class) bundleContext.getService(sRef2[0]); Intent myIntent = new Intent(activity, activityClass); activity.startActivity(myIntent); K uk´azce je tu jedna d˚ uleˇzit´a pˇripom´ınka. Je velmi d˚ uleˇzit´e, aby se metoda startActivity volala pomoc´ı instance minul´e aktivity. Android totiˇz aktivity skl´ad´a do z´asobn´ıku, ve kter´em se tvoˇr´ı ˇretˇez aktivit, jak byly spouˇstˇeny, aby bylo moˇzn´e po skonˇcen´ı aktivity (tlaˇc´ıtko back, nebo metoda finish()) se vr´atit k minul´e aktivitˇe (je moˇzn´e pomoc´ı vlastnost´ı Intentu zajistit, aby se nˇekter´e aktivity neukl´adaly do z´asobn´ıku, nebo dokonce aby ho cel´ y pˇrepsaly).
Oddˇ elen´ı prezentaˇ cn´ı vrstvy od aplikaˇ cn´ı Pˇri tvorbˇe nastala jeˇstˇe dalˇs´ı ot´azka, kde definovat aktivity aplikace. Bylo by hezk´e, kdyby vˇsechny aktivity byly definov´any v r´amci Apache Felix, to 64
Aplikace GPS game
Klientsk´a aplikace
ovˇsem nar´aˇz´ı na probl´em koncepce aplikace na Android. Aplikace na Android mus´ı m´ıt vˇsechny sv´e aktivity vyps´any v souboru Androidmanifest.xml. Pokud bychom chtˇeli definovat aktivity ve frameworku, m´ame probl´em. Proto doˇslo k oddˇelen´ı prezentaˇcn´ı vrstvy aplikace, kter´a je cel´a v Androidu (aktivity, sluˇzby, ˇretˇezce, layouty . . . ), od aplikaˇcn´ı a datov´e, kter´a bˇeˇz´ı cel´a v r´amci bundl˚ u uvnitˇr frameworku.
5.5.2
Prezentaˇ cn´ı vrstva - Android
Prezentaˇcn´ı vrstva se skl´ad´a ze dvou velk´ ych ˇc´ast´ı: aktivit (vˇcetnˇe layout˚ ua ˇretˇezc˚ u) a sluˇzby, kter´a m´a poskytuje rozhran´ı do frameworku.
Aktivity klientsk´ e aplikace Na n´asleduj´ıc´ım obr´azku (obr´azek 5.3) lze vidˇet, jak v aplikaci doch´az´ı k pˇrep´ın´an´ı jednotliv´ ych aktivit. Kaˇzd´a aktivita si v metodˇe onStart() nav´aˇze FelixService. Na obr´azku lze vidˇet tyto aktivity (pˇrechody mezi aktivitami budou d´ale pops´any v kapitol´ach o jednotliv´ ych aktivit´ach): • LoginActivity • ConfigurationActivity • JoinOrCreateActivity • CreateGameActivity • GameListActivity • MapsActivity
LoginActivity Je to u ´vodn´ı aktivita, kter´a se spouˇst´ı s aplikac´ı. Na zaˇc´atku vˇzdy vytvoˇr´ı instanci Apache Felix. A zobraz´ı textov´e pole pro zad´an´ı uˇzivatelsk´eho jm´ena a tlaˇc´ıtko pro zalogov´an´ı se do hry(viz obr´azek 5.4). Uˇzivatel zde zad´a sv´e jm´eno a klikne na Login, pot´e aplikace pˇrejde do aktivity JoinOrCreateGameActivity. Dalˇs´ım moˇzn´ ym pˇrechodem je pˇres tlaˇc´ıtko Menu->Configuration, kde aplikace pˇrejde na ConfigurationActivity. 65
Aplikace GPS game
Klientsk´a aplikace
Back button pressed (finish())
LoginActivity
Menu->Configuration
ConfigurationActivity
Login JoinOrCreateActivity
Create game button CreateGameActivity
Game created
Join game button GameListActivity
Game joined MapsActivity
Logout
Leave game
Report to server and get positions and alerts from server
Obr´azek 5.3: Diagram pˇrechod˚ u v z´avislosti na komunikaˇcn´ım protokolu
66
Aplikace GPS game
Klientsk´a aplikace
Aktivita si pamatuje posledn´ı zadan´e jm´eno pomoc´ı Preferences. Zde je opˇet vyuˇzita sluˇzba FelixService.
Obr´azek 5.4: Login Activity
ConfiguratinActivity V t´eto aktivitˇe lze nastavit pouze URL adresu serveru(viz obr´azek 5.5). Z aktivity se lze dostat pouze tlaˇc´ıtkem zpˇet do LoginActivity.
JoinOrCreateActivity Dalˇs´ı v ˇradˇe pomˇernˇe jednoduch´ ych aktivit. Uˇzivatel zde m´a pouze 4 moˇznosti (viz obr´azek 5.6): pˇrej´ıt k vytvoˇren´ı hry, pˇrej´ıt k pˇripojen´ı hry nebo tlaˇc´ıtkem zpˇet se odhl´asit a pˇrej´ıt do LoginActivity, stejnou moˇznost m´a pˇres tlaˇc´ıtko menu->logout.
CreateGameActivity Uˇzivateli se zobraz´ı formul´aˇr, k zad´an´ı parametr˚ u nov´e hry. Pˇrej´ıt odsud m˚ uˇze jen zpˇet (JoinOrCreateActivity) nebo tlaˇc´ıtkem hru vytvoˇrit a pˇripojit se k n´ı, tedy pˇrej´ıt do MapActivity. Posledn´ı moˇznost´ı je tlaˇc´ıtko menu->logout, ˇc´ımˇz uˇzivatel pˇrejde do LoginActivity.
67
Aplikace GPS game
Klientsk´a aplikace
Obr´azek 5.5: Configuration activity GameListActivity Uˇzivateli se zobraz´ı seznam her, kter´e jsou k dispozici (pˇr´ıpadnˇe pr´azdn´a obrazovka, pokud nen´ı k dispozici ˇz´adn´a hra)(viz obr´azek 5.8. Odsud podobnˇe jako v CreateGameActivity m˚ uˇze jen dvˇema smˇery zpˇet k JoinOrCreateGameActivity nebo klepnut´ım na hru se pˇripoj´ı k hˇre. Posledn´ı moˇznost´ı je tlaˇc´ıtko menu->logout, ˇc´ımˇz uˇzivatel pˇrejde do LoginActivity.
MapsActivity Z hlediska hry je to nejd˚ uleˇzitˇejˇs´ı aktivita. Vˇetˇsinu obrazovky pokr´ yv´a mapa (viz obr´azek 5.9). K zobrazen´ı mapy je pouˇzita komponenta z Google API MapView. Zde je d˚ uleˇzit´e poznamenat, ˇze k tomu, aby se aplikaci zobrazila mapa, je nutn´e se zaregistrovat a opatˇrit Google API Key. Na spodn´ı ˇc´asti obrazovky je jeden Spinner (pro v´ ybˇer hr´aˇc˚ u), 2 tlaˇc´ıtka (Fire pro v´ ystˇrel na hr´aˇc, Center Me pro vycentrov´an´ı mapy na moji polohu) a zaˇskrt´avac´ı tlaˇc´ıtko Center Me?, jestli se m´a po kaˇzd´e aktualizaci polohy vycentrovat mapa. Co se t´ yˇce pˇrechod˚ u tak je zde jen p´ar moˇznost´ı, jak vypl´ yv´a i z obr´azku (obr´azek 5.3). M˚ uˇzeme opustit hru nebo u ´plnˇe odhl´asit. D˚ uleˇzit´e v t´eto metodˇe je, ˇze mus´ı pravidelnˇe podle nastaven´ı obnovo68
Aplikace GPS game
Klientsk´a aplikace
Obr´azek 5.6: JoinOrCreate activity vac´ıho ˇcasu pos´ılat reporty na server. Pro implementaci opakovan´eho spuˇstˇen´ı je zde nˇekolik moˇznost´ı, je urˇcitˇe nutn´e, aby updater“ bˇeˇzel v samostatn´e ” vl´aknˇe. Zde jsem vyuˇzil tˇr´ıdy Handler. T´eto tˇr´ıdˇe se nastav´ı zpoˇzdˇen´ı, kdy se m´a spustit. Pˇri kaˇzd´em spuˇstˇen´ı si vˇzdy napl´anuje dalˇs´ı spuˇstˇen´ı. Samotn´ y report je obsaˇzen ve tˇr´ıdˇe MapUpdateTask, kter´a se vytv´aˇr´ı na zaˇc´atku aktivity.
Obnova zobrazen´ ych dat Obnovu zajiˇst’uje tˇr´ıda MapUpdateTask, kter´a zajist´ı spuˇstˇen´ı metod MapsActivity: updatePositions() a updatePlayers(). • updatePositions Metoda, kter´a zjist´ı, jestli jsou k dispozici GPS souˇradnice uˇzivatele a pokud ano, pak pos´ıl´a report serveru. Jako odpovˇed’ dost´av´a HashMap<String,Object>, kter´ y obsahuje: informaci o tom, jestli souˇradnice soupeˇr˚ u jsou zemˇepisn´a d´elka nebo ˇs´ıˇrka, seznam Alert˚ u, seznam pozic hr´aˇc˚ u. Potom nast´av´a f´aze zpracov´an´ı informac´ı. Nejdˇr´ıv uprav´ı pozici hr´aˇce na mapˇe. Pozice hr´aˇce je zobrazena v tzv. Overlay, kde je vykreslen symbol kˇr´ıˇzku na dan´e pozici. Daleko zaj´ımavˇejˇs´ı je ovˇsem vytvoˇren´ı 69
Aplikace GPS game
Klientsk´a aplikace
Obr´azek 5.7: Creategame activity Overlay pro hr´aˇce, vzhledem k tomu, ˇze m´ame k dispozici pouze jednu souˇradnici. Naˇstˇest´ı v r´amci MapView je k dispozici poloˇzka Projection, kter´a reprezentuje aktu´alnˇe zobrazen´ y v´ yˇrez mapy. Pomoc´ı t´eto souˇradnice lze pˇrepoˇc´ıtat bod urˇcen´ y GPS souˇradnic´ı na souˇradnice v pixelech pˇr´ımo na mapˇe. Pozice jsou pak zobrazeny jako ˇc´ary od kraje ke kraji mapy vodorovnˇe nebo svisle, podle toho, jestli je zad´ana ˇs´ıˇrka nebo d´elka. • updatePlayers Tato metoda se pravidelnˇe pt´a serveru, kteˇr´ı hr´aˇci jsou ve hˇre. Tato informace je vyuˇz´ıv´ana dvˇema zp˚ usoby: pro zobrazen´ı nab´ıdky hr´aˇc˚ u k v´ ystˇrelu a pro ovˇeˇren´ı, ˇze je hr´aˇc jeˇstˇe na ˇzivu - pokud je mrtev, nem˚ uˇze stˇr´ılet.
Pˇ red´ av´ an´ı uˇ zivatelsk´ eho jm´ ena a id mezi aktivitami Kaˇzd´a aktivita, kromˇe LoginActivity, potˇrebuje zn´at, kter´ y hr´aˇc je pˇrihl´aˇsen, protoˇze je to nutn´e v komunikaci se serverem. Proto je nutn´e tyto informace pˇred´avat. K tomu je vyuˇzit syst´em Extra hodnot, kter´e se daj´ı uloˇzit do Intentu. Zde je uk´azka ukl´ad´an´ı dat do Intentu: 70
Aplikace GPS game
Klientsk´a aplikace
Obr´azek 5.8: Gamelist activity Intent myIntent = new Intent(activity, activityClass); myIntent.putExtra("userId", playerId); myIntent.putExtra("login", login); activity.startActivity(myIntent);
Tˇ r´ıda FelixService Tˇr´ıda FelixService slouˇz´ı jako br´ana aplikace do frameworku, slouˇz´ı jako jak´asi aplikaˇcn´ı logika v r´amci prezentaˇcn´ı vrstvy. Pˇri vytvoˇren´ı t´eto tˇr´ıdy se vytvoˇr´ı a spust´ı framework Apache Felix. Po spuˇstˇen´ı se nainstaluj´ı a spust´ı vˇsechny bundly, kter´e se nach´az´ı na pˇredem zn´am´em m´ıstˇe na SD kartˇe (/mnt/sdcard/gpsGame/bundles). Potom se do frameworku zaregistruj´ı vˇsechny aktivity, kter´e v aplikaci jsou. Posledn´ı operac´ı je z´ısk´an´ı OSGi sluˇzby IUIBundle z frameworku.
Pˇ r´ıstup do frameworku Podobnˇe jako FelixService slouˇz´ı jako br´ana aplikace do frameworku, tak na druh´e stranˇe t´eto br´any stoj´ı UIBundle (s sluˇzbou odpov´ıdaj´ıc´ı IUIBundle). Po z´ısk´an´ı UI sluˇzby z frameworku
71
Aplikace GPS game
Klientsk´a aplikace
Obr´azek 5.9: Map activity m˚ uˇzeme ˇr´ıkat frameworku, co dˇelat. Bohuˇzel je zde jedna komplikace. Objekt z´ıskan´ y z frameworku je n´am sice zn´am´ y, ale nem˚ uˇzeme ho pˇr´ımo pouˇz´ıt, d˚ uvodem jsou rozd´ıln´e ClassLoadery, kter´e tˇr´ıdy identifikuj´ı. Pokud bychom tedy chtˇeli z´ıskan´ y objekt pˇretypovat na IUIBundle (z´ıskan´e z jar souboru bundlu), ohl´as´ı n´am ClassCastException. Musel jsem tedy zvolit jin´ y pˇr´ıstup - reflexe. Protoˇze zn´am jm´ena jednotliv´ ych tˇr´ıd, mohu je vˇzdy v objektu proj´ıt a zavolat s parametry, kter´e jsou mi tak´e zn´am´e. Tento pˇr´ıstup nen´ı v˚ ubec elegantn´ı, ale je funkˇcn´ı. Zde je uk´azka vol´an´ı funkce z UIBundlu: public String loginUser(Activity activity, String login, String password) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { Class myclass = this.uiBundleFunctions.getClass(); Method[] methods = myclass.getMethods(); String message = null; for (int i = 0; i < methods.length; i++) { if (methods[i].getName().equals("loginUser")) { message = (String) methods[i].invoke(uiBundleFunctions, 72
Aplikace GPS game
Klientsk´a aplikace
activity, login, password); break; // neni dale nutne prohledavat } } return message; }
5.5.3
Aplikaˇ cn´ı logika a s´ıt’ov´ a komunikace
Aplikaˇcn´ı logika aplikace je obsaˇzena v bundlech, kter´e jsou spuˇstˇeny v r´amci OSGi frameworku. Zde je seznam bundl˚ u, kter´e jsou pouˇzity v aplikaci, jejichˇz funkˇcnost budu postupnˇe prob´ırat: • SupportBundle • UIBundle • CommnunicationBundle • LocationBundle
Pouˇ zit´ e bundly SupportBundle Support bundle, podobnˇe jako u serverov´e aplikace, obsahuje rozhran´ı pouˇzit´ ych sluˇzeb. V tomto pˇr´ıpadˇe: • IUIBundleFunctions • ICommunicationBundle • ILocationBundle
UIBundle UIBundle je vlastnˇe ˇr´ıd´ıc´ı bundle cel´e aplikace. UIBundle poskytuje frameworku d˚ uleˇzit´e rozhran´ı IUIBundleFunctions. Pomoc´ı tohoto rozhran´ı k nˇemu pˇristupuje Android´ı ˇc´ast aplikace. Fakticky potom ˇr´ıd´ı celou aplikaci, protoˇze pr´avˇe v UIBundlu se pˇrep´ınaj´ı aktivity apod. 73
Aplikace GPS game
Klientsk´a aplikace
K tomu, aby bundle mohl poskytovat sluˇzbu frameworku, s´am potˇrebuje dalˇs´ı dvˇe sluˇzby: ILocationBundle a ICommunicationBundle. Do t´e doby, neˇz m´a k dispozici obˇe tyto sluˇzby, tak sluˇzbu frameworku neposkytuje. Jednotliv´e metody rozhran´ı IUIBundleFunctions poskytuj´ı veˇskerou funkˇcnost, kter´a je na prezentaˇcn´ı vrstvˇe potˇreba. Pokud je napˇr´ıklad potˇreba nˇejak´a s´ıt’ov´a komunikace, je vol´ana metoda rozhran´ı ICommunicationBundle. Nem´a cenu zde vypisovat veˇsker´e metody, kter´e bundle poskytuje, ale pro pˇredstavu uvedu pˇr´ıklady: loginUser, getGames, joinGame.
CommunicationBundle Dalˇs´ı souˇc´ast´ı aplikace je komunikaˇcn´ı bundle. Bundle zajiˇst’uje s´ıt’ovou komunikaci se serverem. M´a na starosti vlastn´ı pˇred´an´ı dat a zpracov´an´ı odpovˇedi. Komunikace prob´ıh´a pomoc´ı HTTP protokolu a server pos´ıl´a odpovˇedi v XML. Zp˚ usob komunikace se serverem je pops´an v´ yˇse v kapitole o HTTP komunikaci.
LocationBundle Lokaˇcn´ı bundle je asi nejjednoduˇsˇs´ı bundle v aplikaci. Jeho hlavn´ı n´apln´ı je, ˇze se zaregistruje k naslouch´an´ı zmˇen na GPS sensoru zaˇr´ızen´ı (k tomu slouˇz´ı tˇr´ıda MyLocationListener ) a posledn´ı pozici ukl´ad´a. Listener je moˇzn´e zaregistrovat pˇres aplikaˇcn´ı kontext. Registrace listeneru je dvoukrokov´a: locationManager = (LocationManager) androidContext .getSystemService(Context.LOCATION_SERVICE); locationManager .requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
Z´ astupn´ e komponenty D´ıky tomu, ˇze kaˇzd´a sluˇzba implementuje rozhran´ı, je moˇzn´e m´ıt r˚ uzn´e komponenty, kter´e poskytuj´ı sluˇzby. Jako pˇr´ıklad zde uvedu dvˇe moˇznosti z´astupn´ ych komponent (bundl˚ u).
Simulace polohy Jednou z moˇznost´ı z´astupn´ ych komponent je vytvoˇren´ı lokaˇcn´ıho bundlu tak, ˇze ve skuteˇcnosti nepotˇrebuje GPS sensor zaˇr´ızen´ı, ale 74
Aplikace GPS game
Ovˇeˇren´ı v´ysledn´e aplikace
poskytuje nˇejakou sadu GPS souˇradnic cyklicky.
Simulovan´ a s´ıt’ov´ a komunikace Dalˇs´ı moˇznost´ı je simulovat i s´ıt’ovou komunikaci, coˇz se m˚ uˇze hodit pro to, kdyˇz m´a aplikace slouˇzit jenom jako n´astroj pro zjiˇstˇen´ı polohy a jej´ı zobrazen´ı na mapˇe.
5.6
Ovˇ eˇ ren´ı v´ ysledn´ e aplikace
V´ ysledkem pr´ace jsou dvˇe aplikace: aplikace pro server a aplikace pro mobiln´ı zaˇr´ızen´ı s Android. V´ yvoj serverov´e aplikace prob´ıhal na lok´alnˇe na nainstalovan´em Apache Tomcat. Poˇzadavky klienta byly simulov´any pomoc´ı prohl´ıˇzeˇce. Klientsk´a ˇc´ast byla vyv´ıjena na emul´atoru. Poˇzadavky na server byly pos´ıl´any na adresu 10.0.2.2, coˇz je speci´aln´ı adresa Android emul´atoru pro komunikaci aplikac´ı emul´atoru s hostitelsk´ ym poˇc´ıtaˇcem. Aplikace byla n´aslednˇe testov´ana na re´aln´ ych zaˇr´ızen´ıch (HTC Desire, Xperia Mini Pro). Na zaˇr´ızen´ıch byl nainstalov´an Android verze 2.2.2 (HTC Desire) a 2.3.3 (Xperia Mini). Jako server byl vyuˇzit ˇskoln´ı server Ares (students.kiv.zcu.cz) na portu 9999. Zaˇr´ızen´ı HTC Desire lze s pouˇzit´ım HTC Sync vyuˇz´ıt jako v´ yvojov´e zaˇr´ızen´ı (lze na nˇej aplikaci pˇr´ımo nahr´avat z Eclipse, lze monitorovat pˇr´ımo jeho LogCat. . . ). D´ıky tomu ˇsli ovˇeˇrit aspekty aplikace, kter´e se neprojevili pˇri provozu na emul´atoru (viz kapitola 6.1).
5.7
Rozˇ s´ıˇ ren´ı aplikace
Aplikaci jako takovou je moˇzn´e d´ale rozˇsiˇrovat, a to jak na stranˇe serveru, tak i na stranˇe klienta. Zˇc´asti lze vyuˇz´ıt rozdˇelen´ı aplikace na bundly.
5.7.1
V´ıce typ˚ u her
V souˇcasn´e podobˇe podporuje aplikace pouze jeden typ hry. Pˇritom je ale pˇripravena na to, aby bylo k dispozici v´ıce typ˚ u her. Pˇr´ıkladem jin´ ych typ˚ u her je souboj t´ ym˚ u nebo hon na liˇsku. 75
Aplikace GPS game
Rozˇs´ıˇren´ı aplikace
K implementov´an´ı t´eto moˇznosti je pˇripravena datab´aze, kter´a obsahuje tabulku pro typ hry, kter´a je v souˇcasn´e dobˇe nevyuˇzit´a. Pro podporu v´ıce typ˚ u her je ovˇsem zapotˇreb´ı zas´ahnout do aplikaˇcn´ı logiky. Funkce, kter´e kontroluj´ı pozice hr´aˇc˚ u, st´aˇr´ı her, Alert˚ u a Duel˚ u, by musely b´ yt upraveny, aby vˇzdy zkontrolovaly, o jak´ y typ hry se jedn´a a podle ˇceho se chovat.
5.7.2
V´ıce ˇ zivot˚ u pro hr´ aˇ ce
Dalˇs´ım rozˇs´ıˇren´ım hry by byla moˇznost urˇcen´ı poˇctu ˇzivot˚ u hr´aˇce. Implementace t´eto zmˇeny by byla sloˇzitˇejˇs´ı neˇz pˇredchoz´ı rozˇs´ıˇren´ı. Protoˇze by se musela rozmyslet koncepce oˇzivov´an´ı hr´aˇce, jestli by se oˇzivoval u nˇejak´e vlajky (pak by se muselo toto m´ısto nˇekam ukl´adat, coˇz by znamenalo u ´pravu datov´eho modelu), nebo po nˇejak´e dobˇe, kter´a by se ovˇsem musela tak´e nˇekde specifikovat.
5.7.3
Lepˇ s´ı lokaˇ cn´ı bundle
Souˇcasn´ y lokaˇcn´ı bundle je velmi jednoduch´ y. Lokaˇcn´ı bundle by ˇsel vylepˇsit, aby zohledˇ noval i pˇresnost u ´daj˚ u. Tak´e by zde ˇsel zav´est algoritmus, kter´ y by vyhlazoval pˇr´ıpadn´e v´ ykyvy informac´ı ze sensor˚ u.
5.7.4
Dashboard na mobil
Dalˇs´ı dobˇre pouˇzitelnou pom˚ uckou pro aplikaci by byla dalˇs´ı aplikace, kter´a by slouˇzila jako souˇcasn´ y bundle DashboardServlet. Uˇzivatel by mohl spravovat server i ze sv´eho mobiln´ıho zaˇr´ızen´ı. Pro implementaci tohoto ˇreˇsen´ı by se muselo rozˇs´ıˇrit rozhran´ı pro spr´avu pˇres HTTP.
76
6 Zkuˇsenosti s pouˇzit´ım OSGi Bˇehem v´ yvoje aplikace jsem narazil na ˇradu pˇredpokl´adan´ ych i m´enˇe pˇredpokl´adan´ ych pˇrek´aˇzek. Nˇekter´e jsem jiˇz zm´ınil, napˇr´ıklad zprovoznˇen´ı samostatn´eho frameworku na Android. Dalˇs´ı jsem zm´ınil jen okrajovˇe nebo v˚ ubec ne. Pomˇernˇe kr´atce po zaˇc´atku v´ yvoje jsem zjistil, ˇze pro klientskou a serverovou aplikaci bude potˇreba jin´ y pˇr´ıstup. Zat´ımco v´ yvoj na serveru je po zprovoznˇen´ı z´akladn´ıho r´amce, kter´ y spust´ı framework, nainstaluje a spust´ı bundly, velmi podobn´ y v´ yvoji jak´ekoliv jin´e Java aplikace. Pˇri v´ yvoji klientsk´e ˇc´asti je situace troˇsku odliˇsn´a a to hlavnˇe t´ım, ˇze je nutn´e pouˇz´ıvat bud’ emul´ator nebo zaˇr´ızen´ı, na kter´e m´ate ovladaˇce, coˇz pr´aci docela dost zpomaluje.
6.1
Pouˇ zit´ı emul´ atoru nebo re´ aln´ eho zaˇ r´ızen´ı
Obecnˇe lze ˇr´ıct, ˇze se vyplat´ı aplikaci nejdˇr´ıve odladit na emul´atoru a teprve potom aplikaci zkouˇset na re´aln´em zaˇr´ızen´ı (minim´alnˇe kv˚ uli bezpeˇcnosti zaˇr´ızen´ı a dat na nˇem). Menˇs´ım probl´emem je rychlost emul´atoru, kter´a je v porovn´an´ı s re´aln´ ym zaˇr´ızen´ım mnohem menˇs´ı (porovn´av´ano s HTC Desire) a tak´e pomˇernˇe dlouho trv´a, neˇz v˚ ubec emul´ator nabˇehne (nˇekdy to trv´a i nˇekolik minut). Proto se vyplat´ı emul´ator nastartovat a nevyp´ınat ho. Pouˇzit´ı re´aln´eho zaˇr´ızen´ı na ladˇen´ı m´a tak´e sv´e pˇrek´aˇzky. Pˇrednˇe, aby bylo moˇzn´e zaˇr´ızen´ı pro takov´e u ´ˇcely pouˇz´ıt, mus´ı b´ yt k dispozici ovladaˇc (standardnˇe je k dispozici zaˇr´ızen´ı Nexus - v´ yvoj´aˇrsk´ y telefon Google). Pro m˚ uj telefon (HTC Desire) je tak´e ovladaˇc k dispozici, ale jen v r´amci aplikace HTC Sync. Zaˇr´ızen´ı se mus´ı pˇripojit k PC, nastavit m´od synchronizace, ale synchronizace se nesm´ı prov´adˇet, pak je zaˇr´ızen´ı k dispozici k ladˇen´ı. Pˇri ladˇen´ı na emul´atoru si mus´ıme d´at pozor jeˇstˇe na jednu vˇec: v´ ypis na System.out a to jak pˇr´ımo System.out.println(), tak i nepˇr´ımo ve vyj´ımk´ach e.printStackTrace. Na emul´atoru aplikace funguje spolehlivˇe, ale na re´aln´em zaˇr´ızen´ı aplikace spadne s RunTimeException.
77
Zkuˇsenosti s pouˇzit´ım OSGi
6.2
ADT plugin pro Eclipse
ADT plugin pro Eclipse
Klientskou aplikaci jsem vyv´ıjel v Eclipse za pouˇzit´ı ADT pluginu. Obecnˇe mohu toto ˇreˇsen´ı doporuˇcit. Pluginu se pouze nastav´ı cesta k SDK Androidu a d´ale jiˇz nen´ı tˇreba nic ˇreˇsit. Plugin poskytuje obdobu n´astroje DDMS pro spr´avu zaˇr´ızen´ı (souborov´ y syst´em, ovl´ad´an´ı sensor˚ u).
6.3
Pˇ r´ıprava bundl˚ u
Pro kompilov´an´ı OSGi bundl˚ u jsem pouˇz´ıval Maven, kde jsem vyuˇzil mavenbundle-plugin od Apache. Tento plugin poskytuje pomˇernˇe jednoduch´e nastaven´ı bundl˚ u, s´am vytvoˇr´ı manifest, ve kter´em urˇc´ı exportovan´e a importovan´e bal´ıky. Po kompilaci je nutn´e do bundl˚ u dodat soubor classes.dex, jak jiˇz bylo zm´ınˇeno v kapitole o pˇr´ıpravˇe bundl˚ u. Zde jsem ovˇsem narazil na probl´em pod Windows 7, a to konkr´etnˇe s pr´avy. Pokud je SDK nainstalov´ano na standardn´ı um´ıstˇen´ı do C:\ Program File, pak je nutn´e m´ıt spr´avcovsk´a pr´ava pro spuˇstˇen´ı potˇrebn´ ych n´astroj˚ u. Situaci ovˇsem u ´plnˇe nevyˇreˇs´ı ani instalace jinam, protoˇze je pravdˇepodobnˇe chyba ve skriptu dx.bat, kter´ y nem˚ uˇze naj´ıt dalˇs´ı potˇrebn´e n´astroje. Probl´em jsem ˇreˇsil tak, ˇze jsem bundly (jar soubory) pˇripravoval pˇr´ımo v adres´aˇri se skriptem dx.bat.
6.4
Spr´ avn´ e nastaven´ı poˇ rad´ı spouˇ stˇ en´ı bundl˚ u
Pˇri instalaci a spuˇstˇen´ı bundl˚ u ve frameworku je tˇreba db´at na spr´avn´e poˇrad´ı bundl˚ u. Aplikace je postaven´a tak, ˇze prohled´av´a urˇcen´ y adres´aˇr a instaluje vˇsechny jar soubory. Bohuˇzel m˚ uˇze nastat situace, kdy framework s´am o sobˇe nedok´aˇze rozebrat strom z´avislost´ı a nainstalovat bundly ve spr´avn´em poˇrad´ı. Probl´em jsem ˇreˇsil, i kdyˇz ne moc elegantnˇe, t´ım, ˇze jsem bundly pˇrejmenoval tak, ˇze prvn´ı bundle zaˇc´ın´a znakem 0, dalˇs´ı 1 . . .
78
Zkuˇsenosti s pouˇzit´ım OSGi
6.5
Spr´avn´e nastaven´ı frameworku
Spr´ avn´ e nastaven´ı frameworku
Velmi d˚ uleˇzit´e je nastavit spr´avnˇe, kter´e bal´ıky budou jako syst´emov´e, pˇred spuˇstˇen´ım frameworku, protoˇze napˇr´ıklad bal´ıky s n´astroji pro zpracov´an´ı XML nejsou standardnˇe poskytov´any. Syst´emov´e bal´ıky jsou pak poskytov´any syst´emov´ ym bundlem (bundlem s id 0). Aplikace potom nˇekdy pad´a se ˇspatnˇe ˇciteln´ ymi chybami.
6.6
Nastaven´ı z´ avislost´ı pro Android pod Maven
V ofici´aln´ım maven reposit´aˇri jsou k dispozici artefakty pro Android. Tyto artefakty bohuˇzel nejsou u ´plnˇe kompletn´ı, neobsahuj´ı knihovnu Google API. Nastalou situaci lze vyˇreˇsit t´ım, ˇze se pouˇzije lok´aln´ı SDK, vytvoˇr´ı se z nˇeho artefakty, kter´e potom poskytuj´ı API. Postup je pˇrevzat´ y od Manfreda Mosera ([11]). Po instalaci se do z´avislost´ı v pom.xml uvede toto: <dependency> android <artifactId>android 2.1_r3 <scope>provided
6.7
Zhodnocen´ı pouˇ zit´ı OSGi komponent
Velkou v´ yhodou pouˇzit´ı OSGi je snadn´a v´ ymˇena komponent. Pro v´ ymˇenu komponent staˇc´ı pˇrepsat soubory s bundly. Takˇze rozˇs´ıˇren´ı aplikace je potom velmi jednoduch´e. Na druhou stranu pouˇzit´ı bundl˚ u ve skuteˇcnosti poruˇsuje bezpeˇcnostn´ı pravidla Androidu. Aplikace na Android jsou zaloˇzen´e na tom, ˇze se napˇred v´ı, co dˇelaj´ı, kde jsou apod. Bundly jsou ˇc´asti k´odu programu, nad kter´ ymi nem´a syst´em pˇrehled. Z´aroveˇ n samozˇrejmˇe m˚ uˇze pokulh´avat verzov´an´ı aplikac´ı, protoˇze m˚ uˇze b´ yt rozd´ıln´e pro bundly a pro aplikaci.
79
Zkuˇsenosti s pouˇzit´ım OSGi
Zhodnocen´ı pouˇzit´ı OSGi komponent
Pouˇzit´ı OSGi komponent tak´e trochu komplikuje rychlost v´ yvoje. Celkovˇe posoudit pouˇzit´ı OSGi komponent na mobiln´ıch zaˇr´ızen´ıch Android nen´ı jednoduch´e. V celkov´em obraze si mysl´ım, ˇze snadn´a moˇznost v´ ymˇeny komponent vyv´aˇz´ı ostatn´ı nev´ yhody.
80
7 Z´avˇer C´ılem m´e pr´ace bylo prostudovat moˇznost OSGi komponent na mobiln´ıch zaˇr´ızen´ıch. Tyto moˇznosti jsem mˇel n´aslednˇe ovˇeˇrit vytvoˇren´ım hern´ı aplikace na mobiln´ı zaˇr´ızen´ı s operaˇcn´ım syst´emem Android. D´ıky nabyt´ ym znalostem se mi podaˇrilo vytvoˇrit funkˇcn´ı aplikaci, kter´a potvrzuje pouˇzitelnost OSGi na mobiln´ıch zaˇr´ızen´ıch. Hlavn´ım pˇr´ınosem m´e aplikace nen´ı hra samotn´a, ale uk´azka mobiln´ı aplikace zaloˇzen´e na OSGi se server-klient modelem. V´ yhodou pouˇzit´ı komponentov´eho frameworku je i snadn´a rozˇsiˇritelnost aplikace. Bˇehem tvorby m´e pr´ace jsem z´ıskal mnoho zkuˇsenost´ı s tvorbou aplikac´ı pro Android. Prohloubil jsem svoje zkuˇsenosti s v´ yvojem servletov´ ych aplikac´ı. D´ale jsem si rozˇs´ıˇril znalosti o vyuˇzit´ı OSGi a v neposledn´ı ˇradˇe jsem se zdokonalil v pr´aci s JPA. V ˇsirˇs´ım vyuˇzit´ı komponentov´ ych framework˚ u na mobiln´ıch zaˇr´ızen´ı vid´ım velkou budoucnost d´ıky jejich modularitˇe a znovupouˇzitelnosti. Ot´azkou vˇsak je, jestli jejich ˇsirˇs´ımu rozˇs´ıˇren´ı a integraci nezabr´an´ı moˇzn´a bezpeˇcnostn´ı rizika spojen´a s jejich modularitou.
81
Literatura [1] ABLESON, W. F. et al. Android in Action. Shelter Island : Manning, 2012. ISBN 1-61729-050-5. [2] Android (operating system) [online]. 2012. [cit. 15.4.2012]. Dostupn´e z: http://www.openhandsetalliance.com/oha_members.html. [3] Apache Aries Home [online]. apr 2012. [cit. 15.4.2012]. Dostupn´e z: http://aries.apache.org/. [4] Apache Felix Framework and Google Android [online]. 2012. [cit. 15.3.2012]. Dostupn´e z: http://felix.apache.org/site/apache-felix-frameworkand-google-android.html. [5] Apache Felix HTTP Service [online]. 2012. [cit. 15.4.2012]. Dostupn´e z: http://felix.apache.org/site/apache-felix-http-service.html#ApacheFelixHTTPService-UsingtheServletBridge. [6] CUMMINS, H. – WARD, T. Enterprise OSGi in Action. Shelter Island : Manning, 2012. ISBN 9781617290138. [7] Example 6 - Spell Checker Service Bundle [online]. 2012. [cit. 15.4.2012]. Dostupn´e z: http://felix.apache.org/site/apache-felix-tutorial-example-6.html. [8] Gemini Home [online]. 2012. [cit. 15.4.2012]. http://www.eclipse.org/gemini/.
Dostupn´e z:
[9] Windows Phone and the Cloud–an Introduction [online]. 2012. [cit. 30.4.2012]. Dostupn´e z: http://msdn.microsoft.com/en-us/magazine/ff872395.aspx. [10] Metro User Interface Controls [online]. 2012. [cit. 30.4.2012]. Dostupn´e z: http://metroui.com/. 82
LITERATURA
LITERATURA
[11] MOSER, M. maven-android-sdk-deployer line]. 2012. [cit. 15.4.2012]. Dostupn´e https://github.com/mosabua/maven-android-sdk-deployer.
[onz:
[12] Members [online]. 2012. [cit. 15.4.2012]. Dostupn´e http://en.wikipedia.org/wiki/Android_(operating_system).
z:
[13] JDBC [online]. 2012. [cit. 20.1.2012]. http://www.orafaq.com/wiki/JDBC.
z:
Dostupn´e
[14] OSGi Service Platform Enterprise Specification [online]. 2010. [cit. 15.4.2012]. Dostupn´e z: http://www.osgi.org/download/r4v42/r4.enterprise.pdf. [15] TEAM, T. C. GPS HUNTING ADVENTURE. 2009. [16] UPTON, C. OSGi Enabled War [online]. 2012. [cit. 15.4.2012]. Dostupn´e z: http://heapdump.wordpress.com/2010/03/25/osgi-enabled-war/. [17] VENESS, C. Calculate distance, bearing and more between Latitude/Longitude points [online]. 2012. [cit. 20.4.2012]. Dostupn´e z: http://www.movable-type.co.uk/scripts/latlong.html. [18] What is Android? [online]. 2012. [cit. 15.4.2012]. Dostupn´e z: http://developer.android.com/guide/basics/what-is-android.html. [19] What Is Cocoa? [online]. 2012. [cit. 30.4.2012]. Dostupn´e z: http://developer.apple.com/library/ios/#DOCUMENTATION/ Cocoa/Conceptual/CocoaFundamentals/WhatIsCocoa/ WhatIsCocoa.html#//apple_ref/doc/uid/TP40002974-CH3-SW16. [20] Write Objective-C Code [online]. 2012. [cit. 29.4.2012]. Dostupn´e z: https://developer.apple.com/library/ios/#referencelibrary/ GettingStarted/RoadMapiOS/Languages/WriteObjective-CCode/ WriteObjective-CCode/WriteObjective-CCode.html. ˇ [21] REHOˇ r´ıK, F. Windows Phone 7 [online]. 2012. [cit. 19.4.2012].
83
A Uˇzivatelsk´a pˇr´ıruˇcka A.1 A.1.1
Serverov´ aˇ c´ ast Instalace na server
Serverov´a ˇc´ast potˇrebuje pro sv˚ uj chod servletov´ y kontejner a datab´azi. V instalaˇcn´ım adres´aˇri je k dispozici jak datab´aze(Apache Derby), tak i servletov´ y kontejner (Apache Tomcat). Pro pouˇzit´ı staˇc´ı adres´aˇre nakop´ırovat na server a spustit. Tomcat je nakonfigurov´an na port 9999, servisn´ı port 9998, Derby bˇeˇz´ı na portu 9990. Samozˇrejmˇe je moˇzn´e toto nastaven´ı zmˇenit. Porty Tomcat se mˇen´ı pomoc´ı konfiguraˇcn´ıch soubor˚ u (v´ıce v manu´alu pro Tomcat na str´ank´ach v´ yrobce). Port Derby lze snadno zmˇenit ve spouˇstˇec´ım skriptu (za argumentem -p zmˇenit ˇc´ıslo portu).
Nastaven´ı portu datab´ aze v PersistenceBundle Pokud zmˇen´ıme ˇc´ıslo portu datab´aze, je nutn´e nastavit spr´avnˇe port v souboru persistence.xml v PersistenceBundle. Stejn´ ym zp˚ usobem je samozˇrejmˇe moˇzn´e pouˇz´ıt i jinou datab´azi. <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:9990/GPSGameDB;create=true" /> Obecnˇe u ´pravou persistence.xml a dod´an´ım JDBC ovladaˇc˚ u lze pouˇz´ıt i jinou datab´azi neˇz Apache Derby.
A.2
Klientsk´ aˇ c´ ast
´ celem hry je pohyb a vyhled´av´an´ı protihr´aˇc˚ Uˇ u v hern´ım prostoru a jejich zasaˇzen´ı. Po uplynut´ı hern´ı doby hr´aˇc, kter´ y m´a nejv´ıce bod˚ u v´ıtˇez´ı.
84
Uˇzivatelsk´ a pˇr´ıruˇcka
A.2.1
Klientsk´a ˇc´ast
Pˇ rihl´ aˇ sen´ı
Po spuˇstˇen´ı aplikace se u ´vodn´ı pˇrihlaˇsovac´ı obrazovka (obr´azek A.1). Zde uˇzivatel zad´a sv´e pˇrihlaˇsovac´ı jm´eno a stiskne tlaˇc´ıtko Login. Pokud se jiˇz uˇzivatel pˇrihl´asil dˇr´ıve, aplikace si pamatuje jeho pˇrihlaˇsovac´ı jm´eno.
Obr´azek A.1: Login Activity
A.2.2
Konfigurace serveru
Uˇzivatel m˚ uˇze nakonfigurovat na jak´ y server se bude pˇrihlaˇsovat. Na pˇrihlaˇsovac´ı obrazovce stiskne tlaˇc´ıtko Menu -> Configuration. Objev´ı se mu obrazovka, kde zad´a adresu serveru a potvrd´ı. Nyn´ı se m˚ uˇze po n´avratu zpˇet (tlaˇc´ıtko Zpˇ et) pˇrihl´asit na poˇzadovan´ y server.
A.2.3
Vytvoˇ ren´ı a pˇ ripojen´ı se ke hˇ re
Po pˇrihl´aˇsen´ı si uˇzivatel mus´ı vybrat, jestli chce hru zaloˇzit, nebo se pˇripojit k vytvoˇren´e hry. Pokud se chce uˇzivatel pˇripojit ke hˇre staˇc´ı klepnout na hru ze seznamu (obrazovka je pr´azdn´a, pokud nen´ı k dispozici ˇz´adn´a hra). 85
Uˇzivatelsk´ a pˇr´ıruˇcka
Klientsk´a ˇc´ast
Vytvoˇ ren´ı hry Pokud chce uˇzivatel vytvoˇrit hru objev´ı se formul´aˇr (obr´azek A.2), kde mus´ı zadat nˇekolik u ´daj˚ u: • Game name – n´azev hry m˚ uˇze b´ yt libovoln´ y nepr´azdn´ y • Game type – je nastaven na Honˇen´a, re´alnˇe nem´a vliv na hru • Duel range – vzd´alenost v metrech, na kterou kdyˇz se hr´aˇci pˇribl´ıˇz´ı nastane duel • Shoot range – vzd´alenost, na kterou po sobˇe hr´aˇci mohou stˇr´ılet, kdyˇz se vid´ı • Game length – u ´daj v minut´ach, jak dlouh´a m´a hra b´ yt • Refresh rate – jak ˇcasto se aktualizuj´ı data ze serveru (v sekund´ach)
Obr´azek A.2: Creategame activity
86
Uˇzivatelsk´ a pˇr´ıruˇcka
A.2.4
Klientsk´a ˇc´ast
Samotn´ a hra
Po pˇrihl´aˇsen´ı do hry se hr´aˇci objev´ı obrazovka s mapou (obr´azek A.3). Na t´e vid´ı kˇr´ıˇzkem oznaˇcenou svou pozici (pˇr´ıpadnˇe m˚ uˇze dole blikat hl´aˇska Waiting for signal GPS. . . ) a vodorovn´ ymi, ˇci svisl´ ymi ˇcarami vid´ı sv´e soupeˇre. Pokud hr´aˇc vid´ı protihr´aˇce, zvol´ı ve spodn´ı ˇc´asti jeho jm´eno a stiskne Fire. Po nˇejak´e dobˇe hr´aˇc zjist´ı v´ ysledek v´ ystˇrelu (protihr´aˇc m˚ uˇze v´ ystˇrel odm´ıtnout s t´ım, ˇze ho hr´aˇc nevidˇel). Pokud se hr´aˇci pˇribl´ıˇz´ı natolik, ˇze je vzd´alenost menˇs´ı neˇz nastavena v Duel range nast´av´a duel. V tomto pˇr´ıpadˇe hr´aˇc mus´ı co nejrychleji zm´aˇcknout tlaˇc´ıtko dialogu, protoˇze vyhr´av´a ten, kter´ y byl rychlejˇs´ı.
Obr´azek A.3: Map activity
A.2.5
V´ ymˇ ena komponent
K dispozici jsou dvˇe dalˇs´ı komponenty: jedna simuluj´ıc´ı polohu, druh´a simuluj´ıc´ı komunikaci se serverem slouˇz´ıc´ı pouze pro orientaci na mapˇe. Komponenty pouˇzijeme n´asleduj´ıc´ım postupem:
87
Uˇzivatelsk´ a pˇr´ıruˇcka
Klientsk´a ˇc´ast
1. Pˇreps´an´ı soubor˚ u bundl˚ u – nejdˇr´ıve mus´ıme pˇrepsat soubory v SD karta \ gpsGame \ felix \ bundles 2. Vymaz´an´ı cache Felix – pot´e je nutn´e vymazat cache Felix – smaz´an´ı adres´aˇre felix cache 3. Ukonˇcen´ı aplikace – pokud aplikace st´ale bˇeˇz´ı je tˇreba ji ukonˇcit (vˇcetnˇe spuˇstˇen´e sluˇzby) 4. Spuˇstˇen´ı aplikace – nyn´ı m˚ uˇzeme aplikaci spustit s nov´ ymi komponentami
A.2.6
Ukonˇ cen´ı aplikace
Po ukonˇcen´ı aplikace obˇcas z˚ ust´av´a bˇeˇzet sluˇzba FelixService. Pro ˇr´adn´e ukonˇcen´ı je potˇreba sluˇzbu ukonˇcit (bˇeˇz´ıc´ı sluˇzba nijak nebr´an´ı fungov´an´ı aplikace, nebo ˇcehokoliv jin´eho). Sluˇzba jde ukonˇcit pˇres Menu->Nastaven´ı>Aplikace->Spr´ ava sluˇ zeb. Pot´e se nˇekdy znova spust´ı aplikace, kter´a kdyˇz se znova ukonˇc´ı jiˇz nic nen´ı spuˇstˇeno.
88