Lokacijska usluga za pokretne uređaje temeljena na ... - FER

Lokacijska usluga za pokretne uređaje temeljena na ... - FER Lokacijska usluga za pokretne uređaje temeljena na ... - FER

SVEUČILIŠTE U ZAGREBU<br />

FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA<br />

SEMINARSKI RAD<br />

LOKACIJSKA USLUGA ZA POKRETNE<br />

UREĐAJE TEMELJENA NA PROTOKOLU<br />

SIP<br />

Matej Gjurković<br />

Mentor: Doc.dr.sc. Mario Kušek<br />

Zagreb, travanj 2009.


Sadržaj<br />

Uvod........................................................................................................................................... 1<br />

1. Java <strong>na</strong> malim uređajima.................................................................................................... 2<br />

1.1. Izvođenje Java aplikacija <strong>na</strong> malim uređajima .......................................................... 2<br />

1.2. J2ME programska okoli<strong>na</strong> ......................................................................................... 3<br />

1.2.1. Connected Device Configuration....................................................................... 4<br />

1.2.2. Connected Limited Device Configuration ......................................................... 5<br />

1.3. MIDlet ........................................................................................................................ 6<br />

2. Servlet................................................................................................................................. 9<br />

2.1. SIP servlet ................................................................................................................ 10<br />

3. SailFin .............................................................................................................................. 12<br />

4. IMS Location Server ........................................................................................................ 15<br />

5. Studijski slučaj usluge...................................................................................................... 17<br />

5.1. Klijentska aplikacija................................................................................................. 20<br />

5.2. Poslužiteljska aplikacija ........................................................................................... 22<br />

6. Zaključak.......................................................................................................................... 24<br />

Literatura .................................................................................................................................. 25<br />

Dodatak A: Instalacija programske podrške ............................................................................ 26<br />

ii


Uvod<br />

Napretkom telekomunikacijskih i pratećih tehnologija iste su postale pristupačne sve većem<br />

broju korisnika. U da<strong>na</strong>šnje vrijeme je sve teže <strong>na</strong>ći nekoga tko se ne služi raču<strong>na</strong>lima,<br />

Internetom, a još je teže <strong>na</strong>ći nekoga tko ne posjeduje mobilni telefon. Razvojem malih,<br />

mobilnih uređaja, isti su izbili u prvi plan jer omogućavaju korisnicima da koriste usluge <strong>na</strong><br />

koje su <strong>na</strong>vikli u pokretu. U skladu sa <strong>za</strong>htjevima korisnika koji žele što više i povoljnije,<br />

bogato su opremljeni različitim komunikacijskim i drugim tehnologijama koje omogućavaju<br />

razvoj sve inovativnijih <strong>usluga</strong>. Kao primjer takvih <strong>usluga</strong> mogu poslužiti lokacijski<strong>za</strong>snovane<br />

usluge (engl. location based services) koje korisniku isporučuje razne informacije<br />

<strong>za</strong>snovane <strong>na</strong> lokaciji.<br />

U ovom radu su obrađene neke od tehnologija koje se koriste <strong>za</strong> razvoj <strong>usluga</strong> kojima se<br />

pristupa s malog uređaja. SIP (Session Initiation Protocol) [1] je postao ključni protokol u<br />

telekomunikacijskim mrežama novije generacije, pogotovo dijelu jezgrene mreže IMS-u (IP<br />

Multimedia Subsystem) [2], omogućujući usluge poput prijenosa govornih i video poziva,<br />

video konferencija, prijenosa podataka, poruka, informacija o prisutnosti, video igara i dr. U<br />

omogućavanju <strong>na</strong>vedenih <strong>usluga</strong> veliku ulogu imaju SIP servleti [3] koji su <strong>za</strong>duženi <strong>za</strong><br />

poslužiteljsku stranu sustava. Njihovo izvođenje ne bi bilo moguće bez aplikacijskih<br />

poslužitelja <strong>na</strong> kojima se izvode pa je u radu obrađen i korišten SailFin [4] kao aplikacijski<br />

poslužitelj. Sve to nema smisla ako korisnik ne može pristupiti <strong>na</strong>vedenim <strong>usluga</strong>ma. Stoga je<br />

dio rada posvećen J2ME (Java 2 Micro Edition) [5] tehnologiji koja omogućava razvoj i<br />

izvođenje klijentskih aplikacija <strong>na</strong> malim uređajima.<br />

Cilj ovog rada je bio upoz<strong>na</strong>ti se sa svim <strong>na</strong>vedenim tehnologijama i steče<strong>na</strong> z<strong>na</strong>nja<br />

primijeniti u izradi jedne lokacijski-<strong>za</strong>snovane usluge.<br />

1


1. Java <strong>na</strong> malim uređajima<br />

Posljedica <strong>na</strong>glog razvoja mobilnih tehnologija u posljednje vrijeme je <strong>na</strong>sta<strong>na</strong>k mnoštva<br />

različitih malih uređaja prilagođenim svim vrstama korisnika i <strong>usluga</strong>. Upravo zbog te<br />

raznolikosti malih uređaja, njihovih mogućnosti i operacijskih sustava i činjenice da je<br />

neovis<strong>na</strong> o platformi Java je postala vodeći programski jezik <strong>za</strong> razvoj aplikacija <strong>za</strong> male<br />

uređaje. Pošto mali uređaji imaju ograničenu procesorsku moć, ograničenu količinu memorije<br />

te ograničenja ulazno-izlaznih jedinica, bilo je potrebno prilagoditi Java platformu da se može<br />

izvoditi <strong>na</strong> takvim uređajima. Reducira<strong>na</strong> verzija Jave <strong>za</strong> male uređaje je Java 2 Micro<br />

Edition (J2ME). Pod pojmom mali uređaji podrazumijevamo širok spektar uređaja s različitim<br />

mogućnostima, među kojima su npr. mobilni telefoni, ruč<strong>na</strong> raču<strong>na</strong>la (PDA), pametni telefoni<br />

(engl. smart phones) i dr. S obzirom <strong>na</strong> raznolikost uređaja bilo je potrebno prilagoditi J2ME<br />

programsku okolinu, što se postiglo definirajući različite konfiguracije, profile i dodatne<br />

pakete koji su prilagođeni određenoj vrsti uređaja.<br />

1.1. Izvođenje Java aplikacija <strong>na</strong> malim uređajima<br />

Da bi se bolje razumjelo kako se Java izvodi <strong>na</strong> malim uređajima potrebno je prvo objasniti<br />

proces <strong>na</strong>stanka Java koda i izvođenja <strong>na</strong> Java 2 Standard Edition (J2SE) platformi. Kao<br />

vizual<strong>na</strong> pomoć može poslužiti Sl. 1.1.<br />

Sl. 1.1 Razvoj i izvođenje J2SE aplikacija<br />

Vidimo da se prvo <strong>na</strong>piše izvorni kod u nekom editoru. Prevodilac (engl. compiler) prevodi<br />

taj kod u međukod koji se u Java svijetu zove bajt-kod (engl. bytecode). Važnost međukoda je<br />

u činjenici da je prevodilac puno složeniji od pokretača aplikacija. Pošto se prevođenje odvija<br />

samo jednom dobiva se <strong>na</strong> brzini izvođenja aplikacija. Također, takav međukod je neovisan o<br />

platformi te se zbog toga može izvoditi <strong>na</strong> različitim operacijskim sustavima.<br />

2


Javin pokretač aplikacija (engl. Java Application Launcher) pokreće okolinu <strong>za</strong> izvršavanje<br />

aplikacija (engl. Java Runtime Environment, skraćeno JRE). JRE se sastoji od Java virtualnog<br />

stroja (engl. Java Virtual Machine), jezgrenih klasa i pratećih datoteka i pruža minimalnu<br />

okolinu potrebnu <strong>za</strong> izvođenje aplikacija. Zadaća pokretača aplikacija je da učita specificirane<br />

klase te poziva odgovarajuću metodu main koja pokreće aplikaciju. Prilikom učitavanja klasa<br />

Java virtualni stroj vrši verifikaciju međukoda.<br />

Upravo je u verifikaciji međukoda glav<strong>na</strong> razlika između izvođenja aplikacija <strong>na</strong> malom<br />

uređaju. Na Sl. 1.2 je prika<strong>za</strong>n proces razvoja Java aplikacije <strong>za</strong> mali uređaj. Može se<br />

primijetiti da se procesorski <strong>na</strong>j<strong>za</strong>htjevniji dio obavlja <strong>na</strong> osobnom raču<strong>na</strong>lu <strong>na</strong> kojem se<br />

razvija aplikacija. J2ME virtualni stroj vrši samo daleko jednostavnije, linearno pregledavanje<br />

međukoda prilikom učitavanja klasa.<br />

Sl. 1.2 Razvoj i izvođenje J2ME aplikacija<br />

