NGN

Autori:
Bc. Igor Kvasnička,
Bc. Daniel Ščepka


Študijný program: PKSS
Predmet: NGN siete, služby a protokoly
Akademický rok: 2011/12
download

1. Špecifikácia

Cieľom aplikácie je upozorňovať používateľa na ním vopred definované televízne relácie. Systém upozorňovania bude založený na použití sietí novej generácie (NGN). To znamená, že využijeme komunikáciu pomocou signalizačného protokolu SIP (Session Initiation Protocol) a transportného protokolu RTP (Real-time Transport Protocol). Ako architektúra siete bude použitý IMS – IP Multimedia Subsystem (IP Multimedia Core Network Subsystem). Konkrétne využijeme open source projekt spoločnosti Fraunhofer Fokus nazvaný OpenIMS Core. Ide o navrhnutý systém simulujúci systém multimediálnych služieb pre internetový protokol IP. Tento softvérový systém použijeme na výmenu SIP správ, registráciu užívateľov, na zriadenie, správu a ukončenie multimediálnych relácií.

Aplikácia sa bude skladať z dvoch častí – webovej a standalone aplikácie. Webová aplikácia bude predstavovať televízny program. Používateľ bude mať možnosť vybrať si, na ktoré televízne relácie chce byť upozornený. Zároveň sa tu bude nachádzať prehľadný zoznam upozornení, na ktoré chce byť používateľ notifikovaný. Okrem toho sa v aplikácií bude nachádzať história upozornení používateľa.

Nevyhnutnou súčasťou systému bude autentifikačný systém. Používateľ bude mať možnosť prihlásiť sa do systému. Autentifikácia bude vykonávaná voči databáze IMS subsystému, teda databáze účastníkov domácej siete (HSS).

2. Posielanie SIP z PHP

V tejto časti sa nachádzajú projekty a existujúce riešenia, ktoré využívajú posielanie SIP správ z PHP, čo bolo aj naším pôvodným zámerom.

2.1. Click to Call

Click to Call je projekt anglickej spoločnosti Level 7 Systems Ltd., ktorá dodáva zákazníkom komunikačného služby založené na protokole SIP. Ide o jeden z veľmi mála pokus o implementáciu protokolu SIP do programovacieho jazyka PHP. Účelom tohto projektu bolo vytvoriť webovú aplikáciu, vďaka ktorej sa bude dať zavolať pomocou definovanej SIP adresy na definovaný SIP účet. V podstate by sa dalo povedať, že ide o akýsi softphone, čiže softvérový telefón, ale s obmedzenou funkčnosťou. Limitujúce faktory tejto aplikácie sú obmedzené možnosti použitia, keďže umožňujú iba základné zriadenie hovoru. To znamená, že tu absentuje akýkoľvek manažment hovoru.

Dalo by sa povedať, že ide o takpovediac nepoužiteľnú aplikáciu, avšak hlavnou podstatou projektu je akési jadro, ktoré umožňuje prepojenie PHP a protokolu SIP. Tým sa nám ponúkajú nové možnosti, ktoré si môžeme ďalej došpecifikovať. Projekt tvorí jedna základná trieda, ktorá v sebe nesie celé jadro mechanizmu. Sú tu definované základné konštruktory a metódy, ktoré si môže používateľ sám volať na základe vlastnej potreby. Okrem nej sa tu nachádza súbor, kde si môžeme špecifikovať rôzne výnimky. Posledný súbor je závislý priamo na používateľovi, akú funkcionalitu si zadefinuje.

Podľa dokumentácie by sme mali byť teoreticky schopný vytvoriť akúkoľvek SIP správu a vedieť ju odoslať. Dokumentácia projektu je však veľmi slabá a na projekte je jasne vidieť, že ide skôr o akýsi experiment, než hotovú aplikáciu.

Vzhľad webovej aplikácie
Obrázok 1 Vzhľad webovej aplikácie

