62
SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA DIPLOMSKI RAD br. 780 GEOPROSTORNI SUSTAV OBJAVI- PRETPLATI ZA UREĐAJE S OPERACIJSKIM SUSTAVOM ANDROID Antun Sekulić Zagreb, srpanj 2014.

GEOPROSTORNI SUSTAV OBJAVI- PRETPLATI ZA UREĐAJE … › datoteka › 768564.Final_0246012693_53.pdfpametni televizori i pametni ručni satovi. Operacijski sustav je razvijen na jezgri

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

  • SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA

    DIPLOMSKI RAD br. 780

    GEOPROSTORNI SUSTAV OBJAVI-PRETPLATI ZA UREĐAJE S

    OPERACIJSKIM SUSTAVOM ANDROID

    Antun Sekulić

    Zagreb, srpanj 2014.

  • svEuetltSre u ZAGREBUFAKU LTET ELEKTROTEHNIKE I NNCUruARSTVAODBOR ZA DIPLOMSKI RAD PROFILA

    Zagreb, 1 0. oZujka 2014.

    Pristupnik:Studij:Profil:

    Zadatak:

    DIPLOMSKI ZADATAK br. 780

    Antun Sekuli6I nformacijska i komunikacijska tehnologijaTelekomunikacije i informatika

    Geoprostorn i s ustav objavi -pretplati za uredaie s operacijs ki m sustavomAndroid

    Opis zadatka:

    U modelu objavi-pretplati postoje dvije vrste korisnika, a to su pretplatnici i objavljivadi. Pretplatniciaktiviraju pretplate kojima se pretplacuju na podatke koje objavljuju objavljivadi. Sustav objavi-pretplatije posrednik u komunikaciji izmedu objavljivada i pretplatnika. On usporeduje nove objave s aktivnimpretplatama i isporuduje ih zainteresiranim pretplatnicima. Usporedba izmedu objava i pretplata se upostoje6im sustavima objavi-pretplati temelji na njihovom sadrZaju i najdeS6e je definirana Booleovomfunkcijom.VaS zadatak je osmisliti, programski izvesti i testirati geoprostorni sustav objavi-pretplati u kojem suobjave i pretplate definirane kao geoprostomi objekti (npr. todke, linije, poligoni) s dodatno pridruZenimsadrZajem. Pri tome definirajte i programski izvedite realne funkcije usporedbe razliditih vrstageoprostomih objekata. Osim toga, proudite i odaberite pogodne nadine za unos i vizualizacijugeoprostornih pretplata i objava na uredajima s operacijskim sustavom Android. lsporuku objavapretplatnicima ostvarite kori5tenjem programskog okvira Google Cloud Messaging for Android (GCM)koji omogucava prosljedivanje poruka na uredaje s operacijskim sustavom Android bez- prethodnogeksplicitnog zahtjeva korisnika. Ostvareni geoprostorni sustav objavi-pretplati ispitajte na odabranomstudijskom sludaju.Svu potrebnu literaturu i uvjete zarad osigurat 6e Vam Zavod za telekomunikacije.

    Zadatak uruden pristupniku : 1 4. olujka 201 4.Rok za predaju rada: 30. lipnja 2014.

    Mentor:oY q ?t''< rt'

    Predsjednik odbora zadiplomski rad profila:

  • Sadržaj Uvod ....................................................................................................................................... 1  

    1.   Arhitektura sustava ......................................................................................................... 2  

    1.1.   Model objavi-pretplati ............................................................................................. 2  

    1.2.   Objave ...................................................................................................................... 2  

    1.2.1.   Pretplate ............................................................................................................ 3  

    1.2.2.   Poslužitelj .......................................................................................................... 3  

    1.2.3.   Geoprostorni sustav obajvi-pretplati ................................................................. 3  

    1.3.   Operacijski sustav Android ...................................................................................... 4  

    1.3.1.   Komponente aplikacija ..................................................................................... 5  

    1.3.2.   Usluga GCM ................................................................................................... 11  

    1.3.3.   Slanje poruka .................................................................................................. 13  

    1.4.   PostgreSQL baza podataka .................................................................................... 15  

    1.4.1.   Dodatak PostGIS ............................................................................................. 15  

    1.4.2.   Određivanje udaljenosti između geoprostornih objekata ................................ 20  

    2.   Geoprostorni poslužitelj objavi-pretplati ...................................................................... 25  

    2.1.1.   Implementacija poslužitelja ............................................................................ 26  

    2.2.   Zadaće aplikacijskog poslužitelja .......................................................................... 26  

    2.2.1.   Obrađivanje korisničkih zahtjeva ................................................................... 27  

    2.2.2.   Pohranjivanje podataka u bazu ....................................................................... 30  

    2.2.3.   Slanje poruka GCM poslužitelju ..................................................................... 32  

    2.3.   Poslužitelj baze podataka ....................................................................................... 33  

    3.   Klijentska aplikacija ...................................................................................................... 35  

    3.1.   Stvaranje i otkazivanje pretplata ............................................................................ 36  

    3.2.   Stvaranje objava ..................................................................................................... 38  

    3.3.   Prikazivanje primljenih objava .............................................................................. 39  

  • 3.4.   Implementacija klijntske aplikacije ....................................................................... 40  

    4.   Analiza rada sustava ..................................................................................................... 43  

    4.1.   Analiza pohranjivanja pretplata ............................................................................. 43  

    4.2.   Analiza objavljivanja objava .................................................................................. 44  

    Zaključak .............................................................................................................................. 49  

    Literatura .............................................................................................................................. 50  

    Sažetak ................................................................................................................................. 51  

    Summary .............................................................................................................................. 52  

    Privitak ................................................................................................................................. 53  

    Podešavanje GCM i Google Map usluge ......................................................................... 53  

    Testiranje poslužitelja ...................................................................................................... 56  

  • 1

    Uvod

    U današnje vrijeme se suočavamo s velikom količinom informacija koje dolaze iz raznih

    izvora poput televizije, radija, interneta i sve više s naših pametnih telefona. Vrlo se lako

    može dogoditi da smo propustili informaciju koja nam je u tom trenutku važna. Primjer

    takve situacije bi bila prometna nesreća na putu kojim obično vozimo s posla do kuće.

    Pretpostavimo li da je vijest o nesreći prenesena preko radio postaje koju nismo slušali,

    posljedica neprimanja informacije bi mogla biti višesatno čekanje u prometnoj gužvi.

    U radu je prezentiran i ostvaren model sustava objavi-pretplati koji koristi geoprostorne

    objekte za definiranje objava i pretplata kojim bi se mogao riješiti opisan problem. U

    prvom poglavlju dan je opis sustava objavi- pretplati, kao i komponenti koje se koriste za

    ostvarivanje geoprostornog sustava objavi-pretplati. U drugom poglavlju se ulazi u

    detaljniju analizu i implementaciju samoga poslužitelja, dok je u trećem poglavlju opisana

    klijentska aplikacija i način na koji se koristi. U zadnjem poglavlju napravljena je analiza

    rada poslužitelja, pošto on predstavlja usko grlo u radu sustava.

  • 2

    1. Arhitektura sustava

    Za ostvarivanje sustava objavi-pretplati koji svoje objave i pretplate definira pomoću

    lokacije potrebno je razumjeti kako radi klasični objavi sustav pretplati i od kojih se

    komponenti sastoji. Pri razvoju geoprostornog sustava objavi-pretplati javlja se nekoliko

    problema. Glavni problemi su implementacija pokretnog klijenta koji može primati i slati

    objave, i definiranje geoprostornih objektata koje razmjenjuju klijenti i poslužitelj.

    Također, potrebno je riješiti problem pohrane i obrade geoprostornih objekta na

    poslužitelju.

    1.1. Model objavi-pretplati

    Kod informacijskih sustava u kojima je potrebno razmjenjivati veliki broj poruka između

    velikog broja subjekata, često se koristi programski obrazac objavi-pretplati. Ovakav

    model oblikovanja sustava prvi se put spominje u [1] pri opisu podsustava za distribuciju

    vijesti.

    Model objavi-pretplati definira postojanje dvije vrste krajnjih čvorova koji međusobno

    razmjenjuju poruke preko poslužitelja. Prva vrsta su objavljivači (publishers) koji stvaraju

    objave, a druga vrsta subjekata su pretplatnici (subscribers) koji primaju objave od

    interesa. Važno je naglasiti da objavljivači i pretplatnici nikada ne komuniciraju izravno

    jedni s drugima i jedni ne znaju za postojanje drugih, već umjesto toga komuniciraju

    isključivo preko poslužitelja

    1.2. Objave

    Kako bi ostvarili ovakav sustav razmjene objava, nužno je da se svaka objava koju

    objavljivač stvori sastoji od dvije vrste podataka. Prva vrsta podataka je sam sadržaj objave

    koji se želi prenijeti pretplatnicima i on može biti bilo kojeg formata. Tako postoje objave

    u kojima se prenose slike, tekstualni podatci, multimedijalni zapisi i drugo. Osim toga,

    svaka objava sadrži i drugu vrstu podataka koju nazivamo metapodatcima. Metapodatci su

    u suštini ključne riječi koje opisuju samu objavu i na temelju njih će poslužitelj odrediti

    koje pretplatnike zanima koja objava. Za razne objavi-pretplati sustave postoje razne vrste

  • 3

    metapodataka. Tako na primjer, ako je generirana objava neka vrsta vijesti koju prenosi

    određena novinska agencija, metapodatci bi mogli opisivati tip generirane vijesti (npr.

    sport, vremenska prognoza, crna kronika i slično).

    1.2.1. Pretplate

    Pretplatnici kao krajnji primatelji objava unaprijed definiraju koje vrste objava žele primati

    definiranjem pretplata. Određivanje pretplata se svodi na određivanje metapodatka koji

    zanimaju pretplatnika i njihovo dojavljivanje poslužitelju. Svaki pretplatnik dojavljuje

    poslužitelju i svoju adresu na koju želi primati objave. Svaki poslužitelj omogućuje

    pretplatnicima definiranje pretplata iz poznatog skupa metapodataka s kojim poslužitelj

    zna raditi. Tako na primjer pretplate mogu bit samo vijesti vezane za sport, određeni

    sportski klub ili samo za određenu nogometnu utakmicu, ako se radi o sustavu objavi-

    pretplati koji je specijaliziran za sportske vijesti.

    1.2.2. Poslužitelj

    Poslužitelj kao centralno mjesto u objavi-pretplati sustavu, mora održavati bazu podatka u

    kojoj su pohranjene informacije o pretplatnicima. Ako sustav nudi određene vremenske

    operacije nad objavama, potrebno je pohranjivati i sve pristigle objave od objavljivača.

    Primjer vremenske operacije bi bilo definiranje vremena kada pretplatnici žele primati

    objave. U takvom sustavu bi poslužitelj pohranjivao objave za pojedinog korisnika i

    isporučivao ih u navedenom trenutku. Suprotni, jednostavniji primjer rada je prosljeđivanje

    objava pretplatnicima onda kada ih objavljivači generiraju. Nakon primanja objave od

    objavljivača, poslužitelj provodi određeno filtriranje i grupiranje objava i korisnika, te

    prosljeđuje objave na temelju tih operacija.

    Komunikacija poslužitelja s pretplatnicima je dvosmjerna, što znači da pretplatnici

    poslužitelju dojavljuju svoje pretplate, a poslužitelj pretplatnicima isporučuje objave.

    Komunikacija između poslužitelja i objavljivača je jednosmjerna, što znači da objavljivači

    samo prosljeđuju svoje objave poslužitelju.

    1.2.3. Geoprostorni sustav obajvi-pretplati

    U geoprostornom sustavu objavi-pretplati objave i pretplate, osim standardnih meta

    podataka, sadrže i informacije o lokaciji. U takvom sustavu se pretplatnici pretplaćuju na

  • 4

    određeno područje za koje žele primati obavijesti, a objavljivači u svaku objavu uključuju

    podatke o njenoj lokaciji.

    U takvom sustavu poslužitelj mora znati raditi s geoprostornim objektima kao što su točke,

    linije i poligoni. To znači da poslužitelj mora posjedovati mehanizme pohrane takve vrste

    podatka i određivanje njihovih međusobnih odnosa. Ovdje se prvenstveno misli na

    definiranje njihove međusobne udaljenosti. Mehanizam određivanja udaljenosti između

    objekata se koristi u određivanju korisnika kojima će se proslijediti određena objava.

    Aplikacija koju koriste pretplatnici treba pružati korisničko sučelje pomoću kojega se

    mogu definirati prostorne pretplate.

    Isto tako i objavljivači pri stvaranju obavijesti trebaju korisničko sučelje preko kojega će

    generirati objave i odrediti prostorne informacije za te objave.

    1.3. Operacijski sustav Android

    Operacijski sustav Android je jedan od najpopularnijih operacijskih sustava za pametne

    telefone i tablete, a u zadnje vrijeme se koristi i u velikom broju drugih uređaja. Primjer su

    pametni televizori i pametni ručni satovi. Operacijski sustav je razvijen na jezgri

    opercijskog sustava Linux, i javno je dostupan (open source), što ga je učinilo vrlo

    popularnim u razvijateljskoj zajednici (developers community), kako i kod velikog broja

    kompanija koje žele jeftini operacijski sustav za svoju potrošačku elektroniku. Vodeće

    svjetske kompanije kao što su Samsung, HTC, LG i Motorola razvijaju pametne telefone i

    tablete bazirane na ovom operacijskom sustavu.

    Aplikacije za Android operacijski sustav su pretežno pisane u programskom jeziku Java i

    prevedene pomoću Android SDK alata u izvršni kod koji se pokreće na Dalvik virtualnom

    stroju. No aplikacije je moguće razvijati i u nekoliko drugih programskih jezika i

    tehnologija, kao što su HTML5 i Scala.

    Svaka aplikacija za Android se izvodi unutar svojeg sigurnog prostora na operacijskom

    sustavu (sandbox). Pošto je Android višekorisnički operacijski sustav, svaka aplikacija se

    tretira kao zasebni korisnik kojem je dodijeljen jedinstveni korisnički ID, koji koristi samo

    operacijski sustava i nepoznat je aplikaciji. Sustav potom dodjeljuje dozvole za rad svim

    datotekama u aplikaciji za dodijeljeni ID aplikacije, tako da im samo aplikacija u čijem su

  • 5

    vlasništvu može pristupiti. Dodatno, svaki proces u operacijskom sustavu se izvršava na

    vlastitom virtualnom stroju, kako bi ga se izoliralo od ostalih aplikacija.

    1.3.1. Komponente aplikacija

    Svaku aplikaciju za Android operacijski sustav pisanu u programskom jeziku Java,

    možemo logički podijeliti u nekoliko osnovnih građevinskih blokova, tj. u logičke cjeline

    koje obavljaju određenu vrstu posla. Svaka komponenta predstavlja točku kroz koju sustav

    može pristupiti aplikaciji. Ne predstavljaju sve komponente konkretni ulaz u aplikaciju

    preko kojih joj korisnik može pristupiti, ali svaka komponenta postoji kao zasebni entitet i

    obavlja specifičnu ulogu.

    Postoji pet vrsta osnovnih komponenti od kojih svaka definira svoj životni ciklus, tj. kako

    nastaje i kada će biti uništena i dodatno manifest datoteka.

    Manifest datoteku sadrži svaka aplikacija. U njoj se nalazi opis aplikacije sa svim

    njezinim komponentama, kao i informacije koje koristi operacijski sustav za pokretanje i

    izvođenje aplikacije.

    Aktivnost (activity) je osnovna komponenta svake aplikacije. Ona omogućava

    prikazivanje korisničkog sučelja i interakciju između korisnika i aplikacije. Postoji

    nekoliko vrsta aktivnosti koje mogu zauzimati razne veličine zaslona, ali pretežno se

    koriste tako da zauzimaju cijeli zaslon. Većina aplikacija se najčešće sastoji od više

    aktivnosti od kojih svaka obavlja svoj posao. Pri promjeni aktivnosti operacijski sustav

    vodi računa o održavanju FIFO stoga (First In First Out) na koji se pohranjuje prethodna

    aktivnost. Kada korisnik pritisne tipku za povratak (back), sa stoga se uzima prethodna

    stavljena aktivnost i ona postaje glavna aktivnost. Životni ciklus svake aktivnosti počinje

    pozivom metode onCreate(), a završava pozivom metode onDestroy(). U

    životnom ciklusu svake aktivnosti postoji još nekoliko metoda, koje također poziva

    operacijski sustav. Tako još postoji metoda onStart(), koja se poziva neposredno prije

    nego aktivnost postane vidljiva korisniku, onResume(), koja se poziva kada je aktivnost

    postala vidljiva, onPause(), koja se poziva kada će se aktivnost zaustaviti i metoda

    onStop() koje se poziva kada se aktivnost zaustavi. Za aktivnost kažemo da je aktivna

    ako se nalazi, gledano po pozivima metoda, između poziva onResume() i onPause().

    U aktivnoj fazi korisnik može vršiti interakciju s aktivnosti. Kada korisnik prestane

  • 6

    koristiti trenutnu aktivnost, tj. kada se pozove metoda onPause(), aktivnost će prijeći u

    pauzirano stanje. Pauzirano stanje označava da sustav u radnoj memoriji drži sve podatke o

    aktivnosti i da je ona još uvijek vezana za upravitelja prozorima (window manager). Sustav

    ju može brzo vratiti u aktivno stanje pozivom metode onResume() ako to korisnik

    zatraži. Ako je pozvana metoda onStop(), to označava da je aktivnost otišla u pozadinu

    (background). U ovom stanju sustav još uvijek u radnoj memoriji drži većinu informacija

    o aktivnost, ali ona nije vezana za upravitelja prozorima i sustav ju može obrisati iz

    memorije ako neka druga aktivnost s višim prioritetom zahtijeva dodatnu radnu memoriju.

    Ako se to dogodi, pri ponovnom stvaranju obrisane aktivnosti ponovno se poziva metoda

    onCreate(). Također je moguće vraćanje korisnika na aktivnost koja je u pozadini prije

    nego ju sustav obriše iz radne memorije. Tada se prvo poziva metoda onRestart(), pa

    zatim metoda onStart().

    Slika 1.1 Životn ciklus aktivnosti, preuzeto s [2]

  • 7

    Aktivnost se stvara nasljeđivanjem klase Activity. Svaka aktivnost u aplikaciji mora

    imati svoju definiciju u manifest.xml datoteci, unutar oznaka aplikacije (application tag).

    ...

    ...

    Kod 1.1 Definiranje aktivnosti u manifest datoteci

    Dodatno, početna aktivnost mora sadržavati parametre kojima se obavještava sustav da nju

    prvu pokrene pri paljenju aplikacije.

    Kod 1.2 Definiranje dodatnih parametara aktivnosti

    Pokretanje nove aktivnosti iz trenutne se ostvaruje pozivanjem metode

    startActivity(), kojoj predajemo objekt Intent koji opisuje aktivnost koju želimo

    pokrenuti.

    Intent intent = new Intent(this, SignInActivity.class);

    startActivity(intent);

    Usluga (service) predstavlja komponentu sustava koja izvršava operacije u pozadini na

    zasebnoj dretvi. Ova komponenta ne sadrži korisničko sučelje i uglavnom se koristi kada

    želimo obavljati neke radnje bez blokiranja korisničkog sučelja. Primjer takve operacije bi

    bilo puštanje glazbe, dohvaćanje podatka s mreže, snimanje ili čitanje podataka s diska.

  • 8

    Dodatna razlika između aktivnosti i usluge je u tome što se usluga jedne aplikacije može

    izvršavati u pozadini čak i ako je druga aplikacija trenutno preuzela fokus, to jest, trenutno

    je aktivna. Usluge omogućavaju spajanje s drugim komponentama (binding), koje ne

    moraju biti dio aplikacije kojoj pripada usluga. Time je moguće ostvariti međuprocesnu

    komunikaciju (interprocess communication, IPC).

    Usluga može imati dva oblika:

    • Pokrenuta usluga (started service) je usluga koja je pokrenuta od strane

    druge komponente poput aktivnosti pozivanjem metode

    startService(). Jednom pokrenuta, usluga se izvodi u pozadini

    neodređeno dugo, čak i ako je komponenta koja ju je pokrenula

    zaustavljena. Ovakva vrsta usluge se koristi kada želimo obaviti određeni

    posao na drugoj dretvi, neovisno o aplikaciji koju koristimo. Samoj usluzi

    se prepušta logika zaustavljanja kada završi s poslom. Primjer korištenja

    ovakve usluge bio bi dohvat podataka s mreže ili reprodukcija glazbe.

    • Povezana usluga (bounded service) nastaje povezivanjem druge

    komponente s uslugom pozivom metode bindService(). Usluga tada

    pruža sučelje preko kojega ta komponenta može komunicirati s njom.

    Povezana usluga je pokrenuta onoliko dugo dok ima komponenti koje su

    povezane s njom. Komponenta prekida vezu s uslugom pozivom metode

    onUnbind().

    Isto kao i aktivnosti, usluge je potrebno navesti u manifest datoteci unutar oznaka

    aplikacije kako bi operacijski sustav bio svjestan njihovog postojanja.

    ...

    ...

    Kod 1.3 Definiranje usluge u manifest datoteci

  • 9

    Pokretanje usluga iz drugih komponenti se izvodi pozivom metode

    startService()kojoj predajemo Intent koji opisuje uslugu koju želimo pokrenuti.

    Intent intent = new Intent(this, HelloService.class);

    startService(intent);

    Slika 1.2 Životni ciklus usluge, preuzeto s [2]

    Pružatelji sadržaja (content providers) su komponente koje predstavljaju objekte koji

    upravljaju skupom podataka koji se može dijeliti između aplikacija. Podaci kojima

    upravljaju se mogu pohranjivati na datotečni sustav operacijskog sustava, u bazu podataka

    SQLite, na mrežnog poslužitelja ili u bilo koji drugi oblik trajne pohrane podataka kojoj

    aplikacija može pristupiti. Tako na primjer sam operacijski sustav Android definira

    nekoliko javnih pružatelja sadržaja pomoću kojih možemo pristupiti kontaktima koji su

    spremljeni na uređaju, SMS porukama i slično. Iako im je primarna namjena dijeljenje

    podataka između aplikacija, ove komponente su također korisne pri radu s privatnim

    skupom podataka jer pružaju jednostavno sučelje za upravljanje s podacima.

  • 10

    Kao i prethodne dvije komponente, i pružatelji sadržaja moraju biti navedeni u manifest

    datoteci.

    . . .

    Kod 1.4 Definiranje pružatelja sadržaja u manifest datoteci

    Primatelji objavljenih namjera (broadcast receivers) su komponente koje od

    operacijskog sustava primaju objave globalnih namjera. Ovim načinom komunikacije

    operacijski sustav može jednostavno obavijestiti sve zainteresirane aplikacije o određenom

    događaju. Tako na primjer Android redovno šalje poruke o stanju baterije, gašenju ekrana i

    stanju mreže. Aplikacije također mogu odašiljati ovakvu vrstu obavijesti svim

    zainteresiranim aplikacijama. Iako ova komponenta ne definira vlastito korisničko sučelje,

    može stvoriti statusnu obavijest (notification) o tome da se dogodio neki događaj u

    operacijskom sustavu.

    Fragmenti (fragments) su komponente sustava koje se prvenstveno koriste za prikazivanje

    sadržaja unutar aktivnosti. Modeliranje sadržaja unutar fragmenta omogućava aktivnosti da

    promjenom aktivnog fragmenta promjeni sadržaj na ekranu. U suprotnom slučaju bi za

    promjenu sadržaja bilo potrebno promijeniti aktivnu aktivnost, što ponekad nije praktično

    rješenje. Fragmenti također omogućuju separaciju programske logike čime se postiže bolja

    preglednost i iskoristivost napisanog koda.

  • 11

    1.3.2. Usluga GCM

    Google Cloud Messaging for Android (GCM) je usluga koja omogućava razmjenu kratkih

    poruka, veličine do 4 kb, između poslužitelja i klijentske aplikacije koja se izvodi na

    uređaju s Android operacijskim sustavom. Razmjena poruka je dvosmjerna, što znači da

    poslužitelj može klijentu poslati poruku, i klijent mu može odgovoriti.

    Svaka aplikacija koja se izvodi na operacijskom sustavu Android može, ako ima

    dopuštenje korisnika, zatražiti od GCM poslužitelja svoj jedinstveni identifikator (push

    ID). Ovaj identifikator omogućuje da Android zna točno kojoj aplikaciji treba proslijediti

    poruku od GCM poslužitelja. Kada aplikacija dobije jedinstveni identifikator mora ga

    dojaviti aplikacijskom poslužitelju. U modelu komunikacije objavi-pretplati dobiveni

    identifikator predstavlja korisnikovu adresu na kojoj želi primati objave.

    U sustavu GCM razlikujemo dvije vrste poslužitelja kao što je prikazano na slici 1.3:

    • Spojni poslužitelji – su niz poslužitelja između klijenta i aplikacijskog

    poslužitelja. Oni su zaduženi za prihvat, pohranjivanje i prosljeđivanje

    poruke od aplikacijskog poslužitelja do klijenta. Ovim poslužiteljima

    upravlja tvrtka Google.

    • Aplikacijski poslužitelj kojima upravlja razvijatelj aplikacije. Njegova

    osnovna uloga je pohrana korisničkih pretplata i identifikatora (push ID)

    koje dobiva od klijenata, kao i prosljeđivanje poruka GCM spojnom

    poslužitelju.

    Slika 1.3 Arhitektura sustava za slanje poruka, preuzeto s [2]

  • 12

    Aplikacijski poslužitelj je zadužen za pohranjivanje korisnikovog jedinstvenog

    identifikatora s drugim relevantnim podatcima o tom korisniku, kao što su na primjer

    njegove pretplate. Slanje poruke od aplikacijskog poslužitelja do korisnika se odvija

    posredstvom GCM poslužitelja. Tijelo i format poruke koja se šalje od aplikacijskog

    poslužitelja do GCM poslužitelja ovisi o protokolu koji se koristi za komunikaciju.

    Trenutno je moguće odabrati HTTP ili XMPP (Extensible Messaging and Presence

    Protocol) [13] protokol. Za slanje poruke pomoću HTTP protokola potrebno je poslati

    HTTP POST zahtjev na adresu GCM poslužitelja (točna adresa u privitku). Za slanje

    tekstualnih poruka HTTP zahtjev mora sadržavati sljedeća HTTP zaglavlja:

    Authorization: key = 'ključ aplikacije'

    Content-Type: aplication/json (ako šaljemo JSON objekt kao

    poruku) ili application/x-www-form-urlencoded;charset=UTF-8

    ako šaljemo običan tekst kao poruku.

    Kod 1.3 HTTP zaglavlja za slanje poruke GCM poslužitelju

    Pretplatnike kojima želimo poslati poruke navodimo u JSON polju imena

    “registration_id”. Podatke koje šaljemo navodimo u JSON objektu ime “data”.

    Content-Type:application/json

    Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA

    {

    "registration_ids" : ["APA91bHun4MxP5egoKMwt2KZFBaFUH-

    1RYqx..."],

    "data" : {

    ...

    },

    }

    Kod 1.4 Tijelo HTTP zahtjeva

  • 13

    1.3.3. Slanje poruka

    Općeniti redoslijed izvođenja operacija potrebnih za slanje poruka između klijentske

    aplikacije i aplikacijskog poslužitelja je prikazana na UML sekvencijskom dijagramu na

    slici 1.4:

    1. Registracija za uslugu GCM.

    Klijentska aplikacija zatražuje od GCM poslužitelja svoj jedinstveni identifikator (push

    ID). Svaka aplikacija koja želi koristiti uslugu GCM mora u svojoj manifest datoteci

    dodati sljedeće zahtjeve za dopuštenje korisnika:

    Kod 1.5 Navođenje dopuštenja u manifest datoteci

    Prvi zahtjev se odnosi na dozvolu za pristup Internet mreži, dok se druga dva odnose na

    korištenje usluge GCM.

    2. Obavještavanje aplikacijskog poslužitelja.

    Nakon što je aplikacija dobila push ID od GCM poslužitelja, mora ga dojaviti

    aplikacijskom poslužitelju s drugim važim parametrima potrebnim za rad usluge. Ova se

    komunikacija najčešće odvija preko HTTP protokola, gdje klijent pošalje HTTP POST

    zahtjev sa svim parametrima na adresu aplikacijskog poslužitelja, na što aplikacijski

    poslužitelj odgovara s porukom o uspješnosti ili o pogrešci registracije.

    3. Slanje poruke GCM poslužitelju.

    Sljedeći korak je slanje poruke od aplikacijskog do GCM poslužitelja. Kao što je ranije

    opisano, moguće je koristiti HTTP ili XMPP protokol. Pri primitku poruke, GCM

    poslužitelj određuje hoće li pohraniti poruku, ako je klijent trenutno nedostupan, ili će ju

  • 14

    odmah proslijediti. Aplikacijski poslužitelj može odrediti koliko dugo GCM treba čuvati

    poruku, odnosno koliko dugo je poruka aktivna, dodavanjem dodatnog parametra

    time_to_live u zaglavlje poruke. Ako istekne vrijeme definirano u ovom zaglavlju

    GCM poslužitelj neće proslijediti poruku klijentu kada on postane dostupan. Također,

    moguće je definirati parametar delay_while_idle, koji ukazuje GCM poslužitelju da

    pošalje samo zadnju poruku kada klijent postane aktivan. Drugim riječima, ako je klijent

    dostupan primati će sve poruke, a ako je nedostupan u trenutku generiranja poruka, dobit

    će samo zadnju poruku kada postane dostupan.

    4. Slanje poruke od GCM poslužitelja do klijenta

    Kada je klijent dostupan GCM poslužitelj prosljeđuje poruku klijentu. Pri primitku poruke,

    Android operacijski sustav prosljeđuje poruku pomoću posebne namjere objavljivanja

    (broadcast intent) do aplikacije koja ima potrebne ovlasti (permissions). Ovim se ujedno

    osigurava da će jedino klijentska aplikacija pročitati sadržaj poruke, obraditi ga i izvesti

    odgovarajuće akcije kao što su prikazivanje obavijesti, puštanje zvuka kojim se indicira

    nova poruka i slično.

    5. Slanje odgovora aplikacijskom poslužitelju.

    Nakon što je GCM poslužitelj proslijedio poruku svim klijentima odgovara aplikacijskom

    poslužitelju statusnom porukom u kojoj se nalaze informacije o uspješno i neuspješno

    poslanim porukama.

  • 15

    Slika 1.4 UML sekvencijski dijagram komunikacije za slanje poruka

    1.4. PostgreSQL baza podataka

    PostgreSQL je objektno-relacijska baza podataka (Object-Relational Database

    Management System, ORDBMS) otvorenog koda (open source) napisana u programskom

    jeziku C. U razvoju je od 1995. godine, i moguće ju je pokrenuti na većini operacijskih

    sustava. PostgreSQL je odabran radi svojih mogućnosti jednostavnog pohranjivanja i rada

    s geoprostornim objektima. Pošto je baza besplatna i jednostavno se podešava vrlo je

    popularna pri radu s geoinformacijskim sustavima.

    1.4.1. Dodatak PostGIS

    Baza podataka PostgreSQL je proširiva s nizom dodataka koji omogućuju mnoge dodatne

    funkcije. Jedan od tih dodataka je i PostGIS koji omogućuje pohranjivanje i rad s

    geometrijskim i geoprostornim objektima. Također omogućuje i izvršavanje cijelog niza

    dodatnih lokacijski vezanih upita nad skupom podataka u bazi. Primjer jednog takvog upita

    nad bazom podataka u kojoj imamo tablice grad i superheroj, u kojima su

  • 16

    spremljene lokacije gradova s njihovim imenima, i lokacije superheroja s njihovim

    imenima bi bio:

    SELECT superheroj.ime

    FROM grad, superheroj

    WHERE ST_Contains(grad.lokacija, superheroj.lokacija)

    AND grad.ime = ‘Gotham’;

    Kod 1.6 Primjer upita u bazi podataka PostgreSQL

    U ovom upitu želimo dobiti sva imena superheroja koji se trenutno nalaze na lokaciji koja

    se zove ’Gotham’. Rezultat ovog upita je naravno Batman. U ovom primjeru je važno

    uočiti korištenje funkcije ST_Contains() koja vraća vrijednost tipa boolean. Funkcija

    prima dva parametra geometrijskoj kolekcij geomA i geomB, a vraća boolean vrijednost

    true ako i samo ako u geometrijskoj kolekciji geomB postoji barem jedna točka koja se

    nalazi u geometrijskoj kolekciji geomA. U suprotnom vraća boolean vrijednost false.

    Rad s ovim objektima se temelji na normama koje je definirala Međunarodna organizacija

    za standardizaciju (International Organization for Standardization ISO) i OGC (Open

    Geospatial Consortium). OCG je međunarodni dobrovoljni konzorcij osnovan 1994.

    Postoji preko 400 komercijalnih, vladinih, neprofitnih i istraživačkih organizacija diljem

    svijeta koje su pristupile ovom konzorciju s ciljem organizacije i standardizacije

    geoprostornih sadržaja i usluga.

    Dodatak PostGIS omogućuje rad s metodama koje definira OpenGIS [14]. Metode

    možemo podijeliti u pet osnovnih kategorija:

    1. Upravljačke metode

    Omogućavaju upravljanje s bazom podataka koja koristi geoprostorne objekte,

    točnije za manipulaciju tablica u bazi. Tako postoje metode za dodavanje i brisanje

    stupca, za pohranu geoprostornih objekata i općenito za podešavanje tablica.

    2. Relacijske metode

    Pomoću relacijskih metoda ispitujemo relacije između dva geoprostorna objekta.

    Popis najčešće korištenih relacijskih funkcije s kratkim opisom je dan u tablici 1.1

  • 17

    3. Metode za obradu objekta

    Ove metode definiraju operacije pomoću kojih možemo obrađivati geoprostorne

    objekte. Primjer nekih od operacija za obradu je dan u tablici 1.2 s kratkim opisom

    svake metode.

    4. Pomoćne metode

    Pomoćne metode definiraju pomoćne operacije nad objektima. Tako postoje

    metode za pretvaranje geoprostornog objekta u tekstualni zapis (ST_AsText()),

    razne metode za dohvaćanje određenih točaka u raznim objektima kao što su linije i

    poligoni i slične metode.

    5. Metode za konstrukciju objekata

    Metode za konstrukciju objekata omogućuju stvaranje objekata. Tako postoje

    metode za stvaranje objekta iz raznih formata tekstualnog zapisa

    (ST_GeomFromText(), ST_PointFromText(),

    ST_LinestringFromText(),... )

    Tablica 1.1 Primjer relacijskih metoda u dodatku PostGIS

    Ime metode Kratki opis

    ST_Distance() Vraća udaljenost između dva geoprostorna objekta u odabranoj

    mjernoj jedinici

    ST_DWithin() Vraća boolean vrijednost true ako se objekti nalaze unutar

    definirane udaljenosti jedan od drugoga.

    ST_Within() Vraća boolean vrijednost true ako se objekt A u potpunosti nalazi

    unutar objekta B

    ST_Equals() Vraća boolean vrijednost true ako su objekti prostorno jednaki.

    Preporučuje se koristiti za usporedbu umjesto =

    ST_Intersects() Vraća boolean vrijednost true ako se objekti prostorno presijecaju

    ST_Touches() Vraća boolean vrijednost true ako se objekti prostorno dodiruju

  • 18

    Tablica 1.2 Primjer upravljačkih metoda u dodatku PostGIS

    Pri radu s dodatkom PostGIS razlikujemo dvije vrste prostornih objekata. To su

    geometrijski i geoprostorni objekti.

    Geometrijski objekti definiraju objekte u Kartezijevom koordinatnom sustavu. Pogodni

    su za korištenje ako baza podataka obuhvaća manje geografsko područje nad kojim

    Kartezijev koordinatni sustav pruža dovoljno dobru aproksimaciju. Postoji više metoda za

    rad s geometrijskim objektima nego s geoprostornim objektma. Izvođenja metoda koje

    kao parametar primaju geoprostorne ili geometrijske objekte traje kraće pri radu s

    geometrijskim objketima, tj. metode su tada procesorski manje zahtjevne.

    Geoprostorni objekti definiraju objekte u sferoidnom koordinatnom sustava, što

    omogućava određivanje lokacije korisnika na temelju geografske širine i geografske

    dužine što je pogodno ako se u bazu podataka spremaju podatci očitani s raznih GPS [15]

    prijamnika. Generalno pružaju manje metoda nego geometrijski objekti i metode su

    procesorski zahtjevnije. Njihovo korištenje se preporučuje ako modeliramo bazu podataka

    za veliko geografsko područje i ako pohranjujemo podatke u obliku geografske širine i

    dužine.

    Ime metode Kratki opis

    ST_Centroid() Vraća točku koja predstavlja centar objekta

    ST_Area() Vraća površinu objekta ako je on poligon ili multi-poligon objekt

    ST_Length() Vraća dužinu krivulje u odabranoj mjernoj jedinici

    ST_Buffer()

    Vraća objekt koji sadrži sve točke koje se nalaze na određenoj

    udaljenosti od predanog objekta. Dobiveni objekt predstavlja okolno

    područje.

  • 19

    Slika 1.5. Kartezijev i sferoidni koordinatni sustav, preuzeto s [3]

    Dodatak PostGIS omogućuje rad s nekoliko objekta od kojih su najvažniji točka (point),

    linija (linestring) i poligon (polygon). Svaki od ovih objekta može biti geometrijski ili

    geoprostorni.

    • Objekt točka predstavlja jednu točku u prostoru. U Kartezijevom sustavu se

    određuje s dva parametra x i y koordinatom, dok se u sferoidnom koordinatnom

    sustavu određuje s geografskom širinom i dužinom.

    Slika 1.6. Primjer točke u dodatku PostGIS

    • Objekt linija predstavlja niz točaka u prostoru koje povezane čine krivulju. Definira

    se nizom uređenih parova x i y koordinata za Kartezijev koordinantni sustav i

    nizom uređenih parova geografske širine i dužine za sferoidni koordinatni sustav.

  • 20

    Slika 1.7 Primjer linije u dodatku PostGIS

    • Objekt poligon predstavlja zatvoreno područje u prostoru. Definicija mu je ista kao

    kod objekta linija osim činjenice da početna i zadnja točka moraju imati identične

    koordinate kako bi se naglasilo da se radi o zatvorenoj krivulji.

    Slika 1.8 Primjer poligona u dodatku PostGIS

    1.4.2. Određivanje udaljenosti između geoprostornih objekata

    Korištenjem dodatka PostGIS za bazu podataka PostgreSQL moguće je jednostavno

    dohvaćanje svih unosa u tablici koji se nalaze proizvoljno daleko od nekog objekta u

    prostoru.

    Pretpostavimo da imamo tablicu korisnici u kojoj su pohranjene njihove lokacije (koje

    mogu biti točka, linija ili poligon) u prostoru i njihovi identifikator. U klasičnim bazama

  • 21

    podataka nemoguće je izgraditi upit kojim bi se dohvatili svi korisnici koji su udaljeni

    manje od 20 metara od nekog poligona u prostoru. U PostGIS-u bi taj upit izgledao:

    SELECT DISTINCT user_ID FROM korisnici WHERE

    ST_DWITHIN(ST_GeographyFromText(POLYGON),

    korisnici.lokacija,20);

    Kod 1.7 Primjer upita koji uzima u obzir udaljenosti objekata

    U navedenom upitu koristimo funkciju ST_DWITHIN() kojoj predajemo dva

    geoprostorana objekta i broj koji pretstavlja okolno područje. U ovom slučaj okolno

    područje je 20 metara. Funkciji je moguće predati i još jedan parametar, zastavicu tipa

    boolean kojom se označava da li se izračun treba provoditi u sferoidnom (zastavica

    postavljena na true) ili u Kartezijevom (zastavica postavljena na false) koordinatnom

    sustavu. Pošto smo funkciji predali dva geoprostorna objekta, ova zastavica je automatski

    postavljena na true, ali ako želimo ubrzati rad ove funkcije možemo ju postaviti na false,

    čime gubimo na preciznosti izračuna udaljenosti.

    Funkcija ST_GeographyFromText() pretvara tekstovni zapis poligona u

    odgovarajući geoprostorni objekt.

    Ideja po kojoj se određuje udaljenost između dva poligona je sljedeća [4]. Pretpostavimo

    da imamo dva poligona kao na slici 1.9 između kojih želimo odrediti udaljenost.

    Slika 1.9 Dva poligona između kojih se računa udaljenost, [4]

  • 22

    Prvi korak je pronalaženje linije koja povezuje poligone. Pošto svaki poligon možemo

    opisati kvadratom, najjednostavnije je povezati središta tih kvadrata kao što se vidi na slici

    1.10.

    Slika 1.10 Linija koja spaja središta opisnih kvadrata poligona, [4]

    Sljedeći korak je određivanje najbližih vrhova poligona. Ovaj problem se rješava

    povlačenjem okomice iz svakog vrha na spojnu liniju poligona.

    Slika 1.11 Određivanje dva najbliža vrha

    Za svaki okomiti pravac pamtimo gdje presijeca x os koordinatnog sustava. Određivanje

    najbližih pravaca se sada svodi na uspoređivanje presjecišta x osi. Tako dolazimo do

    pravca koji prolazi kroz točku P5 u prvom poligonu, i do pravca koji prolazi kroz točku

  • 23

    P12 u drugom poligonu. Sada računamo udaljenost između točaka P5 I P12. Pošto ne

    tražimo minimalnu udaljenost između dva vrha poligona, nego između dva poligona

    općenito, moramo testirati i stranice poligona. Da bi to napravili izmjerit ćemo udaljenosti

    između bridova i vrhova poligona. Tako mjerimo udaljenost između bridova vrha P5 (P4-

    P5 i P5-P6) i bridova vrha P12 (P11-P12 i P12-P13). Također mjerimo i udaljenosti

    između svih šest vrhova međusobno (P4, P5, P6, P11, P12, P13), i kombinacije s

    pripadajućim bridovima. Naravno ne mjerimo udaljenosti između vrhova istog poligona,

    nego samo kombinacije vrhova susjednih poligona koje promatramo. Kao rezultat

    odabiremo najmanju izmjerenu udaljenosti, koja je u ovom slučaju udaljenosti između vrha

    P6 i vrha P13.

    Slika 1.12 Minimalna udaljenostu u prvom koraku izračuna

    Sada znamo da je udaljenost koju tražimo između udaljenosti P6, P13 i udaljenosti između

    dva paralelna pravca. Sljedeći korak je ponavljanje cijelog postupka za sljedeći vrh koji je

    najbliži paralelnim pravcima, uz ograničenje da je bliže od najdalje izračunate udaljenosti

    iz prethodnog koraka. Tako dolazimo do vrha P8 u prvom poligonu. Pošto smo

    uspoređivali udaljenosti između susjednih vrhova i bridova, došli smo do minimalne

    udaljenosti između dva poligona, vrha P8 i stranice P12,P13 kako što je prikazano na slici

    1.13.

  • 24

    Slika 1.13 Krajnja minimalna udaljenost poligona

    Računanje udaljenosti između drugih objekata se svodi na jednostavniji slučaj od opisanog,

    ovisno o kojim se objektima radi.

    Važno je napomenuti da s ovakvim pristupom možemo odrediti udaljenosti samo objekta

    koji se ne presijecaju.

  • 25

    2. Geoprostorni poslužitelj objavi-pretplati

    Geoprostorni poslužitelj objavi-pretplati se sastoji od dvije glavne komponente:

    • Aplikacijski poslužitelj

    • Poslužitelj baze podataka

    Aplikacijski poslužitelj prihvaća i obrađuje korisničke zahtjeve, dok poslužitelj baze

    podataka je zadužen za pohranu i obradu podataka. Drugim dijelovima objavi-pretplati

    sustava ova dva poslužitelja izgledaju poput jednoga, tj. druge komponente ne znaju za

    postojanje poslužitelja baze podataka.

    Slika 2.1 prikazuje UML slijedni dijagram koji opisuje slijed poruka koje razmjenjuju

    klijent, aplikacijski poslužitelj, baza podatak i GCM poslužitelj.

    Slika 2.1 UML sekvencijski dijagram komunikacije poslužitelja

  • 26

    2.1.1. Implementacija poslužitelja

    Razvijeni aplikacijski poslužitelj je napisan u programskom jeziku Java unutar NetBeans

    8.0 razvojnog okruženja kao web aplikacija koja se izvodi na GlassFish poslužitelju verzije

    4. Za pohranu podataka korišten je PostgreSQL 9.3.4 poslužitelj baze podataka s PostGIS

    2.1.1 dodatkom. Aplikacijski poslužitelj razvijen je kao RESTful web usluga

    (Representational State Transfer, REST). REST usluga je model koji definira način na koji

    će se stvarati, čitati, osvježavati i brisati podatci na poslužitelju koristeći HTTP pozive.

    Poslužitelj komunicira s klijentima razmjenjujući JSON (JavaScript Object Notation)

    poruke. Iz tog razloga u projekt su dodane dvije biblioteke (libraries) json-simple-1.1.1.jar

    i org.json-20120521.jar preuzete sa [5], [6] koje omogućuju ovu funkcionalnost. JSON je

    otvoreni standard za formatiranje tekstualnih poruka po principu ključ-vrijednost. [7].

    Za samu komunikaciju s GCM poslužiteljom zadužena je biblioteka gcm-server.jar,

    preuzeta sa [8].

    2.2. Zadaće aplikacijskog poslužitelja

    Razvijeni aplikacijski poslužitelja ima tri osnovne zadaće:

    • Obrađivanje korisničkih zahtjeva

    • Pohranjivanje podataka u bazu

    • Slanje poruka GCM poslužitelju

    Slika 2.2 prikazuje UML dijagram razreda poslužitelja. Obrada korisničkih zahtjeva

    izvršava se u klasama PublishResource i SubscriptionResource.

    Pohranjivanje podataka u bazu izvršava se u razredu Database, dok je klasa

    GCMService zadužena za slanje poruka GCM poslužitelju.

  • 27

    Slika 2.3 UML dijagram klasa aplikacijskog poslužitelja

    2.2.1. Obrađivanje korisničkih zahtjeva

    Za obrađivanje korisničkih zahtjeva definirana su dva REST web servisa koji su zaduženi

    za obradu pretplata i objava.

    2.2.1.1 Obrada pretplata

    Kada se korisnik želi pretplatiti na novo područje poslati će poslužitelju zahtjev HTTP

    POST sa potrebnim parametrima, a ako želi otkazati pretplatu poslat će zahtjev HTTP

    DELETE. Samim time poslužitelj na adresi za obradu pretplata razlikuje ove dvije metode

    i ovisno o njima primjenjuje odgovarajuću logiku za dodavanje i brisanje pretplata iz baze

    podataka.

    Obrada pretplata se izvršava u klasi SubscriptionsResource koji predstavlja REST

    servis za obradu zahtjeva pristiglih na adresu /GeoAppServer/resources/subscriptions.

    Metoda postJson() prima zahtjeve HTTP POST. Tijelo zahtjeva treba sadržavati niz

    znakova koji predstavlja JSON objekt u kojem se nalaze parametri geom, koji predstavlja

    geografsku lokaciju za koju se korisnik želi pretplatiti i parametar push_id koji

    predstavlja push ID korisnika koji se pretplaćuje. Nakon što je pozvana metoda

    postJson(), u njoj se provodi parsiranje primljenog JSON objekta koji se nalazi u

    varijabli tipa string i dobiveni podatci se predaju bazi podataka na daljnju obradu. Primjer

    jednog takvog objekta bio bi:

  • 28

    {

    "geom":"POINT ( 15.979952551424503 45.81918347570577 )",

    "push_id":"APA91bEmyQv9W14nfuWEfk8O4xEYLZtLrDEIJwSECmdHlu1ETHKn...

    }

    Kod 2.1 Primjer JSON objekta koji se razmjenjuje između klijena i poslužitelja

    Ako je poslužitelj uspješno zaprimio i pohranio pretplatu šalje odgovor u obliku objekta

    string u kojem je zapisan JSON objekta u kojemu se nalazi ključ status i vrijednost OK.

    {"status":"OK"}

    Ako se dogodila pogreška, poslužitelj odgovara s istom porukom ali s vrijednošću ERROR.

    Ako je klasa primila zahtjev HTTP DELETE on se prosljeđuje deleteJson() metodi.

    Ova metoda očekuje dva parametra push_id i geom koji su predani u obliku

    standardnog HTTP upita (query), što znači da su navedeni u samoj adresi zahtjeva nakon

    znaka '?' odvojeni znakom '&' jedan od drugoga. Predani parametri su URL kodirani kako

    bi se mogli prenositi preko mreže. Primjer jednog takvog zahtjeva bi bio:

    http://192.168.1.114:8080/GeoAppServer/resources/subscription

    s?push_id=APA91bEmyQv9W14nfuWEfk8O4xEYLZtLrDEIJwSECm...&geom=

    POINT+%28+15.979376211762427+45.80139098635894+%29

    Kod 2.2 Primjer HTTP DELETE zahtjeva

    Metoda predaje primljene parametre bazi podataka koja provodi brisanje pretplate.

    Poslužitelj u odgovoru šalje vrijednost JSON objekta s parametrom status i

    vrijednostima OK ako je otkazivanje pretplate izvedeno uspješno ili vrijednosti ERROR ako

    je došlo do pogreške.

  • 29

    2.2.1.2 Obrada objava

    Kada objavljivač stvori novu objavu dojavljuje ju poslužitelju na adresu na kojoj

    poslužitelj očekuje nove objave. Pri primanju objave aplikacijski poslužitelj šalje bazi

    podataka upit za svim klijentima za koje se pristigla objava odnosi. Nakon dobivanja

    odgovor od baze podataka, popis klijenata i pristigla obavijest se prosljeđuju klasi koja će

    te podatke proslijediti GCM poslužitelju.

    Klasa PublishResource predstavlja REST servis koji je zadužen za obradu zahtjeva

    pristiglih na adresu /GeoAppServer/resources/publish. Na tu adresu objavljivači zahtjevom

    HTTP POST dojavljuju poslužitelju svoje objave. Klasa ima samo jednu metodu

    postJson()koja prima jedan parametar tipa string koji predstavlja JSON objekt u

    kojemu se nalaze tri para ključ-vrijednost. Vrijednost koja se nalazi pod ključem geom

    označava lokaciju za koju se odnosi objava a sam tekst objave se nalazi pod ključem

    message. Vrijednost pod ključem distance predstavlja dodatno područje oko objave

    (buffer). Dodatno područje tako definira prsten određene debljine oko područja objave. Pri

    dohvaćanju korisnika kojima treba isporučiti pristiglu objavu, dohvatit će se i korisnici čije

    se pretplate ne nalaze ununtar područja objave ali se nalaze u okolnom području. Primjer

    jedne takve objave bio bi:

    {

    "message":"Poplava u Zagrebu",

    "geom":"POLYGON ((

    15.990392044186592 45.78965405033109,

    15.994726829230787 45.78870042820566,

    15.994828417897224 45.790517883698634,

    15.991292595863344 45.791412328714486,

    15.990392044186592 45.78965405033109 ))"

    "distance":20,

    }

    Kod 2.3 Primjer JSON objekta objave

    Nakon što poslužitelj primi i parsira tijelo objave, dohvaća iz baze podataka sve korisnike

    koji su pretplaćeni na područje u objavi i prosljeđuje listu korisnika i samu objavu klasi

    GCMService koja je zadužena za komunikaciju s GCM poslužiteljem.

    GCMService.sendPost(message, location, users);

  • 30

    2.2.2. Pohranjivanje podataka u bazu

    Pošto aplikacijski poslužitelj iz više klasa mora komunicirati s bazom podataka, sva logika

    oko komunikacije izdvojena je u posebnu klasu Database. Ona pruža svim ostalim

    komponentama aplikacijskog poslužitelja metode za pohranu, brisanje i dohvaćanje

    podataka iz baze. Time je postignuto skrivanje baze podataka od drugih dijelova

    aplikacijskog poslužitelja.

    Klasa Database je izvedena po programskom obrascu singleton, što znači da se tijekom

    rada poslužitelja instancira samo jedan objekt ove klase. Sam razred ima tri javno dostupne

    metode pomoću kojih drugi objekti mogu komunicirati s bazom podataka. Kada neki

    objekt želi komunicirati s bazom podataka dohvaća instancu razreda pozivajući javnu

    statičku metodu getInstance() koja provjerava da li već postoji objekt ove klase.

    Ako ne postoji stvara ga i vraća referencu na stvoreni objekt, a ako već postoji samo se

    vraća referenca na njega. Klasa Database pri instanciranju stvara objekt razreda

    Connection koji se zna povezati na bazu podataka koristeći biblioteku postgresql-9.3-

    1101.jdbc41.jar preuzetu s [9].

    try {

    connection = DriverManager.getConnection(

    "jdbc:postgresql://127.0.0.1:5432/geoDB",

    "antun",

    "");

    } catch (SQLException e) {

    System.out.println("Connection Failed! Check output

    console");

    }

    Kod 2.4 Spajanje na poslužitelja baze podataka

    Za pohranjivanje novih pretplata u bazu koristi se metoda insertSubscriptions()

    koja prima dva parametra tipa string, korisnikov ID i reprezentaciju geoprostornog objekta.

    Ubacivanje se izvodi stvaranjem novog objekta PreparedStatement i pozivanjem

    metode execute() nad tim objektom.

  • 31

    PreparedStatement preparedStatement =

    connection.prepareStatement("INSERT INTO subscription

    (user_id, geom) VALUES (?, ST_GeographyFromText(?)) ");

    preparedStatement.setString(1, userID);

    preparedStatement.setString(2, geoObject);

    preparedStatement.execute();

    Kod 2.5 Primjer stvaranja INSERT upita na bazu podataka

    Pri stvaranju upita na bazu koristi se PostGIS metoda ST_GeographyFromText()

    koja pretvara reprezentaciju geoprostornog objekta iz stringa u sam geoprostorni objekt s

    kojim baza zna raditi.

    Metoda deleteSubscriptions() se koristi za brisanje pretplata iz baze podataka.

    Isto ako i metoda insertSubscriptions() prima dva parametra, id korisnika i

    lokacijski objekt koji se želi obrisati. Rezultat izvođenja metode ovisi o uspješnosti

    operacije brisanja i isti je kao kod metode insertSubscriptions().

    PreparedStatement preparedStatement =

    connection.prepareStatement("DELETE FROM subscription WHERE

    user_id = ? AND geom = ST_GeographyFromText(?);");

    preparedStatement.setString(1, userID);

    preparedStatement.setString(2, geoObject);

    preparedStatement.execute();

    Kod 2.6 Primjer stvaranja DELETE upita na bazu podataka

    Kada je potrebno dohvatiti određene korisnike iz baze, koristi se metoda

    selectUsers() koja prima dva parametra, geoprostorni objekt i okolno područje.

    Metoda se koristi kada je potrebno dohvatiti sve korisnike za koje se odnosi pretplata na

    nekom geoprostornom području. Upravo to područje je predano metodi, zajedno s okolnim

    područjem oko svake pretplate. Ako nije predano okolno područje, ono se postavlja na 20

    metara. Kada se ne bi koristilo okolno područje, geoprostorni objekti poput linija i točaka

    ne bi se mogli grupirati kao obuhvaćeno područje osima ako se objava ne bi nalazila na

    identičnim koordinatama kao i oni ili ako se područje obavijesti ne prostire preko njih. Za

  • 32

    grupiranje korisnika se koristi PostGIS metoda ST_DWITHIN(). Kao rezultat izvođenja

    selectUsers() metoda vraća listu ID-eva korisnika koje treba obavijestiti.

    PreparedStatement preparedStatement =

    connection.prepareStatement("SELECT DISTINCT user_id FROM

    subscription WHERE " + "ST_DWITHIN (ST_GeographyFromText(?)

    ,subscription.geom,?);");

    preparedStatement.setString(1,

    geoObject);preparedStatement.setString(2, distance);

    ResultSet resultSet = preparedStatement.executeQuery();

    Kod 2.7 Primjer stvaranja SELECT upita na bazu

    2.2.3. Slanje poruka GCM poslužitelju

    Nakon što poslužitelj dobije obavijest od objavljivača i dohvati popis svih korisnika koje

    treba obavijestiti, prosljeđuje tu informaciju klasi GCMService koja zna komunicirati s

    GCM poslužiteljem. Ova klasa ima jednu javnu statičnu metodu sendPost() koja prima

    tekst obavijesti, string reprezentaciju geoprostornog objekta i listu id-eva korisnika kojima

    treba isporučiti obavijest. Poruka koja se isporučuje GCM poslužitelju nastaje stvaranjem

    objekta klase Message. U tom objektu se definiraju svi potrebni parametri potrebni za

    isporučivanje poruke korisnicima. Poruka se zatim prosljeđuje objektu klase Sender. Pri

    stvaranju objekta sender potrebno je predati API ključ generiran za korištenje usluge

    GCM. Postupak generiranja ključa je opisan u privitku. Za slanje poruke koristi se metoda

    send() razreda Sender kojoj predajemo objekt tipa Message, popis korisnika kojima

    šaljemo poruku i cijeli broj koji predstavlja broj pokušaja slanja. Metoda send() vraća

    objekt MulticastResult koji predstavlja odgovor poslužitelja GCM.

  • 33

    Sender sender = new Sender(SENDER_ID);

    Message message = new Message.Builder()

    .collapseKey(collapseKey)

    .timeToLive(30)

    .delayWhileIdle(true)

    .addData("message", textMessage)

    .addData("location", loacation)

    .build();

    MulticastResult result = sender.send(message, users, 1);

    Kod 2.8 Slanje poruke GCM poslužitelju

    2.3. Poslužitelj baze podataka

    Kao poslužitelj baze podataka koristi se poslužitelj PostgreSQL. Na poslužitelju je

    stvorena baza podataka imena “geoDB” u kojoj se nalazi jedan tablica imena

    “subscription”. Tablica se sastoji od tri stupca. U prvi stupac se pohranjuje korisnikov ID

    kao character tip veličine do 255 znakova. U drugom stupcu se pohranjuju

    geoprostorni objekti kao tipovi geography, dok se u trećem stupcu pohranjuje primarni

    ključ tablice tipa bigint.

    Slika 2.4 Tablica “subscription” u bazi podataka

  • 34

    Sam poslužitelj pokrenut je na vratima (port) 5432 i iz aplikacijskog poslužitelja mu se

    pristupa korištenjem postgresql-9.3-1101.jdbc41.jar biblioteke preuzete s [8] koja zna

    komunicirati s ovim poslužiteljem.

  • 35

    3. Klijentska aplikacija

    U razvijenom geoprostornom sustavu objavi-pretplati pretplatnik može stvarati svoje

    objave i prosljeđivati ih aplikacijskom poslužitelju koji će ih proslijediti drugim

    zainteresiranim korisnicima. U tu svrhu razvijena klijentska aplikacija uz stvaranje i

    otkazivanje pretplata za određeno područje i primanje obavijesti za ta područja, može i

    stvarati obavijesti za bilo koje područje.

    Klijentska aplikacija korisnicima omogućava tri glavne aktivnosti:

    1. Stvaranje i otkazivanje pretplata

    2. Stvaranje objava

    3. Prikazivanje primljenih objava

    Nakon pokretanja aplikacije korisniku se prikazuje karta s usluge Google Maps na kojoj je

    prikazana njegova trenutna lokacija i njegove aktivne pretplate. Na slici 3.1 a) je vidljiva

    situacija kada korisnik nema definiranih pretplata, dok su na slici 3.1 b) vidljive tri

    pretplate.

    Slika 3.1 Početni zaslon aplikacije bez pretplata a) i s pretplatama b)

  • 36

    Ako pritisnemo na gumb u gornjem lijevom kutu, otvorit će se navigacijska ladica u kojoj

    se nalazi izbornik s tri osnovne kontrole:

    1. Prikazivanje karte za stvaranje objava i pretplata

    2. Izbornik za otkazivanje pretplata

    3. Izbornik za pregledavanje pristiglih objava

    Slika 3.2 Navigacijska ladica

    3.1. Stvaranje i otkazivanje pretplata

    Za stvaranje nove pretplate potrebno je u navigacijskoj ladici odabrati Map i na

    prikazanom zaslonu pri gornjem desnom rubu ekrana odabrati gumb ADD nakon čega se

    ponudi izbornik za dodavanje nove pretplate prikazan na slici 3.3 a).

    Prvi korak pri stvaranju pretplate je odabir prostornog objekta na koji se želimo pretplatiti.

    Može se pretplatiti na točku, liniju ili poligon. Kako bi se lakše snalazili u svojim

    pretplatama moguće je definiranje imena pretplate u polju za unos teksta (Subscription

    name). Pritiskom gumba Cancel otkazuje se dodavanje nove pretplate a pritiskom na gumb

    Add vraća se na prethodno vidljivu kartu. Pritiskom na kartu dodaju se točke koje će

    definirati pretplatu (slika 3.3 b).

  • 37

    Slika 3.3 a) Izbornik za stvaranje nove pretplate, b) Definiranje točaka pretplate

    Korisnik u svakom trenutku može odustati pritiskom gumba CANCEL koji se nalazi u

    gornjem desnom rubu ekrana. Pritiskom na kvačicu u gornjem lijevom rubu ekrana smatra

    se da je korisnik završio definiranje pretplate i ona se dojavljuje aplikacijskom poslužitelju.

    Za otkazivanje pretplata potrebno je odabrati Unsubscribe u navigacijskoj ladici nakon

    čega se prikazuje izbornik s popisom svih definiranih pretplata (slika 3.4 a). Za svaku

    pretplatu se prikazuje ime koje joj je korisnik dodjelio, tip pretplate i od koliko se točaka u

    prostoru ona sastoji.

    Pritiskom na pretplatu korisniku se nudi opcija otkazivanja, tj. brisanja te pretplate (slika

    3.4 b).

  • 38

    Slika 3.4 a) Popis korisnikovih pretplata, b) Potvrda za brisanje određene pretplate

    3.2. Stvaranje objava

    Za stvaranje nove objava potrebno je u navigacijskoj ladici odabrati Map i u gornjem

    desnom rubu ekrana pritisnuti gumb PUBLISH. Korisniku se prikazuje izbornik za

    stvaranje nove objave koji je sličan stvaranju nove pretplate. Potrebno je odabrati tip

    geoprostornog objekta za koji se stvara objava, unijeti tekst objave i definirati okolno

    područje oko obavijesti (slika 3.5 a). Pritiskom na gumb ADD vraća se na prethodnu kartu

    na kojoj je potrebno odrediti područje objave (slika 3.5 b). Kada je korisnik odredio

    lokaciju objave, pritiskom na kvačicu u gornjem desnom rubu ekrana šaljemo ju

    poslužitelju.

  • 39

    Slika 3.5 a) Izbornik za stvaranje nove objave, b) Definiranje lokacije objave

    3.3. Prikazivanje primljenih objava

    Odabirom stavke Notification u navigacijskoj ladici, korisniku se prikazuje popis objava

    koje je primio (slika 3.6 a). Svaka objava sadrži vrijeme kada ju je korisnik primio, i samu

    poruku. Pritiskom na određenu objavu prikazuje se lokacija objave (slika 3.6 b).

  • 40

    Slika 3.6 a) Popis pristiglih objava, b) Pregledavanje lokacije definirane u objavi

    3.4. Implementacija klijntske aplikacije

    Klijentska aplikacija je razvijena kako novi projekt unutra razvojnog okruženja Android

    Studio. Ovo razvojno okruženje koristi dodatak Gradle [10] za izgradnju jednom napisane

    aplikacije, i ako želimo u aplikaciju uključiti dodatne biblioteke potrebno ih je navesti

    unutar datoteke build.gradle. Klijentska aplikacija koristi usluge GCM i Google Map, koje

    se nalaze unutar dodatka Google Play Service, koji se nalazi unutar Android SDK pa je

    potrebno navesti taj dodatak unutar build.gradle datoteke.

    dependencies {

    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile 'com.google.android.gms:play-services:4.3.23'

    compile 'com.android.support:appcompat-v7:19.+'

    compile 'com.android.support:support-v4:19.+'

    }

    Kod 3.1 Navođenje biblioteka u build.gradle

  • 41

    Implementacija ranije opisanih funkcionalnosti aplikacije je podijeljena u pet logičkih

    cjelina.

    • Aktivnosti

    Aplikacija sadrži tri aktivnosti. Početna aktivnost je StartActivity u kojoj se od

    GCM poslužitelja zahtjeva push ID i vrši se dojavljivanje ID-a aplikacijskom poslužitelju.

    Glavna aktivnost u aplikaciji je DrawerActivity. Ova aktivnost u sebi sadrži logiku

    za prikazivanje navigacijske ladice, kao i logiku za izmjenu fragmenata.

    MapPopUp aktivnost se koristi pri prikazivanju Google Map karte kada korisnik

    pregledava pristigle objave. Specifičnost ove aktivnosti je da je definirana kao dialog

    aktivnost, što označava da se neće prikazati preko cijelog zaslona uređaja, nego će se

    pojaviti kao objekt iznad postojeće aktivnosti.

    • Fragmenti

    Logika ranije opisanih kontrola aplikacije je izdvojena u zasebne fragmente. Tako se

    logika prikazivanja izbornika u navigacijskoj ladici nalazi u fragmentu

    NavigationDrawerFragment. Logika za prikazivanje karte na kojoj se vide

    korisnikove pretplate i njegova lokacija se nalazi u fragmentu GeoMapFragment koji

    nasljeđuje MapFragment definiran u dodatku Google Play Service. GeoMapFragment

    se prikazuje kada je u navigacijskoj ladici odabran Map izbornik. Za prikazivanje dodatnog

    izbornika na pritisak tipki PUBLISH i ADD koristi se fragment GeoDialogFragmetn.

    NotificationFragment se koristi za prikazivanje pristiglih obavijesti, a fragment

    UnsubscribeFragment za prikazivanje trenutnih pretplata i otkazivanje istih.

    NotificationFragment i UnsubscribeFragment fragmenta nasljeđuju

    ListFragment fragment koji omogućava prikazivanje liste objekata. Za prikazivanje

    listi koriste se klase koje nasljeđuju ArrayAdapter klasu. Ova klasa zna prikazivati listu

    objekata na zaslonu u formatu koji se definira u zasebnoj xml datoteci. Za prikazivanje

    liste obavijesti koristi se klasa NotificationAdapter koja prikazuje listu

    GeoObject objekata. Opis izgleda jednog reda u listi dan je u datoteci

    notification_row.xml. Za prikazivanje liste pretplata koristi se klasa

    SubscribtionAdapter koja također prikazuje listu objekata tipa GeoObject, a

    definicija jednog reda dana je u datoteci subscribtion_row.xml.

    • Baza podataka

  • 42

    Podaci u aplikaciji se pohranjuju u bazu podataka SQLite čiji se opis nalazi u datoteci

    SqliteHelper. Baza podataka se sastoji od dvije tablice u koje se pohranjuju

    korisnikove pretplate i primljene obavijesti. Upiti na bazu podataka su definirani u klasi

    GeoDataSource koja nudi metode za rad s bazom podataka drugim komponentama u

    sustavu.

    • Model

    Kako bi se pojednostavio rad s geoprostornim objektima u aplikaciji definirana je

    enumeracija GeomType koja definira postojanje tri vrste objekta (točka, linija i poligon).

    Svaki od ovih objekata sadrži informacije kao što su ime, id, datum kada je stvoren i

    obavezna lista točaka od koji se sastoji objekt. Svi ti parametri se nalaze u klasi

    GeoObject čiji objekti predstavljaju geoprostorne objekte, tako da kada se u aplikaciji

    radi s pretplatama, radi se zapravo s objektima tipa GeoObject. Za opis obavjesti koristi

    se klasa LocationMessage koja sadrži tekst pristigle objave i objekt GeoObject

    razreda koji predstavlja područje definirano u objavi.

    • Općenito

    Klasa GcmBroadcastReceiver predstavlja primatelja objavljenih namjera koji prima

    objave pristigle od poslužitelja GCM i prosljeđuje ih usluzi GcmIntentService koja ih

    obrađuje. Ova usluga parsira pristiglu objavu i stvara statusnu obavijest.

    Za komunikaciju s aplikacijskim poslužiteljom zadužena je klasa

    NetworkCommunicator koja definira statične metode za slanje objava i pretplata. Ova

    klasa koristi volley.jar biblioteku preuzetu s [11] za ostvarivanje komunikacije.

    U klasi Constants su zapisane općenite konstante i informacije potrebne za rad

    aplikacije.

  • 43

    4. Analiza rada sustava

    Usko grlo sustava je aplikacijski poslužitelj i poslužitelj baze podataka pa je stoga

    neophodno znati njegove mogućnosti i ograničenja prije nego se krene optimizirati ovako

    razvijeni sustav. Pri analizi rada ova dva poslužitelja promatrano je kako poslužitelji

    pohranjuju korisničke pretplate i koliko brzo mogu obrađivati korisničke objave.

    4.1. Analiza pohranjivanja pretplata

    Za mjerenje brzine pohranjivanja pretplata razvijena je aplikacija koja generira korisničke

    pretplate i dojavljuje ih poslužitelju. Implementacija aplikacije opisana je u privitku.

    Aplikacija za testiranje stvara deset dretvi koje simuliraju po jednog korisnika. Svaka

    dretva šalje na poslužitelja 1000 slučajno generiranih točaka na području radijusa 68 km.

    Ukupno srednje vrijeme obrade 10 000 korisničkih zahtjeva tako iznosi 28.3018 sekundi.

    Na slici 4.1 je prikazan graf s vremenima izvršavanja svake dretve za tri odvojena

    pokretanja aplikacije, tj. za tri odvojena mjerenja.

    Slika 4.1 Graf s vremenima izvršavanja svake dretve za testiranje

  • 44

    4.2. Analiza objavljivanja objava

    Analiza brzine obrade objava je provedena korištenjem alata Apache Benchmark (ab)[12].

    Prije provođenja analize objava u bazu podataka je pohranjeno 40 000 pretplata u radijusu

    od 68 kilometara. Analiza je provedena stvaranjem 1000 objava koje su podijeljene na 50

    klijenta. Mjerenje je provedeno tri puta, uz varijabilno okolno područje oko objave od 20,

    100, 200 metara.

    U pozivu ovog alata s parametrom – n se definira broj zahtjeva, s – c se definira broj

    paralelnih klijenta, s – T se definira parametar zahtjeva HTTP POST koji određuje tip

    objekta koji se predaje, s – p određujemo datoteku u kojoj se nalazi tijelo zahtjeva POST i

    s parametrom – g određujemo u koju datoteku želimo pohraniti rezultate koje generira alat.

    Definiranu .tsv datoteku možemo grafički prikazati alatom GNUplot. Postupak je opisan u

    privitku.

    ab -n 1000 -c 50 -T 'application/json' -p

    /Users/antun/Desktop/message.txt -g

    /Users/antun/Desktop/testExportImg.tsv

    http://192.168.88.247:8080/GeoAppServer/resources/publish

    Kod 4.1 Pozivanje ab alata iz terminala

    Sadržaj datoteke koja definira tijelo HTTP POST zahtjeva je :

    {"message":"pozar","geom":"POINT ( 16.83186892877894

    46.64651314928392 )","distance":20}

    • 1. mjerenje, okolno područje 20 metara

    Rezultat ovog alata za prvo mjerenje je prikazan kao grafu na slici 4.2. Ordinata

    predstavlja vrijeme odaziva poslužitelja na pojedini zahtjev, dok je na apcisi vrijeme u

    trajanja testa u sekundama. Na početku izvršavanja testa vidljivo je kako je vrijeme

    odaziva poslužitelja relativno kratko za prvi zahtjev i kako raste s povečanjem broja

    zahtjeva koji pristižu. U vrlo kratkom vremenu dolazi do zasićenja poslužitelja. Nakon što

    je poslužitelj ušao u zasićenje primjećuje se osciliranje vremena odaziva za pojedini

    zahtjev oko 1600 milisekundi. U ovom slučaju kada je okolno područje oko objave

    relativno malo, samo 20 metara, odgovori od poslužitelja nikada ne traju duže od 1935

  • 45

    milisekundi. Poslužitelj za svaku objavu dohvaća 16 zainteresiranih korisnika. Statistike

    poslužitelja su dane u tablici 4.1 dok su statistike o vezi dane u tablici 4.2.

    Slika 4.2 Graf s vremenima trajanja zahtjeva za prvi test

    Tablica 4.1 Statistike poslužitelja za prvi test

    Vrijeme trajanja testa 32.420 sekundi

    Prosječno trajanje zahtjeva 1621.016 ms

    Broj zahtjeva u sekundi 30.84 #/sec

    Ukupna količina prenesenih podataka 243000 bytes

    Ukupna brzina prijenosa 15.09 kb/s

    Brzina primanja 7.32 kb/s

    Brzina slanja 7.77 kb/s

  • 46

    Tablica 4.2 Statistike veze s poslužiteljom za prvi test

    Spajanje na poslužitelja traje u maksimalnom slučaju 1 ms zato što se aplikacijski

    poslužitelj i klijent nalaze na istom računalu. U realnoj situaciji u kojoj se klijent i

    poslužitelj nalaze na različitim uređajima, spajanje na poslužitelja će trajati duže i ovisit će

    o stanju mreže u kojoj se nalaze klijent i poslužitelj.

    • 2. mjerenje, okolno područje 100 metara

    Primjećuje se kako je povećanje okolnog područja na 100 metara usporilo rad poslužitelja

    koji sada za jednu objavu pronalazi 55 zainteresiranih pretplata.

    Slika 4.3 Graf s vremenima trajanja zahtjeva za drugi test

    Minimum (ms) Srednje (ms) Odstupanje +/- (ms)

    Medijan (ms)

    Maksimalno (ms)

    Spajanje   0   0   0.20   0   1  Obrada 195 1582 193 1615 1935 Ukupno 196 1852 193.2 1615 1936

  • 47

    Tablica 4.3 Statistike poslužitelja za drugi test

    Vrijeme trajanja testa 35.526 sekundi

    Prosječno trajanje zahtjeva 1776.295 ms

    Broj zahtjeva u sekundi 28.15 #/sec

    Ukupna količina prenesenih podataka 243000 bytes

    Ukupna brzina prijenosa 13.80 kb/s

    Brzina primanja 6.68 kb/s

    Brzina slanja 7.12 kb/s

    Tablica 4.4 Statistike veze s poslužiteljom za drugi test

    • 3. mjerenje, okolno područje 200 metara

    U posljednjem testu poslužitelj za jednu objavu pronalazi 116 pretplatnika koje treba

    obavijestiti. Primjećuje se osjetni pad u performansama poslužitelja koji sada jednu

    objavu u prosjeku obrađuje 3259.429 ms što je više nego duplo od prvog testa u kojem

    je okolno područje 20 metara. U najgorem slučaju poslužitelj je odgovorio za 4989 ms.

    Minimum (ms) Srednje (ms) Odstupanje +/- (ms)

    Medijan (ms)

    Maksimalno (ms)

    Spajanje   0   0   0.20   0   1  Obrada 722 1735 144.5 1734 2639 Ukupno 723 1735 144.5 1734 2640

  • 48

    Slika 4.4 Graf s vremenima trajanja zahtjeva za treći test

    Tablica 4.5 Statistike poslužitelja za treći test

    Tablica 4.6 Statistike veze s poslužiteljom za treći test

    Vrijeme trajanja testa 65.189 sekundi

    Prosječno trajanje zahtjeva 3259.429 ms

    Broj zahtjeva u sekundi 15.34 #/sec

    Ukupna količina prenesenih podataka 243000 bytes

    Ukupna brzina prijenosa 7.52 kb/s

    Brzina primanja 3.64 kb/s

    Brzina slanja 3.88 kb/s

    Minimum (ms) Srednje (ms) Odstupanje +/- (ms)

    Medijan (ms)

    Maksimalno (ms)

    Spajanje   0   0   0.20   0   1  Obrada 1159 3159 304.8 3148 4989 Ukupno 1160 3159 304.8 3149 4989

  • 49

    Zaključak

    Cilj rada je stvaranje sustava objavi-pretplati koji svoje objave i pretplate definira kao

    geoprostorne objekte s dodatno pridruženim sadržajem. U radu je pokazana

    implementacija takvog sustava kao i korištenje klijentske aplikacije koja služi za primanje i

    stvaranje objava. S dodatnim razvojem poslužitelja i klijentske aplikacije moguće je

    ostvariti sustav objavi-pretplati koji se može koristit u svakodnevnom život od strane

    velikog broja korisnika. Jedan od mogućih scenarija korištenja, uz minimalne preinake, bi

    bio sustav za naručivanje taxi usluga u gradu Zagrebu. Svaki taksist bi bio pretplaćen na

    svoje područje dežurstva dok bi zainteresirani korisnici mogli objavljivati svoje lokacije na

    kojima zahtijevaju prijevoz.

    Dodatna mogućnost za unaprjeđenje sustava je definiranje dodatnih metapodataka koji bi

    opisivali pretplate.

  • 50

    Literatura

    [1] BIRMAN, K. JOSEPH, T. Exploiting virtual synchrony in distributed systems, Proceedings of the eleventh ACM Symposium on Operating systems principles (SOSP '87) 1987.

    [2] ANDROID DEVELOPERS, http://developer.android.com/index.html, 2014. [3] WOLFRAM MATHEMATICA,

    http://mathworld.wolfram.com/SphericalCoordinates.html, 2014. [4] POSTGIS WIKI, http://trac.osgeo.org/postgis/wiki/NewDistCalcGeom2Geom, 2014. [5] GOOGLE CODE, https://code.google.com/p/json-simple/downloads/detail?name=json-

    simple-1.1.1.jar&can=2&q=, 2014.

    [6] GOOGLE CODE, https://code.google.com/p/org-json-java/downloads/detail?name=org.json-20120521.jar&can=2&q= , 2014.

    [7] RFC 7159, http://tools.ietf.org/html/rfc7159, 2014. [8] GOOGLE CODE, https://code.google.com/p/google-api-java-

    client/source/browse/cloudnotes-preview-android-sample-AppEngine/war/WEB-INF/lib/gcm-server.jar?repo=samples&r=9f1e45f3013d3473c51b0357e0137554a4939dfb, 2014.

    [9] POSTGRESQL JDBC DRIVER, http://jdbc.postgresql.org/download.html, 2014. [10] GRADLE, http://www.gradle.org/, 2014. [11] GOOGLE SOURCE, https://android.googlesource.com/platform/frameworks/volley,

    2014. [12] APACHE HTTP SERVER BENCHMARKING TOOL,

    http://httpd.apache.org/docs/2.2/programs/ab.html, 2014. [13] RFC 6120, http://tools.ietf.org/html/rfc6120, 2014. [14] OPENGIS, http://www.opengeospatial.org/, 2014. [15] GPS, http://en.wikipedia.org/wiki/Global_Positioning_System, 2014.

  • 51

    Sažetak

    U radu je opisan i razvijen geoprostorni sustav objavi-pretplati za uređaje s operacijskim

    sustavom Android. Poslužitelj u tom sustavu koristi bazu podataka PostgreSQL s

    dodatkom PostGIS za pohranu i obradu prostornih objekata. Poslužitelj je razvijen kao

    usluga REST koja omogućuje korisnicima dodavanje novih pretplata, otkazivanje

    postojećih te slanje objava. Klijentska aplikacija se koristi za primanje i stvaranje objava

    koje se u sustavu razmjenjuju korištenjem usluge GCM. Klijent i poslužitelj razmjenjuju

    poruke u formatu JSON u kojima definiraju tri tipa geoprostornih objekata: točka, linija i

    poligon. Analiza sustava je provedena korištenjem Apache benchmark alata i posebno

    napisanom aplikacijom koja simulira stvaranje velikog broja pretplata.

  • 52

    Summary

    This paper describes geospatial publish-subscribe system for devices with Android

    operating system. In this system server use PostgreSQL database with PostGIS extension

    for storing and processing geospatial objects. Server is developed as REST service which

    allows users to define their subscription and to send messages. For the exchange of

    messages is used GCM service. Client and server are exchanging JSON messages that

    define three types of Geospatial objects: point, line and polygon. System analysis was

    performed using Apache benchmark tool and with additional application that simulates the

    creation of a large number of subscriptions.

  • 53

    Privitak

    Podešavanje  GCM  i  Google  Map  usluge  

    Kako bi se mogla koristi GCM usluga potrebno je imati korisnički račun na Google.com.

    Za samo korištenje usluge potrebno je stvoriti novi projekt na stranici

    https://console.developers.google.com/project. Nakon odabira imena i auto generiranog

    projekt ID-a generirat će se novi projekt sa svojim jedinstvenim identifikatorom (Project

    Number). Ovaj identifikator se koristi kada aplikacija za Android operacijski sustav traži

    od Google GCM poslužitelja svoj push ID, i potrebno ga je pohraniti u aplikaciju.

    Slika 0.1 Google developer konzola

    Kako bi ostvarili pravo na korištenje usluga potrebno je u izborniku APIs & auth, APIs

    odabrati Google Cloud Messaging for Android i Google Maps Android API v2 (slika 0.2).

  • 54

    Slika 0.2 Uključivanje potrebnih API-a u projektu

    Kako bi se mogao koristiti Google Map API u aplikaciji za Android operacijski uređaj,

    potrebno je generirati ključ za korištenje ove usluge. Prvi korak u generiranju ključa je

    generiranje novog SHA-1 zaštitnog potpisa. Za generiranje zašitnog potpisa koristi se

    besplatni alat Keytool koji se dobije s preuzimanjem java razvojne okoline

    (http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html). SHA-

    1 zaštitni potpis se računa iz certifikata koji se koristi za potpis aplikacije. Dok se

    aplikacija razvija koristi se DEBUG certifikat, a kada se objavljuje na Play Store potrebno

    je generirati vlastit certifikat za potpis. Za dobivanje SHA-1 potpisa za DEBUG certifikat

    potrebno je izvršiti sljedeću naredbu u keytool alatu:

    keytool -list -v -keystore ~/.android/debug.keystore -alias

    androiddebugkey -storepass android -keypass android

    U ovoj naredbi ~/.android/debug.keystore predstavlja putanju do debug

    certifikata koji se najčešće nalazi u android razvojnom okruženju.

    Nakon računanja SHA-1 zaštitnog potpisa u developerskoj konzoli odabiremo stvaranje

    novog javnog ključa (Create new Key, slika 0.3) . U izborniku odabiremo novi Android

    key, i u sljedećem korak u polje za unos unosimo izračunati SHA-1 potpis i nakon njega

    stavljamo ”:ime_osnovnog_paketa_aplikacije“.

  • 55

    Slika 0.3 Izbornik za stvaranje potrebnih ključeva

    Generirani API ključ je potrebno zapisati u AndroidManifest.xml datoteci kao novi meta

    podatak.

    Više o korištenju Google Maps API-a se može pronaći na adresi:

    https://developers.google.com/maps/documentation/android/start

    Pri registraciji za korištenje usluge GCM potrebno je generirati novi poslužiteljski ključ

    koji će se koristiti pri identifikaciji aplikacijskog poslužitelja kod GCM poslužitelja. Za

    stvaranje novog ključa odabiremo Create new Key i odabiremo server key. Ako naš

    aplikacijski poslužitelj ima stalnu IP adresu, možemo je unijeti u polje za unos kako bi se

    osigurali da samo naš poslužitelj može komunicirati s GCM poslužiteljem. Generirani API

    ključ je potrebno zapisati u aplikacijskom poslužitelju jer se on koristi pri stvaranju objekta

  • 56

    razreda Sender, koji šalje poruke GCM poslužitelju na adresu

    https://android.googleapis.com/gcm/send.

    Testiranje  poslužitelja  

    Aplikacija za testiranje registracija se sastoji od jednog razreda AplicationTesting u

    kojemu se stvara 10 dretvi. Svaka dretva potom generira 1000 HTTP POST zahtjeva

    koristeći biblioteke preuzete sa http://hc.apache.org/httpclient-3.x/ za stvaranje Apache

    HTTP klijenta. U svakom HTTP POST zahtjevu koje dretva stvori nasumično se odabiru

    broj od 0 do 1 koji se pridodaje geografskoj točci na koordinatama 45.79511175606035,

    15.980467535555363. Time se ostvaruje raspršivanje točaka na prostoru radijusa 68 km.

    Za generiranje grafova iz datoteka koje su rezultat testiranja s ab alatom korišten je alat

    gnuplot (više o alatu na http://www.gnuplot.info/). Prije iscrtavanja s gnuplot alatom

    svaka datoteka je obrađena s python skriptom u kojoj se vremena u timestamp formatu

    zamjenjuju sekundama u izvršavanju programa. Time se dobiva na x osi grafova vrijeme u

    sekundama u čitljivom obliku od 0 do vremena trajanje testa.

    f = open("testExportImg.tsv",'r')

    out = f.readlines()

    f = open('export.tsv','w')

    max = 10000000000

    for line in out:

    parts = re.split(r'\t+',line)

    if int(parts[1])< min:

    min=int(parts[1])

    parts[1] =int(parts[1])- min

    first = True

    for part in parts:

    if first:

    first = False

  • 57

    else:

    f.write('\t')

    if isinstance (part, int):

    f.write(str(part))

    else:

    f.write(part)

    f.close

    Kod 5.1 Python skripta za obradu .tsv datoteke

    Za samo iscrtavanje s gnuplot alatom korištena je sljedeći kod:

    set terminal jpeg size 720,405

    set size 1, 1

    set output "Desktop/timeseries.jpg"

    set title "Vrijeme odaziva posluzitelja"

    set key left top

    set grid y

    set xdata secunds

    set xlabel 'Vrijeme (s)'

    set ylabel "Vrijeme odaziva (ms)"

    set datafile separator '\t'

    plot

    "/Users/antun/Dropbox/Diplomski_Rad/testovi/test_1000_20m/exp

    ort.tsv" every ::2 using 2:5 title 'odaziv na zahtjev' with

    points

    exit

    Kod 5.2 Naredbe za iscrtavanje grafova pomoću gnuplot alata