1.2. J2ME programska okoli<strong>na</strong><br />

J2ME programsku okolinu čine konfiguracije, profili i dodatni paketi.<br />

J2ME konfiguracije su specifikacije koje definiraju programsku okolinu <strong>za</strong> skup uređaja sa<br />

<strong>za</strong>jedničkim karakteristikama poput:<br />

• vrste i brzine procesora;<br />

• vrste i količine memorije;<br />

• vrsta mrežnih konekcija dostupnih malom uređaju.<br />

Konfiguracija predstavlja minimalnu platformu <strong>za</strong> pojedinu skupinu uređaja, a sastoji se od<br />

kombi<strong>na</strong>cije Java virtualnog stroja i osnovnih biblioteka funkcija koje čine osnovu <strong>za</strong> razvoj<br />

aplikacija <strong>na</strong>mijenjenih nekoj vrsti uređaja.<br />

U <strong>na</strong>stavku su detaljnije opisane konfiguracije Connected Device Configuration (CDC) [6] i<br />

Connected Limited Device Configuration (CLDC) [7], te profili koji su dodani tim<br />

3


konfiguracijama. Profili dodaju specifične biblioteke funkcija konfiguraciji ovisno o<br />

konkretnoj vrsti uređaja i njegovoj <strong>na</strong>mjeni.<br />

1.2.1. Connected Device Configuration<br />

CDC konfiguracija je definira<strong>na</strong> u JSR-36 i <strong>na</strong>mijenje<strong>na</strong> je grupi jačih malih uređaja koji<br />

imaju jači procesor, više memorije i bolji izbor konekcija. Ciljani uređaji kojima je<br />

<strong>na</strong>mijenjen CDC moraju imati 32-bitni procesor, <strong>na</strong>jmanje 2MB RAM-a i 2.5MB ROM-a<br />

raspoloživih <strong>za</strong> Java okolinu. Radi se o uređajima poput pametnih telefo<strong>na</strong>, PDA uređaja,<br />

telematičkih sustava ugrađenih u vozila, kućne elektronike i dr.<br />

Java virtualni stroj je sličan onom iz J2SE platforme, no svojim <strong>za</strong>htjevima prema resursima,<br />

performansama i pouzdanošću prilagođen malim uređajima.<br />

CDC ima bogatu biblioteku klasa koju minimalno čine:<br />

• java.lang – sadrži klase potrebne <strong>za</strong> funkcioniranje Java virtualnog stroja;<br />

• java.util – podskup općenitih metoda i sučelja iz J2SE ekvivalentnog paketa;<br />

• java.net – sadrži klase i sučelja <strong>za</strong> rukovanje TCP/IP i HTTP protokolima;<br />

• java.io – sadrži standardne klase <strong>za</strong> rukovanje ulazno-izlaznim jedinicama;<br />

• java.text – sadrži minimalne klase potrebne <strong>za</strong> lokali<strong>za</strong>ciju i inter<strong>na</strong>cio<strong>na</strong>li<strong>za</strong>ciju<br />

aplikacije;<br />

• java.security – sadrži osnovne klase i sučelja <strong>za</strong> implementaciju sigurnosti.<br />

CDC podržava tri glav<strong>na</strong> profila i mnoštvo opcio<strong>na</strong>lnih.<br />

Tri glav<strong>na</strong> profila su:<br />

• Foundation – biblioteka klasa <strong>za</strong>snovanih <strong>na</strong> J2SE, ne sadrži podršku <strong>za</strong> GUI;<br />

• Perso<strong>na</strong>l Basis – sadrži Foundation profil uz dodatak podrške <strong>za</strong> lagane (engl.<br />

lightweight) komponente i Xlete koji su slični Java appletima no koji su di<strong>za</strong>jnirani<br />

<strong>za</strong> izradu aplikacija <strong>za</strong> digitalnu televiziju;<br />

• Perso<strong>na</strong>l – osim Perso<strong>na</strong>l Basis profila sadrži i punu podršku <strong>za</strong> GUI i applete.<br />

Opcio<strong>na</strong>lni paketi uvode dodatne funkcio<strong>na</strong>lnosti koje se ne pojavljuju u osnovnim profilima<br />

poput podrške <strong>za</strong> RMI (Remote Method Invocation) i JDBC (Java Database Connectivity).<br />

4


1.2.2. Connected Limited Device Configuration<br />

CLDC konfiguracija je definira<strong>na</strong> u JSR-30 i JSR-139 i <strong>na</strong>mijenje<strong>na</strong> je grupi slabijih malih<br />

uređaja koje karakterizira česti gubitak veze s mrežom, ograniče<strong>na</strong> količi<strong>na</strong> memorije, spori<br />

procesori i jako ograničene ulazno-izlazne jedinice. To su uređaji poput mobilnih telefo<strong>na</strong>,<br />

pagera i manje <strong>na</strong>prednih ručnih raču<strong>na</strong>la. Minimalni uvjeti koje moraju <strong>za</strong>dovoljavati su:<br />

• 16 ili 32-bitni procesor brzine <strong>na</strong>jmanje 16MHz;<br />

• 160KB <strong>na</strong> raspolaganju <strong>za</strong> Java virtualni stroj i njegove pripadajuće biblioteke, od<br />

kojih su 32KB izbrisive (engl. volatile) memorije, a ostalih 128KB neizbrisive<br />

(engl. non-volatile) ;<br />

• 192KB ukupno memorije dostupno Java okolini;<br />

• mogućnost spajanja <strong>na</strong> mrežu.<br />

CLDC konfiguracija se sastoji od virtualnog stroja <strong>na</strong>zvanog Kilobytes Virtual<br />

Machine(KVM) veličine između 40 i 80KB, biblioteka osnovnih klasa iz J2SE, te dodatnih<br />

klasa koje ne postoje u J2SE. Može se reći da je CLDC konfiguracija podskup CDC<br />

konfiguracije, a sadrži sljedeće biblioteke klasa:<br />

• java.io – sadrži podskup osnovnih klasa iz ekvivalentnog J2SE paketa;<br />

• java.lang – sadrži klase potrebne <strong>za</strong> funkcioniranje Java virtualnog stroja;<br />

• java.util – podskup općenitih metoda i sučelja iz J2SE ekvivalentnog paketa ;<br />

• javax.microedition.io – klase <strong>za</strong> rukovanje ulazno-izlaznim jedinicama specifično<br />

<strong>na</strong>pravljene <strong>za</strong> CLDC konfiguraciju.<br />

Za CLDC konfiguraciju postoji mnoštvo API-ja i profila, no detaljnije će biti opisan<br />

<strong>na</strong>jpopularniji među njima – Mobile Information Device Profile (MIDP) [8].<br />

Trenut<strong>na</strong> verzija MIDP 2.0 definiran u JSR-118 je <strong>za</strong>mijenila MIDP 1.0 koji je bio definiran u<br />

JSR-37, dodajući mu nove funkcio<strong>na</strong>lnosti poput poboljšanog korisničkog sučelja, podrške <strong>za</strong><br />

multimediju i igre te bolju podršku <strong>za</strong> mrežne konekcije i sigurnost.<br />

MIDP podržavaju svi noviji mobilni uređaji pa postoji široka ba<strong>za</strong> korisnika aplikacija<br />

<strong>za</strong>snovanih <strong>na</strong> njemu. Razvijateljima aplikacija nudi mogućnosti manipuliranja kamerom,<br />

GPS-om, konekcijama preko GPRS/EDGE tehnologije te uz prije <strong>na</strong>vedeno ne čudi što je<br />

upravo on da<strong>na</strong>s <strong>na</strong>jpopularniji profil.<br />

Uvjeti koje uređaj mora <strong>za</strong>dovoljavati da bi se <strong>na</strong> njemu mogle izvršavati MIDP aplikacije su:<br />

• ekran veličine 96x52 piksela;<br />

5


• dubi<strong>na</strong> prika<strong>za</strong> boja od 1 bita;<br />

• mora postojati tipkovnica ili ekran osjetljiv <strong>na</strong> dodir;<br />

• 128KB <strong>za</strong> MIDP aplikacije;<br />

• 8KB <strong>za</strong> trajno pohranjene podatke aplikacija;<br />

• 32KB memorije <strong>za</strong> izvršavanje;<br />

• dvosmjer<strong>na</strong> bežič<strong>na</strong> mreža.<br />

MIDP se osim osnovnih CLDC paketa sastoji i od niže <strong>na</strong>vedenih:<br />

• javax.microedition.lcdui – klase i sučelja <strong>za</strong> upravljanje prikazom;<br />

• javax.microedition.rms – Record Ma<strong>na</strong>gement System (RMS) koji služi <strong>za</strong> trajno<br />

pohranjivanje podataka;<br />