Príklad, ktorý je uvedený na stránke projektu demonštruje vytvorenie spojenia medzi dvoma registrovanými SIP používateľmi. Na jednej strane je webová aplikácia Click to Call a na druhej je reálny používateľ prihlásený pomocou nejakého SIP klienta. Prvý používateľ pracuje, obrazne povedané, ako akýsi jednosmerný back-to-back user agent. To znamená, že používateľ si vo webovej aplikácií zadá SIP adresu odosielateľa (čiže svoju) a SIP adresu používateľa, ktorému chce zavolať. Po stlačení tlačidlo vytvorí webový server INVITE správu zabalenú do protokolu HTTP a tú pošle na SIP-ovú adresu príjemcu, ktorý definovanú v kolonke To: (viď Obrázok 1). Následne používateľ č.1 spracuje túto požiadavku a zároveň vytvorí novú správu INVITE, ktorú pošle používateľovi č.2. Tým inicializuje hovor. Tento proces je zobrazený na Obrázok 2.

Schéma zostavenia hovoru pomocou webovej aplikácie Click to Call
Obrázok 2 Schéma zostavenia hovoru pomocou webovej aplikácie Click to Call

Ako už bolo spomenuté, samotným účelom tohto projektu nebola webová aplikácia na telefonovanie, ale vytvorenie mechanizmu na posielanie a spracovanie SIP správ. To sa do istej miery aj podarilo. Ukážkový príklad zverejnený na stránke projektu je funkčný, čo sa podarilo overiť aj vlastnou implementáciou podľa sprievodného manuálu. Avšak projekt ešte nie je dokončený a obsahuje veľa chýb. Žiaľ, nepodarilo sa nám, pre potreby implementácie našej aplikácie na predmet NGN, sfunkčniť tento projekt v nami nakonfigurovanom IMS systéme.

2.2. Ostatné

Okrem projektu Click to Call boli analyzované ďalšie riešenia prepojenia PHP a protokolu SIP. Najďalej sa dostala jedna proprietárna aplikácia, ktorá využívala posielanie SIP správ z webovej aplikácie v jazyku PHP iba ako rozširujúci modul systému pre kontrolu pripojenia a konfigurovanie SIPových telefónov. Zdrojové kódy však neboli k dispozícii. Ďalšími analyzovanými aplikáciami boli implementácie pomocou technológie Flash, avšak pre tento spôsob spracovania SIP správ sme nenašli využitie v našej aplikácií.

3. Grafická časť

Grafická časť pozostáva z dvoch druhov aplikácií:

  • Webová aplikácia
  • Standalone aplikácia

2. 1. Webová aplikácia

Webová aplikácia tvorí rozhranie medzi systémom a používateľom. Slúži pre prihlasovanie sa do systému a prácu so systémom. Jadro tejto aplikácie je vytvorené v programovacom jazyku PHP na strane servera. Okrem tohto jazyka sa využívajú aj ďalšie ako značkovací jazyk HTML, jeho rozšírenie kaskádové štýly (CSS), skriptovací jazyk JavaScript a technológia Ajax, čo je vlastne technika vývoja interaktívnych webových aplikácií, ktoré umožňujú meniť obsah stránok bez potreby ich kompletného znovu načítania zo serveru. Ajax je použitý v spojení s DOM (Document Object Model) na zobrazenie dynamického obsahu a interakciu s prezentovanou informáciou.

Úlohou webovej aplikácie je umožniť používateľovi, ktorý je registrovaný v našom systéme a má registrovanú našu službu:

  • prihlásiť sa do systému,
  • pracovať so systémom.

Samotné prihlasovanie do systému je prepojené s IMS. To znamená, že na autentifikáciu používateľa sa používa databázový systém Home Subscriber Service (HSS) systému IMS.

Okrem databázového systému HSS naša webová aplikácia používa ďalší systém na správu relačných databáz MySQL. Ide o databázový systém relačného typu DBMS, s ktorým pracujú obe používateľské aplikácie. Do tohto databázového systému si ukladáme hlavne informácie o televíznych reláciách a upozorneniach na ne. Tieto upozornenia si vytvárajú používatelia sami.

