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