• javax.microedition.midlet – klase i sučelja <strong>na</strong>mijenjene stvaranju MIDP aplikacija.<br />

1.3. MIDlet<br />

MIDlet (skraćeno od Mobile Information Device Application) je aplikacija koja se izvodi <strong>na</strong><br />

uređajima koji podržavaju CLDC i MIDP. Jedan ili više MIDleta pakiranih u jedan JAR (Java<br />

Archive) čine MIDlet Suite.<br />

Razvojni ciklus MIDleta sastoji se od pet ili šest fa<strong>za</strong>. To su redom:<br />

• pisanje koda – nužno je prvo proučiti dokumentaciju i <strong>na</strong>učiti se služiti<br />

bibliotekama dostupnim <strong>za</strong> razvoj MIDleta;<br />

• prevođenje koda u međukod – prevođenje vrši prevodilac (javac), rezultat<br />

prevođenja su .class datoteke;<br />

• predprovjera koda – traže se reference <strong>na</strong> klase koje MIDP ne podržava; cilj je<br />

smanjiti opterećenje KVM prilikom izvršavanja MIDleta jer on mora samo linearno<br />

provjeriti kod što ne traži puno resursa;<br />

• pakiranje u JAR – izvršne datoteke se pakiraju u jednu <strong>za</strong>jedničku datoteku u ZIP<br />

formatu;<br />

• stvaranje JAD datoteke – tekstual<strong>na</strong> datoteka koja služi <strong>za</strong> opis aplikacije;<br />

• potpisivanje MIDleta – uvedeno od verzije MIDP 2.0; olakšava definiranje<br />

sigurnosne politike izvršavanja MIDleta <strong>na</strong> malom uređaju, a korisniku olakšava<br />

korištenje jer ne mora svaki put iznova odobravati pristup <strong>za</strong>štićenim API-jima.<br />

6


Svaki MIDlet <strong>na</strong>sljeđuje klasu javax.microedition.midlet.MIDlet koja definira tri apstraktne<br />

metode i koje definiraju njegov životni ciklus (Sl. 1.3):<br />

• pauseApp - MIDlet je inicijaliziran, no ne smije koristiti <strong>za</strong>jedničke resurse;<br />

• startApp – normalno fukncioniranje MIDleta;<br />

• destroyApp – <strong>za</strong>vršetak rada, oslobađanje svih resursa.<br />

Sl. 1.3 Životni ciklus MIDleta<br />

MIDlet se izvodi u okolini koju kontrolira aplikacijski upravitelj (engl. application ma<strong>na</strong>ger).<br />

Aplikacijski upravitelj je <strong>za</strong>dužen <strong>za</strong> instalaciju, izvršavanje, pauziranje i uništavanje MIDleta<br />

te omogućavanje pristupa pojedinim MIDletima do izvršnih datoteka Java virtualnog stroja<br />

odnosno CLDC-a. Također je <strong>za</strong>dužen i <strong>za</strong> dojavljivanje MIDletu ako se dogodi neki događaj<br />

<strong>na</strong> što se onda u njemu pokreću određene metode.<br />

Jedan takav događaj je i samo pokretanje MIDleta <strong>na</strong>kon kojeg će se pokrenuti metoda<br />

startApp koja tipično pokreće početni prikaz <strong>za</strong> odabir opcija korisniku. Ako korisniku npr.<br />

<strong>za</strong>zvoni mobilni uređaj, aplikacijski upravitelj će pozvati metodu pauseApp koja će <strong>za</strong>ustaviti<br />

izvršavanje MIDleta. Moguća je situacija da MIDlet više nije potreban ili da nekoj<br />

prioritetnijoj aplikaciji treba memorijski prostor – ukoliko se to dogodi, aplikacijski upravitelj<br />

će pozvati metodu destroyApp čime će životni ciklus MIDleta biti <strong>za</strong>vršen.<br />

MIDlet se distribuira <strong>na</strong> uređaj u JAR datoteci koja sadrži sve izvršne (.class) datoteke i ostale<br />

<strong>za</strong> aplikaciju potrebne datoteke poput npr. slika i konfiguracijskih datoteka, no u pravilu<br />

dolazi i sa JAD (Java Definition) datotekom koja opisuje MIDlet.<br />

Da bi JAR datoteka bila izvrš<strong>na</strong>, uz gore <strong>na</strong>vedene datoteke, dolazi i poseb<strong>na</strong> manifest<br />

datoteka koja između ostalog govori koja je glav<strong>na</strong> izvrš<strong>na</strong> datoteka. Manifest datoteka se<br />

7


sastoji od više parova ime-vrijednost kojih ima devet, ali samo je šest obavezno. Ovako<br />

izgleda jed<strong>na</strong> takva datoteka (manifest.mf):<br />

Manifest-Version: 1.0<br />

MIDlet-Vendor: Midlet Suite Vendor //isporučitelj<br />

MIDlet-Version: 1.0.0 //verzija<br />

MIDlet-1: LocationMIDlet,,hr.tel.fer.semi<strong>na</strong>r.midlet.LocationMIDlet<br />

//paket<br />

MicroEdition-Configuration: CLDC-1.1 //vrsta konfiguracije<br />

MIDlet-Name: LocationMIDlet Midlet Suite //ime<br />

MicroEdition-Profile: MIDP-2.0 //vrsta profila<br />

JAD datoteka se koristi <strong>za</strong> prosljeđivanje parametara MIDletu bez modificiranja JAR datoteke<br />

i <strong>za</strong> pružanje dodatnih informacija o JAR datoteci aplikacijskom upravitelju koje mu između<br />

ostaloga govore može li se MIDlet pokrenuti <strong>na</strong> dotičnom uređaju.<br />

Struktura unutar JAD-a je slič<strong>na</strong> kao kod manifest datoteke, a neka polja poput ime<strong>na</strong>, verzije<br />

i isporučitelja moraju odgovarati onima iz manifest datoteke.<br />

Jed<strong>na</strong> takva datoteka (LocationMIDlet.jad) izgleda ovako:<br />

MIDlet-1: LocationMIDlet,,hr.tel.fer.semi<strong>na</strong>r.midlet.LocationMIDlet<br />

//paket<br />

MIDlet-Jar-Size: 4306 //veliči<strong>na</strong> JAR datoteke<br />

MIDlet-Jar-URL: LocationMIDlet.jar<br />

MIDlet-Name: LocationMIDlet Midlet Suite<br />

MIDlet-Vendor: Midlet Suite Vendor<br />

MIDlet-Version: 1.0.0<br />

MicroEdition-Configuration: CLDC-1.1<br />

MicroEdition-Profile: MIDP-2.0<br />

Polje MIDlet-Jar-URL je <strong>za</strong>nimljivo jer omogućava da se <strong>na</strong> malom uređaju pokrene samo<br />

JAD datoteka, a da se JAR <strong>na</strong>k<strong>na</strong>dno skine preko mreže.<br />

8


2. Servlet<br />

Servleti [9] su komponente <strong>na</strong>pisane u Javi koje se izvode <strong>na</strong> poslužiteljskoj strani i koje<br />

di<strong>na</strong>mički obrađuju <strong>za</strong>htjeve klije<strong>na</strong>ta i stvaraju odgovarajuće odgovore <strong>na</strong> te <strong>za</strong>htjeve.<br />

Ubrzo <strong>na</strong>kon što se Web počeo koristiti <strong>za</strong> usluge, prepoz<strong>na</strong>ta je potreba <strong>za</strong> stvaranje<br />

di<strong>na</strong>mičkog sadržaja. Jedan od prvih pokušaja u ostvarivanju tog cilja su bili Java appleti koji<br />

su se izvodili <strong>na</strong> klijentskoj strani i omogućavali interakciju s korisnicima. Otprilike u isto<br />

vrijeme su se počele koristiti CGI (Common Gateway Interface) skripte koje su se izvodile <strong>na</strong><br />

poslužiteljskoj strani i omogućavale di<strong>na</strong>mičko generiranje sadržaja. Iako vrlo popularne,<br />

imale su mnogo nedostataka poput ovisnosti o platformi te loše skalabilnosti. Upravo da bi se<br />

riješili ti problemi razvili su se servleti koji su pružali di<strong>na</strong>mički sadržaj, a mogli su se<br />

izvoditi <strong>na</strong> različitim platformama.<br />

Kao i svaki drugi Java kod, da bi se mogao izvršavati servlet se mora prevesti u međukod.<br />

Servleti se izvršavaju <strong>na</strong> aplikacijskom poslužitelju koju učitava i pokreće datoteke servleta.<br />

Dio aplikacijskog poslužitelja koji upravlja životnim vijekom servleta, prihvaća <strong>za</strong>htjeve od<br />

klije<strong>na</strong>ta i šalje odgovore generirane u servletu <strong>na</strong>ziva se servlet kontejner.<br />