Upozornenia sú potom zobrazené pomocou výpisu v rohu obrazovky. Tento výpis obsahuje základné informácie o relácií a čase jej vysielania. Pre zobrazovanie tejto upozorňovacej správy je využitá knižnica jQuery. Je to cross-browser javascriptová knižnica, ktorá kladie dôraz na interakciu medzi JavaScriptom a jazykom HTML. Táto knižnica je následne rozšírená o plugin SlideNote, ktorý špecifikuje, rozširuje a využíva funkcie knižnice jQuery. Pomocou tohto rozšírenia sme získali efektný nástroj pre zobrazovanie upozornení.

Pôvodný návrh aplikácie predpokladal, že tieto notifikácie budú posielané do databázy pomocou protokolu SIP. Fungovalo by to spôsobom, že webová aplikácia by poslala správu na aplikačný server, ktorý by ju spracoval a následne by vykonal jej obsah. Na implementáciu tohto riešenia sme predpokladali použiť mechanizmus opísaný v kapitole Click to Call. Avšak kvôli zisteným problémom sme museli zmeniť tento zámer, a teda dáta sa posielajú z webovej aplikácie priamo do databázy.

Zobrazenie upozornenia vo webovej aplikácií
Obrázok 3 Zobrazenie upozornenia vo webovej aplikácií

4. Negrafická časť (back-end)

Úlohou negrafickej časti servera je sledovať, či nemá začať nejaký film, na ktorý je požiadavka na upozornenie. Následne je treba používateľa na tento film upozorniť a zapísať toto upozornenie do histórie upozornení. Upozornenie sa uskutočňuje dvomi spôsobmi – SIP správu typu MESSAGE a inicializovaním audio hovoru.

Kontrola na uskutočnenie upozornenia na film si vyžaduje prístup do databázy – preto počas implementácie treba nájsť kompromis, aby sa do databázy nevykonávalo príliš veľa SQL dopytov, ktoré by mohli potenciálne znížiť výkonnosť servera.

Celá implementácia tejto časti servera kladie dôraz na jednoduchú rozšíriteľnosť funkcionality a dostatočnú výkonnosť vykonávaných operácii.

3. 1. Spracovávanie televíznych programov

Implementovaná aplikácia spracováva televízne programy českej verejnoprávnej televízie, ktorá poskytuje tieto dáta v programátorsky prijateľnej forme – vo formáte XML. Získanie týchto XML dát je realizované REST dopytom na adresu (t.j. používa sa HTTP protokol):

http://www.ceskatelevize.cz/services/programme/xml/schedule.php?user=test&date=<DATUM>&channel=<TV_KANAL>

kde:

  • <DATUM> je dátum vo formáte dd.mm.rrrr
  • <TV_KANAL> je jeden z reťazcov: ct1, ct2, ct4, ct24

Takto vytvoreným dopytom získame XML definujúce TV program pre konkrétny deň a TV kanál. Získané dáta sa následne spracujú z formátu XML (viac o tomto procese v kapitole Spracovávanie dát vo formáte XML) a vložia sa do databázy.

Získavanie nových dát o televíznych programoch sa vykonáva každý deň o polnoci, kedy sa získajú dáta pre ďalší deň.

3. 2. Spracovávanie dát vo formáte XML

Java poskytuje viaceré možnosti, ako spracovávať dáta vo formáte XML: DOM parser, SAX parser a pod. V implementovanej aplikácii je na tento účel použitá technológia Java Architecture for XML Binding (JAXB). Pomocou tejto technológie je možné mapovať XML dáta na Java objekty. Jej výhodou oproti ostatným možnostiam spracovávania XML dát je jednoduchosť jej použitia a ľahké prispôsobenie sa prípadným zmenám vo formáte XML dát.

Na použitie JAXB je potrebné (resp. veľmi užitočné) mať k dispozícií XSD schému popisujúcu dané XML dáta. Keďže česká televízia XSD schému neposkytuje, bolo potrebné najprv na základe rôznych XML dát vygenerovať XSD schému – na túto prácu bol použitý program Oxygen XML Editor v jeho „trial” verzií.