Servlet kontejner može biti ugrađen u poslužitelj ili instaliran kao njegova dodat<strong>na</strong><br />

komponenta, a izvoditi se može unutar istog procesa kao poslužitelj, drugog procesa unutar<br />

raču<strong>na</strong>la ili <strong>na</strong> nekom drugom raču<strong>na</strong>lu.<br />

Svaki servlet mora implementirati Servlet sučelje koje se <strong>na</strong>lazi unutar paketa javax.servlet.<br />

To sučelje propisuje metode koje <strong>za</strong>pravo definiraju životni ciklus servleta koji se sastoji od<br />

sljedećih koraka:<br />

1. Servlet se instancira i učitava u kontejner prilikom pokretanja kontejnera.<br />

2. Kontejner poziva init() metodu koja inicijalizira servlet. Metoda init() se pokreće<br />

samo jednom, a nuž<strong>na</strong> je da bi servlet mogao početi primati <strong>za</strong>htjeve.<br />

3. Normalni rad servleta. Servlet može primati <strong>za</strong>htjeve koji se poslužuju u <strong>za</strong>sebnim<br />

nitima. Servletu <strong>za</strong>htjeve prosljeđuje kontejner koji prilikom dolaska <strong>za</strong>htjeva<br />

poziva metodu service() koja služi <strong>za</strong> razvrstavanje <strong>za</strong>htjeva po tipu i koja zove<br />

odgovarajuće metode <strong>za</strong>dužene <strong>za</strong> obradu tih <strong>za</strong>htjeva. Za implementaciju tih<br />

9


metoda je <strong>za</strong>dužen programer, a ukoliko to ne učini, pozvat će se metode <strong>na</strong>dklase<br />

što će rezultirati slanjem poruke o grešci klijentu koji je poslao <strong>za</strong>htjev.<br />

4. Životni vijek servleta <strong>za</strong>vršava pozivanjem metode destroy() od strane kontejnera.<br />

Metoda destroy() se kao i metoda init() poziva samo jednom.<br />

Ilustraciju životnog ciklusa servleta možete vidjet <strong>na</strong> Sl. 2.1.<br />

Sl. 2.1 Životni ciklus servleta<br />

Servlet tehnologija je u početku razvija<strong>na</strong> <strong>za</strong> HTTP. Prvot<strong>na</strong> specifikacija servleta <strong>na</strong>glašava<br />

da servlet kontejner mora podržavati HTTP protokol. Pošto se u ovom radu koriste SIP<br />

servleti koji su slični HTTP servletima, objasnit će se njihov <strong>na</strong>čin rada, a eventualne razlike<br />

između njih će biti spomenute.<br />

2.1. SIP servlet<br />

SIP servlet je komponenta <strong>temelje<strong>na</strong></strong> <strong>na</strong> Javi kojom upravlja SIP servlet kontejner i koja se<br />

koristi SIP sig<strong>na</strong>li<strong>za</strong>cijom. SIP kontejner prihvaća <strong>za</strong>htjeve klije<strong>na</strong>ta te ih prosljeđuje do<br />

servleta koji generira odgovore i opet preko SIP kontejnera šalje <strong>na</strong>trag klijentima.<br />

SIP specifikacija <strong>za</strong>htjeva da SIP elementi podržavaju TCP i UDP transportne protokole, no<br />

mogu podržavati i TLS, SCTP i ostale protokole <strong>za</strong> ugrađenim sigurnosnim mehanizmima.<br />

SIP servlet kontejner osluškuje SIP promet <strong>na</strong> svojim priključnicama (engl. socket) koje<br />

koriste gore <strong>na</strong>vedene protokole te dobivene <strong>za</strong>htjeve prosljeđuje servletu.<br />

SIP Servlet API, slično kao i HTTP Servlet API, <strong>na</strong>dograđuje generički servlet API<br />

javax.servlet, a <strong>na</strong>lazi se u javax.servlet.sip.<br />

10


Glavnu razliku HTTP i SIP aplikacija čini činjenica da se SIP aplikacije mogu po<strong>na</strong>šati i kao<br />

klijent i kao poslužitelj odnosno primati, ali i generirati <strong>za</strong>htjeve, <strong>za</strong> razliku od HTTP<br />

aplikacija koje su isključivo u klijent-poslužitelj odnosu.<br />

SIP Servlet API između ostalog mora podržavati sljedeće mogućnosti:<br />

• primanje odgovora i <strong>za</strong>htjeva;<br />

• slanje <strong>za</strong>htjeva i odgovora – dodatno slanje višestrukih odgovora; npr. poruke 100<br />

Trying, pa <strong>na</strong>kon toga 180 Ringing;<br />

• preusmjeravanja <strong>za</strong>htjeva uz mogućnost odabira više odredišnih desti<strong>na</strong>cija.<br />

SIP aplikacije se pokreću ako se dogodi događaj <strong>na</strong> koji su one registrirane. Ti događaji mogu<br />

biti <strong>za</strong>htjevi ili odgovori koje kontejner predaje aplikaciji preko service() metode koja se<br />

<strong>na</strong>lazi u javax.servlet.Servlet sučelju. Metoda service() ustanovljuje radi li se o <strong>za</strong>htjevu ili<br />

odgovoru te ih <strong>na</strong> temelju toga prosljeđuje do doRequest(SipServletRequest request) ili do<br />

doResponse(SIPServletResponse response) metode kako je prika<strong>za</strong>no <strong>na</strong> Sl. 2.2. Metode<br />

doRequest i doResponse <strong>na</strong> temelju vrste <strong>za</strong>htjeva ili odgovora pozivaju metodu koja je<br />

<strong>za</strong>duže<strong>na</strong> <strong>za</strong> obradu tih događaja i koju je programer dužan implementirati. Metoda doRequest<br />

prima objekt SipServletRequest koji predstavlja <strong>za</strong>htjev, a <strong>za</strong> odgovor, odnosno objekt tipa<br />

SipServletResponse se mora pobrinuti programer zbog <strong>za</strong>htjeva komunikacije jedan <strong>na</strong> više.<br />

Sl. 2.2 Obrada događaja kod SIP servleta<br />

11


3. SailFin<br />

SailFin je aplikacijski poslužitelj <strong>na</strong>stao spajanjem Ericssonove SIP Servlets tehnologije i<br />

Sunovog GlassFish [10] aplikacijskog poslužitelja.<br />

Sun GlassFish Enterprise Server je open source aplikacijski poslužitelj koji se razvija pod<br />

<strong>na</strong>dzorom Sun Microsystema <strong>za</strong> Java Enterprise Edition platformu. Projekt je pokrenut kada<br />

su Sun i Oracle donirali kod <strong>na</strong> kojem je temeljen razvoj GlassFisha. GlassFish je kao<br />

besplatan softver pod dvije licence, CDDL [11] i GPL [12]. On kao poslužitelja Web<br />

aplikacija koristi i<strong>na</strong>čicu Apache Tomcata [13] sa dodatnom komponentom Grizzly koja je<br />

<strong>za</strong>duže<strong>na</strong> <strong>za</strong> skalabilnost i brzinu izvođenja, dok je sustav <strong>za</strong> perzistenciju podatka preuzet od<br />

Oracle TopLink [14] sustava.<br />

Glavni cilj SailFin projekta je <strong>na</strong>praviti kontejner <strong>za</strong> SIP servlete koji će implementirati JSR-<br />

289 [15]. Java Specification Request (JSR) je dokument koji Java Community Process (JCP)<br />

podnosi Program Ma<strong>na</strong>gement Officeu (PMO), a u kojem se predlaže nova specifikacija ili<br />

z<strong>na</strong>tno poboljšanje stare specifikacije. JSR-289 definira poboljšanja specifikacije SIP Servlet<br />

API-ja u skladu sa <strong>za</strong>htjevima industrije te definira model međudjelovanja SIP Servleta s Java<br />

EE (Enterprise Edition) komponentama.<br />

U trenutnoj verziji SailFi<strong>na</strong> je implementiran JSR-116 u kojem je definiran osnovni SIP<br />

Servlet API, a <strong>na</strong> implementaciji JSR-289 se još uvijek radi.<br />

SailFin omogućuje izvođenje konvergiranih aplikacija pošto njegov kontejner osim SIP<br />

servleta podržava i HTTP servlete. Pod pojmom konvergiranih aplikacija se misli <strong>na</strong> one<br />

aplikacije koje korištenjem više protokola omogućavaju telekomunikacijske usluge. Jed<strong>na</strong><br />

takva <strong>usluga</strong> bi <strong>na</strong> primjer mogla biti mogućnost pozivanja <strong>za</strong>poslenika prilikom kupovine u<br />

Web dućanu pritiskom <strong>na</strong> link u svrhu dobivanja dodatnih informacija o proizvodu.<br />

Da bi se aplikacije mogle izvoditi moraju se poštivati određe<strong>na</strong> pravila smještaja tih aplikacija<br />

unutar strukture direktorija SailFi<strong>na</strong>. Unutar direktorija SIP aplikacije mora postojati WEB-<br />

INF direktorij unutar kojeg se <strong>na</strong>lazi sip.xml konfiguracijska datoteka. Izvršne datoteke se<br />

smještaju u direktorij WEB-INF/classes, a sve ostale klase i biblioteke klasa koje aplikacija<br />

koristi se smještaju u direktorij WEB-INF/lib.<br />

12


Kako bi kontejner z<strong>na</strong>o koji servlet treba pozvati <strong>na</strong>kon prispjelog <strong>za</strong>htjeva, servleti se moraju<br />

mapirati. Mapiranje se vrši unutar sip.xml.<br />

Zahtjevi se razvrstavaju <strong>na</strong> temelju:<br />

• Vrste <strong>za</strong>htjeva<br />

• Razlikovanja početnih i <strong>na</strong>k<strong>na</strong>dnih <strong>za</strong>htjeva, te početnih i <strong>na</strong>k<strong>na</strong>dnih odgovora<br />

• Korištenja logičkih operatora među poljima <strong>za</strong>glavlja<br />

Glavni dijelovi <strong>za</strong>htjeva su:<br />

• method – definira metodu <strong>za</strong>htjeva;<br />

• uri – URI <strong>za</strong>htjeva;<br />

• from – sadržaj From polja <strong>za</strong>glavlja;<br />

• to – sadržaj To polja <strong>za</strong>glavlja.<br />

Glavni dijelovi se mogu sastoji od više unutarnjih dijelova. Npr. from može biti SIP URI koji<br />

se sastoji od scheme, user, host i port dijelova.<br />

Logički uvjeti koji se mogu koristiti <strong>na</strong>d tim poljima <strong>za</strong>glavlja i njihovim dijelovima su:<br />

• equal – uspoređuje varijablu s nekim z<strong>na</strong>kovnim nizom;<br />

• exists – provjerava postoji li neka varijabla;<br />

• contains – provjerava sadrži li neka varijabla određeni z<strong>na</strong>kovni niz;<br />

• subdomain-of – provjerava je li neki z<strong>na</strong>kovni niz poddome<strong>na</strong> određenog URI-ja;<br />

• and – provjerava jesu li svi uvjeti <strong>za</strong>dovoljeni;<br />

• or – provjerava je li neki od svih uvjeta <strong>za</strong>dovoljen;<br />

• not – negira vrijednost.<br />

Važno je <strong>na</strong>pomenuti da SIP kontejner poziva servlete po određenim pravilima. Prvo pravilo<br />

je da se pozivaju svi servleti koji su mapirani <strong>na</strong> određenu vrstu <strong>za</strong>htjeva ako oni<br />

<strong>za</strong>dovoljavaju uvjete. Drugo pravilo je da se pozivaju onim redom kojim su <strong>na</strong>vedeni u<br />

konfiguracijskoj datototeci ako ih ima više koji <strong>za</strong>dovoljavaju uvjete.<br />

Primjer jedne konfiguracijske datoteke izgleda ovako:<br />

<br />

<br />

SIP Primjer <br />

primjer SIP konfiguracijske datoteke <br />

<br />

13


SIPServlet1 <br />

<br />

semi<strong>na</strong>r.SIPServlet1<br />

<br />

<br />

<br />

SIPServlet2 <br />

<br />

semi<strong>na</strong>r.SIPServlet2<br />

<br />

<br />

<br />

SIPServlet1 <br />

<br />

<br />

<br />

request.method<br />

MESSAGE<br />

<br />

<br />

request.method<br />

INVITE<br />

<br />

<br />

<br />

<br />

<br />

SIPServlet2 <br />

<br />

<br />

request.method<br />

INVITE<br />

<br />

<br />

<br />

<br />

U ovom primjeru možemo vidjeti kako u praksi izgleda mapiranje. Elementi display-<strong>na</strong>me i<br />

description služe <strong>za</strong> definiranje ime<strong>na</strong> servleta koje će se poka<strong>za</strong>ti i njegov opis. Unutar<br />

elementa servlet se <strong>na</strong>vode ime stvarnog servleta i njegova glav<strong>na</strong> klasa sa punom putanjom<br />

do nje. Unutar elementa servlet-<strong>na</strong>me potrebno je <strong>na</strong>vesti točno ime servleta koje se mora<br />

slagati s onim koje je <strong>na</strong>vedeno prije u elementu servlet, dok se unutar pattern elementa<br />

<strong>na</strong>vodi uvjete koje <strong>za</strong>htjev mora ispuniti da bi se pokrenuo dotični servlet. U ovom slučaju će<br />

se <strong>za</strong>htjevi doći do servleta SIPServlet1 ako su oni tipa MESSAGE ili INVITE, a do<br />

SIPServlet2 ako su oni tipa INVITE. Na ovom primjeru se može vidjeti i kako se primjenjuje<br />

pravilo pozivanja servleta u slučaju da više njih ima <strong>za</strong>dovoljava postavljene uvjete. Ako npr.<br />

dođe INVITE <strong>za</strong>htjev morat će se pozvati oba servleta jer oba <strong>za</strong>dovoljavaju uvjet, no pozivat<br />

će se onim redom kojim su <strong>na</strong>vedeni u konfiguracijskoj datoteci. Pošto je SIPServlet1<br />

<strong>na</strong>veden prvi, u ovom slučaju će se prvo on pozvati, a tek <strong>na</strong>kon njega SIPServlet2.<br />

14


4. IMS Location Server<br />

IMS Location Server (ILS) je SIP aplikacijski poslužitelj razvijen u Ericsson Nikoli Tesli.<br />

Njegova uloga u IMS-u je da služi kao spo<strong>na</strong> sa sustavom <strong>za</strong> pozicioniranje. ILS nije<br />

odgovoran <strong>za</strong> pro<strong>na</strong>laženje krajnje lokacije korisnika, već <strong>za</strong> saz<strong>na</strong>vanje lokacije korisnika<br />

slanjem <strong>za</strong>htjeva do raspoloživog sustava <strong>za</strong> pozicioniranje.<br />

Drugi aplikacijski poslužitelji kojima trebaju lokacijski podaci ne trebaju tako izravno<br />

komunicirati sa sustavom <strong>za</strong> pozicioniranje već <strong>za</strong> njih to čini ILS koji zbog svojih ugrađenih<br />

funkcio<strong>na</strong>lnosti ne ovisi o pojedinim pružateljima <strong>usluga</strong>. ILS je prema tome omogućitelj<br />

usluge (engl. service e<strong>na</strong>bler).<br />

ILS se trenutno sastoji od dva glav<strong>na</strong> dijela:<br />

• Location Retrieval Function (LRF) – koristi se <strong>za</strong> dohvat lokacijskih informacija<br />

preko SIP sučelja<br />

• Position Ma<strong>na</strong>ger – simulator sustava <strong>za</strong> pozicioniranje<br />

Lokacijske informacije se prenose preko SUBSCRIBE/NOTIFY SIP komunikacijskog<br />

mehanizma. IMS aplikacijski poslužitelji, klijenti i ostali IMS entiteti lokaciju korisnika<br />

mogu <strong>za</strong>tražiti <strong>na</strong> više <strong>na</strong>či<strong>na</strong> slanjem SUBSCRIBE <strong>za</strong>htjeva ILS-u te primiti lokaciju:<br />

• Jednokratno – <strong>na</strong>kon primanja <strong>za</strong>htjeva ILS šalje trenutnu lokaciju korisnika;<br />

Expire polje u <strong>za</strong>glavlju <strong>za</strong>htjeva se postavlja <strong>na</strong> 0,<br />

• Periodično – <strong>na</strong>kon primanja <strong>za</strong>htjeva ILS periodički šalje lokaciju korisnika;<br />

Expire polje se postavlja <strong>na</strong> broj sekundi koje predstavljaju interval između slanja<br />

lokacije korisnika,<br />

• Uvjetno periodično – <strong>na</strong>kon primanja <strong>za</strong>htjeva ILS periodički šalje lokaciju<br />

korisnika ako je ispunjen određeni uvjet određen filterom; Expire polje se također<br />

postavlja <strong>na</strong> broj sekundi koje predstavljaju interval između slanja lokacije<br />

korisnika.<br />

Prema preporuci IETF-a ILS koristi protokolno ne<strong>za</strong>visni format <strong>za</strong> prijenos lokacijskih<br />

informacija - Presence Information Data Format (PIDF) <strong>za</strong>snovan <strong>na</strong> XML-u. PIDF koristi<br />

Geography Markup Language (GML) kao osnovni format <strong>za</strong>pisa lokacijskih informacija.<br />

15