Ďalším krokom použitia JAXB je vygenerovanie Java tried, do ktorých budú „vkladané” dáta zo spracovávaných XML dát. Na tento účel slúži program štandardne distribuovaný spolu s Java Development Kit (JDK), ktorý má označenie: Java(TM) Architecture for XML Binding Binding Compiler. Spúšťa sa príkazom xjc a jeho vstupom je XSD schéma, pričom výstupom tohto programu je súbor Java tried popisujúcich dané XSD.

V tomto finálnom kroku práce s JAXB je už možné použiť JAXB z Java kódu spustením príkazu (pozn. proces transformácie XML dát do Java objektov sa angl. nazýva unmarshalling):

JAXBContext jc = JAXBContext.newInstance(Program.class);
//vytvorenie objektu na unmarshalling
Unmarshaller u = jc.createUnmarshaller();
Program element = (Program) u.unmarshal(new StringReader(xml));

pričom:

  • trieda Program je root elementom v spracovávanom XML,
  • atribúte xml je String obsahujúci spracovávané XML dáta (riadok č. 4).

Výsledkom tohto procesu je objekt Program (a na neho nadväzujúce objekty) s vyplnenými atribútmi podľa daného XML reťazca.

3. 3. Manipulácia so SIP a RTP

Implementovaná aplikácia na strane servera dokáže posielať SIP správy typu MESSAGE a vytvárať audio hovory. V oboch prípadoch sa jedná o asynchrónne generované SIP správy, tzn. nie sú to odpovede na SIP správy od klienta, ale vždy server inicializuje SIP komunikáciu. Z tohto dôvodu je potrebné, aby server mal informáciu o:

  • aktuálne prihlásených používateľoch (aby vedel, komu posielať správy),
  • ich verejných SIP adresách (aby vedel „kam” posielať správy).

Posielanie správ typu MESSAGE funguje na základe jednoduchého princípu jednorazového poslania tejto správy.

Nadviazanie audio rozhovoru pozostáva z viacerých častí:

  1. poslanie správy typu INVITE klientovi – týmto začne proces „vyzváňania telefónu” na strane klienta,
  2. zodvihnutie telefónu reprezentuje SIP správa 200 OK, na ktorú server odpovedá správou ACK, ktorá znamená začiatok posielania RTP streamu,
  3. v prípade, že používateľ (klient) zamietne prichádzajúci hovor, server dostane SIP správu CANCEL,
  4. ukončenie hovoru môže vykonať len klient, pričom server je o tejto akcii informovaný správou BYE – v tomto momente musí server prestať posielať RTP stream a ako odpoveď posiela klientovi správu 200 OK.

SIP správa typu INVITE (inicializácia hovoru zo strany servera) má ako telo správy SDP protokol, v ktorom sa vyskytujú nasledovné prvky:

v=0
c=IN IP4 192.168.0.2
t=0 0
m=audio 53968 RTP/AVP 8 18 0 101

Pričom, podľa RFC 4566:

  • „v” – reprezentuje verziu SDP a má mať hodnotu 0,
  • „c” – definuje typ a definície spojenia – dôležitá je najmä IP adresa servera,
  • „t” – určuje dĺžku trvania – začiatok a koniec – spojenia (tzv. „session”), ak sú obe hodnoty nastavené na 0, jedná sa o trvalé spojenie,
  • „m” – definuje typ prenášaných médií – v našom prípade sa jedná o audio dáta typu RTP; dôležité je tiež definovanie RTP portu, na ktorom bude počúvať klient – v našom prípade je to port 53968.

Posielanie RTP dát je realizované s využitím programu VLC od spoločnosti VideoLAN a jeho wrapperom v jazyku Java – vlcj.

3. 4. Manipulácia s databázou