Position Ma<strong>na</strong>ger unutar LIS-a služi kao emulator sustava <strong>za</strong> pozicioniranje. Lokacija<br />

korisnika se može mijenjati pomoću miša, a moguće je dodavanje i brisanje korisnika te<br />

dodavanje različitih mapa. Za dodavanje mapa je osim samih mapa u nekom slikovnom<br />

formatu potrebno definirati koordi<strong>na</strong>tama gornju lijevu i donju desnu točku koordi<strong>na</strong>ta u<br />

posebnoj XML datoteci s ekstenzijom .map u direktoriju maps. Kako Position Ma<strong>na</strong>ger<br />

izgleda, može se vidjeti <strong>na</strong> Sl. 4.1.<br />

Sl. 4.1 Position Ma<strong>na</strong>ger<br />

16


5. Studijski slučaj usluge<br />

Semi<strong>na</strong>rski <strong>za</strong>datak je bio <strong>na</strong>praviti jednostavnu lokacijski <strong>za</strong>snovanu uslugu korištenjem<br />

J2ME i SIP servlet tehnologije koja omogućuje korisniku da <strong>na</strong> <strong>za</strong>slonu svog malog uređaja<br />

primi informaciju o lokaciji <strong>na</strong> kojoj se trenutno <strong>na</strong>lazi.<br />

Za reali<strong>za</strong>ciju usluge LocationInfo bilo je potrebno <strong>na</strong>praviti klijentsku aplikaciju koja će se<br />

izvršavati <strong>na</strong> malom uređaju i preko koje će korisnik <strong>za</strong>htijevati i primiti uslugu te aplikaciju<br />

<strong>na</strong> poslužitelju koja će primati <strong>za</strong>htjeve od korisničke aplikacije, slati upite <strong>za</strong> lokacijom<br />

korisnika do IMS Location Servera te vratiti korisniku njegovu lokaciju.<br />

Slijedni dijagram <strong>na</strong> Sl. 5.1 prikazuje izmjenu poruka između pojedinih entiteta.<br />

Sl. 5.1 Slijedni dijagram komunikacije<br />

Komunikacija među entitetima realiziranim u usluzi se <strong>za</strong>sniva tek <strong>na</strong> malom podskupu<br />

mogućnosti SIP protokola. Zbog jednostavnosti usluge nije bilo potrebno koristiti ništa osim<br />

MESSAGE i SUBSCRIBE <strong>za</strong>htjeva, obrade NOTIFY <strong>za</strong>htjeva poslanih od strane IMS Location<br />

Servera te slanja i primanja odgovora. Sljedeći primjeri poruka koje se šalju će pojasniti kako<br />

je realizira<strong>na</strong> komunikacija.<br />

Korisnikov upit <strong>za</strong> lokacijom se prenosi SIP <strong>za</strong>htjevom tipa MESSAGE, a izgleda ovako:<br />

MESSAGE sip:127.0.0.1:6080 SIP/2.0<br />

Content-Length: 0<br />

From: ;tag=1982152035<br />

Max-Forwards: 70<br />

Cseq: 1 MESSAGE<br />

Event: geolocation<br />

17


To: <br />

Content-Type: text/plain<br />

Via: SIP/2.0/UDP<br />

192.168.1.2:5060;branch=z9hG4bKebf8eb1d4eeabb1cdcd2a96f0db5820f;receiv<br />

ed=127.0.0.1<br />

Call-Id: 78196c28baa627397d234a03753634b6@192.168.1.2<br />

Zahtjev se šalje SailFin poslužitelju koji se <strong>na</strong>lazi <strong>na</strong> adresi 127.0.0.1:6080 i <strong>na</strong> kojem se<br />

izvršava SIP aplikacija koja obrađuje <strong>za</strong>htjeve što se vidi iz prve linije <strong>za</strong>htjeva. Da bi<br />

poslužiteljska aplikacija z<strong>na</strong>la da se radi o <strong>za</strong>htjevu <strong>za</strong> lokacijom postavlja se polje <strong>za</strong>glavlja<br />

Event <strong>na</strong> ključnu riječ geolocation. Osim toga, vrlo je bitno i polje From koje sadrži<br />

korisnikov SIP URI <strong>na</strong> temelju kojeg će se pro<strong>na</strong>ći njegova lokacija posredstvom ILS-a.<br />

Kada <strong>za</strong>htjev dođe do poslužitelja, on prepoz<strong>na</strong>je da se radi o <strong>za</strong>htjevu <strong>za</strong> lokacijom korisnika,<br />

te konstruira novi SIP <strong>za</strong>htjev tipa SUBSCRIBE koji se šalje ILS-u. Taj <strong>za</strong>htjev također ima<br />

polje Event postavljeno <strong>na</strong> geolocation da bi ILS mogao prepoz<strong>na</strong>ti kao <strong>za</strong>htjev <strong>za</strong> lokacijom.<br />

Nakon što je prepoz<strong>na</strong>o <strong>za</strong>htjev, treba mu i korisnikov SIP URI <strong>na</strong> temelju kojeg će pro<strong>na</strong>ći<br />

njegovu lokaciju, a koji se mora <strong>na</strong>laziti u polju To <strong>za</strong>glavlja SUBSCRIBE poruke. Zahtjev<br />

izgleda ovako:<br />

SUBSCRIBE sip:127.0.0.1:6090 SIP/2.0<br />

Max-Forwards: 70<br />

From: ;tag=fsuck844-1<br />

Expires: 0<br />

Cseq: 1 SUBSCRIBE<br />

Contact: <br />

Event: geolocation<br />

To: <br />

Call-Id: 5.28.254.69_1_5472694183377990708<br />

Kako je <strong>na</strong>vedeno u poglavlju o ILS-u, polje Expire se postavlja <strong>na</strong> vrijednost 0, jer se tako<br />

lokaciju korisniku dostavlja samo jednom.<br />

ILS <strong>na</strong>kon SUBSCRIBE <strong>za</strong>htjeva šalje dvije NOTIFY poruke kao što se može vidjeti u<br />

slijednom dijagramu. Prva NOTIFY poruka sadrži pending status jer ILS prvo provjerava<br />

postoji li korisnik s <strong>na</strong>vedenim URI-jem i traži njegovu lokaciju. Poruka izgleda ovako:<br />

NOTIFY sip:5.28.254.69:6080;fid=server_1 SIP/2.0<br />

Content-Length: 0<br />

Max-Forwards: 69<br />

From: ;tag=643a35df<br />

Expires: 0<br />

Cseq: 1 NOTIFY<br />

Contact: "Location Server" <br />

Event: geolocation<br />

To: ;tag=fsuck844-1<br />

18


Subscription-State: Pending<br />

Call-Id: 5.28.254.69_1_5472694183377990708<br />

Via: SIP/2.0/UDP<br />

127.0.0.1:6090;branch=z9hG4bK9772bd67897c4b15ba21005490a6a4c2<br />

Nakon što <strong>na</strong>đe lokaciju korisnika šalje drugu NOTIFY poruku u kojoj se <strong>na</strong>laze podaci o<br />

lokaciji korisnika <strong>za</strong>pisani u PIDF odnosno GML formatu.<br />

NOTIFY sip:5.28.254.69:6080;fid=server_1 SIP/2.0<br />

Content-Length: 499<br />

Max-Forwards: 69<br />

From: ;tag=643a35df<br />

Expires: 0<br />

Cseq: 2 NOTIFY<br />

Contact: "Location Server" <br />

Event: geolocation<br />

To: ;tag=fsuck844-1<br />

Content-Type: application/pidf+xml<br />

Subscription-State: termi<strong>na</strong>ted;reason=expired<br />

Call-Id: 5.28.254.69_1_5472694183377990708<br />

Via: SIP/2.0/UDP<br />

127.0.0.1:6090;branch=z9hG4bKb4b47f0eb0eb144c6f96c00f75d38675<br />

<br />

<br />

<br />

45.802499999999995<br />

15.9425manual<br />

Iz gore <strong>na</strong>vedeno primjera druge NOTIFY poruke se može vidjet kako se informacije o<br />

lokaciji prenose. Geografske koordi<strong>na</strong>te korisnika <strong>na</strong>laze se unutar taga .<br />

Poslužitelj izvlači podatke o lokaciji iz primljenog <strong>za</strong>htjeva te konstruira odgovor koji sadrži<br />

te podatke i koji se šalje <strong>na</strong> adresu korisnika. Kako taj odgovor izgleda vidi se iz slijedećeg:<br />

SIP/2.0 200 OK<br />

From: ;tag=629134088<br />

Cseq: 1 MESSAGE<br />

Longitude: 15.9425<br />

To: <br />

Server: Glassfish_SIP_1.0.0<br />

Latitude: 45.802499999999995<br />

Call-Id: e10ee021ef75202baa3116618ad650fa@192.168.1.2<br />

Via: SIP/2.0/UDP<br />

192.168.1.2:5060;branch=z9hG4bK5c3cdbc865fb28e17e0b705af9999c31;receiv<br />

ed=127.0.0.1<br />

19


5.1. Klijentska aplikacija<br />

Klijentska aplikacija (LocationMIDlet) je realizira<strong>na</strong> kao MIDlet. Sastoji se od jednostavnog<br />

GUI-ja koji kroz dvije forme omogućava korisniku da unese svoj SIP URI i lokaciju<br />

poslužitelja te vidi svoju lokaciju u obliku geografske širine i dužine te MessageSender klase<br />

koja služi <strong>za</strong> stvaranje <strong>za</strong>htjeva i primanje odgovora od poslužitelja. Tipičan primjer uporabe<br />

klijentske aplikacije se može vidjeti <strong>na</strong> Sl. 5.2 i Sl. 5.3.<br />

Sl. 5.2 Izbornik koji omogućava unos SIP URI-ja i adrese poslužitelja<br />

Sl. 5.3 Ekran koji prikazuje korisniku njegove geografske koordi<strong>na</strong>te<br />

20


Za detekciju događaja koje je izvazvao korisnik kao i u svakom MIDletu je <strong>za</strong>duže<strong>na</strong> metoda<br />

public void commandAction( Command c, Displayable d ) koja prima komandu koja sadrži<br />

informacije o događaju i objekt tipa Displayable koji <strong>za</strong>pravo predstavlja trenutnu formu koja<br />

je prika<strong>za</strong><strong>na</strong>. Dan je samo kratki isječak koda da se bolje objasni kako metoda funkcionira:<br />

else if ( d == initialForm )<br />

{<br />

if ( c == nextCommand )<br />

{<br />

msg = new MessageSender();<br />

msg.start();<br />

Display.getDisplay( this ).setCurrent( resultForm );<br />

}<br />

}<br />

Ovaj dio koda je <strong>za</strong>dužen <strong>za</strong> pokretanje klase <strong>za</strong>dužene <strong>za</strong> slanje <strong>za</strong>htjeva <strong>za</strong> lokacijom.<br />

Vidimo da se slanje <strong>za</strong>htjeva pokreće čim korisnik <strong>na</strong> formi <strong>za</strong> unos SIP URI-ja i adrese<br />

poslužitelja stisne komandu next. Također, vidimo da se odmah prikazuje ekran sa<br />

rezultatima. Klasa MessageSender je <strong>za</strong>duže<strong>na</strong> <strong>za</strong> slanje <strong>za</strong>htjeva te primanje odgovora i<br />

prikaz <strong>na</strong> ekranu. Da bi taj <strong>za</strong>datak mogla izvršavati o<strong>na</strong> mora <strong>na</strong>slijediti klasu Thread da bi se<br />

izvršavala neovisno o ostalim nitima, poput npr. GUI-ja, te implementirati<br />

SipClientConnectionListener da bi mogla primiti odgovor od poslužitelja. Njime je definira<strong>na</strong><br />

metoda notifyResponse(SipClientConnection sc) koja služi <strong>za</strong> primanje odgovora.<br />

Dio koda <strong>za</strong>dužen <strong>za</strong> slanje <strong>za</strong>htjeva izgleda ovako:<br />

try<br />

{<br />

//otvaranje konekcije prema poslužitelju<br />

sc = (SipClientConnection) Connector.open( "sip:"<br />

+ sailFinAdressField.getString() );<br />

sc.setListener( this ); //osluškuje eventualni odgovor<br />

sc.initRequest( "MESSAGE", null );//<strong>za</strong>htjev tipa MESSAGE<br />

SipAddress from = new SipAddress( sipAdressField.getString());<br />

sc.setHeader( "From", from.toString() );<br />

sc.setHeader( "Event", "geolocation" );//definiranje <strong>za</strong>htjeva<br />

sc.setHeader( "Content-Type", "text/plain" );<br />

sc.send(); //slanje <strong>za</strong>htjeva<br />

}<br />

Dio koda <strong>za</strong> primanje odgovora u metodi notifyResponse (poziva ju aplikacijski upravitelj):<br />

try<br />

{ //0 z<strong>na</strong>či da je MIDlet odmah spreman primiti odgovor<br />

boolean ok = sc.receive( 0 );<br />

if ( ok )<br />

{<br />

//ispis <strong>na</strong> ekran<br />

}<br />

sc.close(); }//<strong>za</strong>tvaranje konekcije <strong>na</strong>kon primanja odgovora<br />

21


5.2. Poslužiteljska aplikacija<br />

Poslužiteljska aplikacija (LocationServlet) je realizira<strong>na</strong> kao SIP servlet. Kad dođe <strong>za</strong>htjev<br />

od korisnika <strong>za</strong> lokacijom SIP kontejner prosljeđuje <strong>za</strong>htjev metodi doMessage<br />

(SipServletRequest request) koja provjerava je li Event polje postavljeno <strong>na</strong> geolocation. Ako<br />

je to slučaj, poziva metodu <strong>za</strong>duženu <strong>za</strong> stvaranje SUBSCRIBE <strong>za</strong>htjeva te stvara odgovor koji<br />

će se kasnije <strong>na</strong>dopunjen podacima o lokaciji poslati <strong>na</strong>trag korisniku.<br />

Odgovor se kreira <strong>na</strong> temelju <strong>za</strong>htjeva <strong>na</strong> sljedeći <strong>na</strong>čin:<br />

responseTo = request.createResponse(SipServletResponse.SC_OK);<br />

Metoda <strong>za</strong>duže<strong>na</strong> <strong>za</strong> stvaranje <strong>za</strong>htjeva je sendSubscribeMessage(SipServletRequest req):<br />

try {<br />

SipFactory factory = (SipFactory) getServletContext().<br />

getAttribute("javax.servlet.sip.SipFactory");<br />

MIDletAddress = req.getFrom().toString();<br />

sailFinAddress = req.getTo().toString();<br />

SipServletRequest request =<br />

factory.createRequest(req.getApplicationSession(), "SUBSCRIBE",<br />

sailFinAddress, MIDletAddress); //stvaranje <strong>za</strong>htjeva<br />

request.setRequestURI(factory.createURI(locationE<strong>na</strong>blerAddress));<br />

request.setHeader("Event", "geolocation");<br />

request.setExpires(0); //traži se samo jednokratno<br />

dostavljanje lokacije<br />

request.send();<br />

}<br />

Kada ILS pošalje odgovor, tj. NOTIFY poruku izvršava se doNotify(SipServletRequest req),<br />

koja je <strong>za</strong>duže<strong>na</strong> <strong>za</strong> komunikaciju s ILS-om, odnosno <strong>za</strong> slanje odgovora korisniku:<br />

req.createResponse(200).send(); //kreiranje odgovora ILS-u<br />