Na prácu s databázou bola použitá knižnica Hibernate, ktorá je implementáciou Java štandardu: Java Persistance API. Tento štandard definuje objektovo-relačné mapovanie (angl. Object relational mapping), t.j. umožňuje manipulovať s databázovými tabuľkami akoby to boli Java objekty. Napr. tabuľka USERS je reprezentovaná triedou Users, ktorá má rovnaké atribúty, ako má tabuľka stĺpce. Samotné mapovanie stĺpcov na atribúty tried a aj mapovanie samotných tried na tabuľky je možné pomocou konfiguračných XML súborov alebo pomocou Java anotácii (od verzie JPA 2).

Následne je možné vykonávať nie SQL príkazy nad databázou, ale JPQL (Java Persistence Query Language) príkazy nad Java objektmi, napríklad prihlásenie používateľa do systému:

public boolean loginUser(String meno){
         Session session = hibernateTemplate.getSessionFactory().openSession();
         //vytvorenie JPQL príkazu
         Query q = session.createQuery("SELECT u FROM UserEntity u WHERE u.meno = :m");
         //definovanie parametru “m”, ktorý bol použitý v JPQL príkaze
         q.setParameter("m", meno.toLowerCase());
         //vykonanie JPQL príkazu a zistenie, či sa vrátil nenulový výsledok
         return !q.list().isEmpty();
}

JPA dokáže pracovať s cudzími kľúčmi v databázových tabuľkách, ktorá sa prejavujú ako vzťahy objektov One-To-One (jeden objekt má referenciu na iný), One-To-Many (jeden objekt má referenciu na zoznam iných objektov) a Many-To-One (viac objektov má referenciu na jeden objekt).

Použitá implementácia štandardu JPA – Hibertane – poskytuje automatickú správu transakcií (napr. viac vložení do databázy je vykonané ako jedno atomické vloženie do databázy), databázovú cache a pod.

3. 5. Časovanie udalostí

Implementovaná aplikácia pozostáva z viacerých opakujúcich sa udalostí:

  • vždy o polnoci sa spustí proces získavania nového televízneho programu,
  • každých 10 minút sa kontroluje, či nemá server spracovávať nejaké upozornenia.

Na časovanie týchto udalostí je použitá knižnica Quartz, ktorej použitie prináša napríklad tieto výhody:

  • Quartz používa thread-pool – t.j. nižšie nároky na výpočtový výkon a pamäť servera,
  • možnosti vytvorenia pokročilých podmienok časovania pomocou CRON výrazov (napr. je možné nastaviť, aby sa časovač prebúdzal každý deň o polnoci s výnimkou soboty a nedele; prípadne aby sa zobúdzal každých 10 minút, ale len v čase od 7:00 do 22:00).

Každých 10 minút sa zobudí Quartz časovač a na základe databázového dopytu zistí, ktoré upozornenia na filmy nastanú počas nasledujúcich 10 minút (kým sa opäť neprebudí). Pre všetky nájdené upozornenia vytvorí a nadefinuje štandardný objekt java.util.Timer je použitý na vytvorenie časovačov pre konkrétne upozornenia na filmy. Vďaka tomuto riešeniu nie je server neustále zaťažený veľkým počtom vlákien (1 časovač = 1 vlákno), ale nové vlákna sa vytvárajú len bezprostredne pred tým, ako má nastať upozornenie na film.

3. 6. Spring

Na zjednodušenie vývoja bol použitý framework Spring, ktorý poskytuje nasledovné výhody:

  • „Inversion of Control Container” a „Dependency Injection” – automatické vytváranie nových objektov podľa potreby aplikácie a ich „prepájanie medzi sebou”,
  • umožňuje meniť konfiguráciu aplikácie bez potreby rekompilácie (stačí zmeniť konfiguračný XML súbor tzv. „application context”),
  • zjednodušuje prácu s ďalšími Java technológiami napr. JMS, JavaMail, JDBC, RMI a pod.

3. 7. Dátový model

Dátový model
Obrázok 4 Dátový model

5. Konfigurácia Sailfin servera