if (!req.isInitial()) {//samo drugi NOTIFY nosi lokacijske podatke<br />

try {<br />

String gmlContent = new String((byte[])<br />

req.getContent());<br />

String position = XMLHelper.getTagContent(gmlContent,<br />

"pos");<br />

String[] temp = position.split(" ");<br />

responseTo.setHeader("Latitude", temp[0]);<br />

responseTo.setHeader("Longitude", temp[1]);<br />

responseTo.send();<br />

}<br />

Klasa XMLHelper je pomoć<strong>na</strong> klasa koja <strong>na</strong> temelju teksta u xml formatu i <strong>na</strong>ziva taga čita<br />

vrijednost <strong>za</strong>pisanu unutar njega. Da bi se o<strong>na</strong> mogla izvoditi korište<strong>na</strong> je biblioteka JDOM<br />

koja sadrži metode <strong>za</strong> manipulaciju xml podacima, poput parsiranja i ispisa.<br />

22


Iz gore <strong>na</strong>vedenog koda se jos može vidjeti kako se postavljaju <strong>za</strong>glavlja odgovora koji se<br />

šalje klijentu.<br />

U pripadajućoj sip.xml datoteci <strong>na</strong> temelju koje SIP kontejner prosljeđuje upite<br />

LocationServletu definirano je da se <strong>za</strong>htjevi prosljeđuju jedino ako su tipa MESSAGE i<br />

NOTIFY što se može vidjeti ispod.<br />

<br />

<br />

Location Servlet <br />

<br />

LocationServlet <br />

<br />

hr.fer.tel.semi<strong>na</strong>r.LocationServlet<br />

<br />

<br />

<br />

LocationServlet <br />

<br />

<br />

<br />

request.method<br />

MESSAGE<br />

<br />

<br />

request.method<br />

NOTIFY<br />

<br />

<br />

<br />

<br />

<br />

23


6. Zaključak<br />

Izrada ovog semi<strong>na</strong>rskog rada je obuhvatila upoz<strong>na</strong>vanje sa osnovnim tehnologijama koje se<br />

koriste <strong>za</strong> razvoj klijentskih i poslužiteljskih aplikacija temeljenih <strong>na</strong> Java programskom<br />

jeziku i SIP-u kao protokolu <strong>za</strong>duženom <strong>za</strong> komunikaciju između njih.<br />

Za izradu klijentske aplikacije je korište<strong>na</strong> J2ME platforma koja kroz svoje API-je nudi<br />

bogate mogućnosti od kojih su tek malobrojne u ovom radu iskorištene. Za izradu<br />

poslužiteljske aplikacije bilo je potrebno <strong>na</strong>učiti raditi sa SIP servletima i aplikacijskim<br />

poslužiteljom SailFinom <strong>na</strong> kojem se izvode servleti. Na primjeru komunikacije s ILS-om<br />

dobive<strong>na</strong> je ideja kako izgleda komunikacija u realnoj mreži sa sustavima <strong>za</strong> pozicioniranje.<br />

Usluga LocationInfo kreira<strong>na</strong> kao praktični dio rada <strong>na</strong> semi<strong>na</strong>ru je samo demonstracija<br />

<strong>na</strong>učenih tehnologija, te se takvom mora i prihvatiti. S obzirom <strong>na</strong> tu činjenicu i <strong>na</strong> očekivani<br />

opseg rada nije se išlo u rješavanje nekih problema koji bi se kod izrade realne usluge morali<br />

riješiti, poput npr. registracije i autori<strong>za</strong>cije korisnika <strong>na</strong> poslužiteljskoj strani.<br />

Usprkos vrlo ograničenoj uporabi korištenih tehnologija i alata, steče<strong>na</strong> su temelj<strong>na</strong> z<strong>na</strong>nja<br />

koja čine preduvjet <strong>za</strong> puno iskorištavanje potencijala tehnologija <strong>za</strong> izradu <strong>usluga</strong> i aplikacija<br />

u novijim telekomunikacijskim mrežama.<br />

24


Literatura<br />

[1] RFC 3261 - SIP: Session Initiation Protocol, [http://tools.ietf.org/html/rfc3261,<br />

28.3.2009.]<br />

[2] IP Multimedia Subsystem, [http://www.3gpp.org/ftp/Specs/html-info/23228.htm,<br />

28.3.2009.]<br />

[3] JSR 116: SIP Servlet API Version 1.0, [http://jcp.org/en/jsr/detail?id=116,<br />

28.3.2009.]<br />

[4] SailFin: SIP Servlet Container, [https://sailfin.dev.java.net/, 28.3.2009.]<br />

[5] JSR 30: J2ME TM Connected, Limited Device Configuration, Java Community<br />

Process, 2000, [http://jcp.org/en/jsr/detail?id=30, 28.3.2009.]<br />

[6] JSR 36: Connected Device Configuration, Java Community Process 2005,<br />

[http://jcp.org/en/jsr/detail?id=36, 28.3.2009.]<br />

[7] JSR 139: Connected Limited Device Configuration 1.1, Java Community Process<br />

2007, [http://jcp.org/en/jsr/detail?id=139, 28.3.2009.]<br />

[8] JSR 118: Mobile Information Device Profile 2.0, Java Community Process, 2006,<br />

[http://jcp.org/en/jsr/detail?id=118, 28.3.2009.]<br />

[9] JSR 154: Java Servlet 2.4 Specification, [http://jcp.org/en/jsr/detail?id=154,<br />

28.3.2009.]<br />

[10] GlassFish – Open Source Application Server, [https://glassfish.dev.java.net,<br />

28.3.2009.]<br />

[11] Common Development and Distribution License, [http://www.sun.com/cddl/,<br />

28.3.2009.]<br />

[12] GNU General Public License, [http://www.gnu.org/licenses/licenses.html#GPL,<br />

28.3.2009.]<br />

[13] Apache Tomcat, [http://tomcat.apache.org/, 28.3.2009.]<br />

[14] Oracle TopLink, [http://www.oracle.com/technology/products/ias/toplink/index.html,<br />

28.3.2009.]<br />

[15] JSR 289: SIP Servlet v1.1, [http://jcp.org/en/jsr/detail?id=289, 28.3.2009.]<br />

25


Dodatak A: Instalacija programske podrške<br />

Da bi se rad isprobao potrebno je slijediti sljedeće korake:<br />

1) Stranice SailFin projekta skinut <strong>na</strong>jnoviju verziju softvera (recimo da se radi o<br />

SailFin 1.0, a skinuta datoteka da se zove sailfin-installer-v1-b60g-windows.jar).<br />

Nakon toga se treba preko konzole (start->run pa upisati cmd i stisnuti ok)<br />

pozicionirati u direktorij gdje se <strong>na</strong>lazi datoteka te upisati sljedeću <strong>na</strong>redbu:<br />

java -Xmx256m -jar sailfin-installer-v1-b60g-windows.jar<br />

2) Nakon toga se otvara prozor u kojem je potrebno povući desni slider do kraja te<br />

oz<strong>na</strong>čiti E<strong>na</strong>ble autoupdate i stisnuti gumb Accept što će rezultirati otpakiravanjem<br />

sadržaja JAR datoteke u direktorij SailFin.<br />

3) Treba se pozicionirati u direktorij SailFin te upisati sljedeću <strong>na</strong>redbu da bi se SailFin<br />

instalirao <strong>na</strong> raču<strong>na</strong>lo:<br />

lib\ant\bin\ant -f setup.xml<br />

4) Sljedeće je potrebno integrirati SailFin u NetBeans razvojnu okolinu. To se radi tako<br />

što se pod oz<strong>na</strong>kom services klikne desnom tipkom miša <strong>na</strong> Servers i tamo i<strong>za</strong>bere<br />

Add server. Na popisu je potrebno i<strong>za</strong>brati SailFin te u sljedećem koraku odabrati<br />

direktorij u kojem je SailFin smješten pod Platform Location. Također, oz<strong>na</strong>čite<br />

Register Local Default Domain. Na sljedećem ekranu je još samo potrebno upisati<br />

lozinku (npr. admi<strong>na</strong>dmin) i stisnuti gumb Finish čime je integracija gotova.<br />

5) Za razvoj SIP servlet aplikacija postoji plug-in <strong>za</strong> NetBeans. Instalira se tako da se<br />

ode <strong>na</strong> Tools->Plugins i <strong>na</strong>đe <strong>na</strong> popisu dostupnih pluginova SIP Projects, oz<strong>na</strong>či i<br />

klike install.<br />

6) Sada je potrebno pokrenuti poslužiteljsku aplikaciju <strong>na</strong> SailFinu. Treba otići <strong>na</strong> File-<br />

>Open project te i<strong>za</strong>brati direktorij LocationApp koji dolazi s ovim radom te<br />

desnim klikom <strong>na</strong> projekt i<strong>za</strong>brati opciju run. Time će se aplikacija prenesti <strong>na</strong><br />

SailFin i automatski pokrenuti.<br />

7) Pod service->Servers kliknuti desnim klikom <strong>na</strong> SailFin te i<strong>za</strong>brati View Admin<br />

Console <strong>na</strong>kon čega se u browseru otvara sučelje <strong>za</strong> upravljanje SailFinom. Treba<br />

26


podesiti portove <strong>na</strong> kojima osluškuje SIP promet tako da se ode <strong>na</strong> Configuration-<br />

>SIP Container i postavi SIP port <strong>na</strong> 6080 (može i neki drugi, no onda se mora i<br />

svugdje tako postaviti). Nakon toga treba postaviti isti port i pod Sip Service-> SIP<br />

Listeners -> sip-listener-1. Za lakše s<strong>na</strong>laženje može poslužiti Slika A.<br />

Slika A Postavljanje SIP porta preko administratorskog sučelja<br />

8) Nakon što je SailFin podešen potrebno je instalirati i podesiti IMS Location Server.<br />

Instalacijsku datoteku koja dolazi uz rad potrebno je pokrenuti i slijediti korake dok<br />

instalacija nije <strong>za</strong>vrše<strong>na</strong>. Nakon toga je i ILS-u potrebno promjeniti port <strong>na</strong> kojem<br />

osluškuje promet. Pozicionirajte se u direktorij /Ericsson Nikola Tesla/IMS Location<br />

Server/res gdje ste instalirati ILS te otvorite u uređivaču teksta datoteku<br />

configuration.properties. U njoj trebate <strong>na</strong>ći javax.sip.PORT i postaviti ga <strong>na</strong> 6090.<br />

ILS se pokreće dvoklikom <strong>na</strong> runLS.bat.<br />

9) Zadnji korak je pokretanje klijentske aplikacije dvoklikom <strong>na</strong> LocationMIDlet.jad<br />

datoteku koja dolazi s radom.<br />

27

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!