Implementovaná aplikácia využíva možnosti aplikačného servera Glassfish 2 (Sailfin je aplikačný server Glassfish 2 s pridanou podporou pre SIP):

  • connection pool – na urýchlenie prístupu do databázy je použitý connection pool s hodnotou 10 (tento connection pool je potom potrebné definovať v Spring konfigurácii v časti Hibernate),
  • na prácu s databázou sa používa knižnica Hibernate vo verzií 3.5.3, ktorá je implementáciu Java štandardu Java Persistance API 2 (ďalej len JPA2). Použitím JPA2 dochádza k problému, lebo Glassfish 2 je kompatibilný len s JPA verzie 1. Riešením bolo vloženie (verejne dostupnej) knižnice hibernate-jpa-2.0-api-1.0.0.Final.jar do adresára /domains/domain1/lib/endorsed,
  • Glassfish primárne nepodporuje jazyk PHP, ktorý je v našej aplikácii použitý na grafický front-end. Riešením je použitie knižnice Caucho Quercus, ktorá PHP kód interpretuje do Java kódu, ktorý je Glassfish schopný spracovať. Týmto spôsobom bola do Java aplikačného servera Glassfish (resp. v našom prípade Sailfin) vložená podpora pre PHP.

6. Konfigurácia Trigger Pointu v HSS

Trigger Point
Obrázok 5 Nastavenie Trigger Pointu v HSS

7. Problémy pri implementácii

Pri implementácii našej aplikácie sme mali nasledovné problémy:

  • pri inicializácii audio rozhovoru bolo potrebné definovať RTP port, na ktorom bude klient počúvať, čiže bolo treba v tele správy INVITE posielať SDP, ktoré bude toto definovať,
  • audio hovor má problémy s kódovaním audio dát, čo sa prejavuje veľmi zlou kvalitou zvuku,
  • naším pôvodným zámerom bolo použiť text-to-speech na realizáciu audio hovorov – túto funkcionalitu by sme dosiahli použitím knižnice využívajúcej Google Translator na konverziu textu do audio dát a následne Java Media Framework ako implementáciu RTP stacku; problém však nastal pri použití spomínanej Google knižnice, ktorá vyžaduje prístup na službu translate.google.com – v našom vývojovom prostredí však nemáme povolený prístup na Internet (problémy s IP adresami, DNS a pod.), preto sme sa rozhodli nepoužívať tento text-to-speech, ale namiesto toho prehrávať mp3 súbor prostredníctvom VLC programu. Pre potreby nášho školského projektu to považujeme za dostatočné,
  • pri implementácii projektu Click to Call sa vyskytol problém s prepojením na IMS. Aplikácia požadovala pripojenie na IP adresu servera, avšak z určitých dôvodov ju nedokázala kontaktovať napriek tomu, že táto IP adresa bola dosiahnuteľná programom Ping.
  • počas procesu testovania sa občas stávalo, že klient Monster prestal reagovať na prichádzajúce SIP správy typu MESSAGE. Zároveň klient Monster prestal v hornej lište zobrazovať informácie o prihlásenom, ako napríklad meno, jeho avatar a pod. Riešením bolo reštartovať klienta Moster niekoľkokrát (počet reštartov nie je pevne daný),
  • využitie Spring frameworku v kombinácii so Servletom (v našom prípade SipServlet) prináša problém, kedy Spring nemá vedomosť o prítomnosti tohto servletu (tejto triedy), lebo ju neinicializoval on, ale Java kontajner. Preto nie je možné použiť Dependenci Injection v Servlete, čo znepríjemňuje vývoj. Riešením bolo „manuálne” získanie referencií Springov bean-ov nasledovným spôsobom:

WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(ctx);
SipCommunicator sipCommunicator = context.getBean(SipCommunicator.class);

Pozn.: V prvom riadku dôjde k inicializácii Spring kontextu, t.j. inicializujú sa Spring bean-y (ak ešte neboli inicializované) a v nasledovnom riadku získam z tohto kontextu referenciu na objekt SipCommunicator.