RAZVOJ TELEFONSKE APLIKACIJE V ASTERISKU

Podobni dokumenti
Vaja 2 Virtualizacija fizičnih strežnikov in virtualni PC A. Strežnik Vmware ESX Namestitev strežnika VMware ESX 3.5 na fizični strežnik 2. Nas

NEVTRIN d.o.o. Podjetje za razvoj elektronike, Podgorje 42a, 1241 Kamnik, Slovenia Telefon: Faks.: in

(Microsoft Word - MSDN AA Navodila za \232tudente FS.doc)

Vaja 3 Kopiranje VM in namestitev aplikacij - strežnik SQL 2000 SP3a A. Lokalni strežnik Vmware ESX Dodajanje uporabnikov vajexx v skupino Vaje

Navodila za uporabo programske opreme OTRS verzija Administracijska navodila Avtor navodil: Sebastijan Šilec Datum: December 2007 Center odprte

Navodila za programsko opremo FeriX Namestitev na trdi disk Avtor navodil: Martin Terbuc Datum: December 2007 Center odprte kode Slovenije Spletna str

PowerPointova predstavitev

Microsoft Word - CN-BTU4 Quick Guide_SI

Document ID / Revision : 0519/1.3 ID Issuer System (sistem izdajatelja identifikacijskih oznak) Navodila za registracijo gospodarskih subjektov

Protokoli v računalniškem komuniciranju TCP, IP, nivojski model, paket informacij.

Navodila za uporabo Mini snemalnik

CD190/195 Slovenian Quick start guide

Zbornica zdravstvene in babiške nege Slovenije Zveza strokovnih društev medicinskih sester, babic in zdravstvenih tehnikov Slovenije Stanje:

NETGEAR R6100 WiFi Router Installation Guide

Modem in krajevno omrežje Uporabniški priročnik

RAM stroj Nataša Naglič 4. junij RAM RAM - random access machine Bralno pisalni, eno akumulatorski računalnik. Sestavljajo ga bralni in pisalni

Nameščanje Adopt Open Java Development Kit 8

UNI_Lubej_Marko_1984_

Naziv storitve Enota mere Tarifa Cena brez davka v EUR Cena z davkom v EUR Stopnja davka MOBILNI NAROČNIŠKI PAKETI IN STORITVE Cene veljajo od

Microsoft Word - CNR-MPV2 Quick Guide_SI

Nameščanje Adopt Open Java Development Kit 8

1 MMK - Spletne tehnologije Vaja 5: Spletni obrazci Vaja 5 : Spletni obrazci 1. Element form Spletni obrazci so namenjeni zbiranju uporabniških podatk

Navodila za nastavitev mail odjemalca na ios in Android napravah TELEFONI iphone (ios 12) Predlagamo, da do svoje študentske e-pošte dostopate s pomoč

Microsoft Word - M docx

Linksys PLEK500 User Guide

Strojna oprema

PowerPointova predstavitev

Microsoft Word - CNR-BTU3_Bluetooth_vmesnik

(Microsoft Word - U\350enje telegrafije po Kochovi metodi.doc)

PowerPointova predstavitev

Navodila za namestitev odjemalca ibsreport2 produkcijsko okolje (poročanje Banki Slovenije) Avgust 2017

Vaja04_Ver02

Kratka navodila za uporabo razširjevalnika dosega WiFi AC750 model EX3800

PowerPoint Presentation

Microsoft Word - Trust-CDsize-12052_12579_14070-al-cp_v5.0.doc

NETGEAR R6250 Smart WiFi Router Installation Guide

Hiter začetek Razširjevalnik dosega WiFi N300 Model EX2700

Sistemi Daljinskega Vodenja Vaja 3 Matej Kristan Laboratorij za Strojni Vid Fakulteta za elektrotehniko, Univerza v Ljubl

PowerPointova predstavitev

Chapter 1

Miluma Trader Miluma Trader navodila: V nadaljevanju sledijo osnovna navodila, kako začeli uporabljati Miluma Trader. 1. Preverite spletno stran Ta po

Upravljanje sistema COBISS Navodila za uporabo tiskalnika CITIZEN S310II V1.0 VIF-NA-27-SI

Diapozitiv 1

Darko Pevec 1.a Informatika

SLO NAVODILA ZA UPORABO IN MONTAŽO Kat. št.: NAVODILA ZA UPORABO Bluetooth slušalka Plantronics Explorer 10 Kataloška št.: 132

Microsoft PowerPoint - seminar_ pptx

NAVODILA ZA UPORABO K01-WIFI Hvala, ker ste se odločili za nakup našega izdelka. Pred uporabo enote skrbno preberite ta Navodila za uporabo in jih shr

Hiter začetek Razširjevalnik dosega WiFi N300 Model WN2000RPTv3

Microsoft Word - CNC obdelava kazalo vsebine.doc

Poročilo za 1. del seminarske naloge- igrica Kača Opis igrice Kača (Snake) je klasična igrica, pogosto prednaložena na malce starejših mobilnih telefo

TNUV Lab

TRGOVSKI PORTAL SPLETNA APLIKACIJA NAMENJENA TRGOVCEM POGOSTA VPRAŠANJA IN ODGOVORI Ljubljana, Verzija 1.0

DCS-2330L_A1_QIG_v1.00(EU).indd

innbox_f60_navodila.indd

Podatkovni model ER

Microsoft Word - M docx

Navodila za uporabo aplikacije mlist - neposredni mentorji za Zdravniško zbornico Slovenije pripravila Gooya, interaktivni mediji, d.o.o. Ljubljana, m

Universal WiFi Range Extender WN3000RP Installation Guide

SLO NAVODILA ZA UPORABO IN MONTAŽO Kat. št.: NAVODILA ZA UPORABO TP LINK dvopasovni gigabitni WLANusmerjevalnik N600 Kataloška

MATLAB programiranje MATLAB... programski jezik in programersko okolje Zakaj Matlab? tipičen proceduralni jezik enostaven za uporabo hitro učenje prir

Microsoft Word - eDenar - navodila za uporabo osebnega portala clana doc

SLO NAVODILA ZA UPORABO IN MONTAŽO Kat. št.: NAVODILA ZA UPORABO DVB T, DVB C TV ključek PCTV Systems Quatro Kataloška št.: 67

Priročnik za uporabnika SLO _09

PRIPOROČILA ZA OBLIKOVANJE KATALOGOV ZNANJA ZA MODULE V PROGRAMIH VIŠJEGA STROKOVNEGA IZOBRAŽEVANJA

PowerPointova predstavitev

PowerPointova predstavitev

Šolski center Celje Srednja šola za kemijo, elektrotehniko in računalništvo ELEKTRONSKA REDOVALNICA RAZISKOVALNA NALOGA AVTORJI Aleš Budna Jure Ulaga

TRGOVSKI PORTAL SPLETNA APLIKACIJA NAMENJENA TRGOVCEM NAVODILA ZA REGISTRACIJO IN PRIJAVO Ljubljana, Verzija 1.1,

TRGOVSKI PORTAL SPLETNA APLIKACIJA NAMENJENA TRGOVCEM NAVODILA ZA REGISTRACIJO IN PRIJAVO Ljubljana, Verzija 1.1

Sistemi Daljinskega Vodenja Vaja 1 Matej Kristan Laboratorij za Strojni Vid Fakulteta za elektrotehniko, Univerza v Ljubljani

Splošni pogoji poslovanja 1. Uvodna določba 1) Splošni pogoji poslovanja so pravni dogovor med končnim uporabnikom (fizična ali pravna oseba, v nadalj

Microsoft Word - NAVODILA ZA UPORABO.docx

Cenik storitev KRS Analogna televizija Mesečna naročnina za paket * Cena / mesec Osnovna zelena KTV naročnina 16,53 Osnovna zelena KTV naročnina-nekod

OBVESTILO O GRADNJI IN OBRATOVANJU JAVNEGA TELEKOMUNIKACIJSKEGA OMREŽJA

Diapozitiv 1

Microsoft Word - M docx

Cenik storitev KRS Analogna televizija Mesečna naročnina za paket * Cena / mesec Osnovna zelena KTV naročnina 16,53 Osnovna zelena KTV naročnina-nekod

ACAD-BAU-Analiza-prostorov

Microsoft Word - Splosni pogoji za uporabnike storitve_ONA_ doc

Microsoft Word - UP_Lekcija04_2014.docx

TNUV Lab5

Slajd 1

SLO NAVODILA ZA UPORABO IN MONTAŽO Kat. št.: NAVODILA ZA UPORABO WLAN usmerjevalnik TP LINK Archer C5 Kataloška št.:

Diapozitiv 1

Navodilo Telemach

Microsoft Word - Telefonska pomoc v dvigalih na navadnem PSTN-GSM telefonskem omrezju 4.2 sloveno.doc

Microsoft PowerPoint - p_TK_inzeniring_1_dan_v5_shortTS.ppt [Compatibility Mode]

PowerPoint Presentation

APS1

Navodilo za urejanje zavarovanj po šifri podlage za zavarovanje 033 prek portala e-vem Ljubljana, oktober 2015

Cenik ES_spremembe_marec2013_ČISTOPIS_Sprememba_

Delavnica Načrtovanje digitalnih vezij

NAVODILA ZA IZPOLNJEVANJE ELEKTRONSKEGA OBRAZCA ZA PRIJAVO IN PREKLIC DIGITALNIH POTRDIL Verzija Datum Opis sprememb dokumenta dokumenta

11/21/2017 SQL-ODBC Povezava do podatkovne baze modul pyodbc povezovalni niz (eksplicitno, ali z uporabo DSN) In [6]: import pyodbc from future import

NASLOV PREDAVANJA IME IN PRIIMEK PREDAVATELJA

Microsoft Word - Skype_clanek2 _2_.doc

Microsoft Word - ELEKTROTEHNIKA2_ junij 2013_pola1 in 2

Microsoft Word Navodila za povezavo naprave v oblak_SLO

Splošni pogoji uporabe 1188, in 1180 Nosilec storitev zagotavljanja univerzalne službe za dajanje informacij o naročnikih preko klicnih števi

Transkripcija:

Marko Matijaško RAZVOJ TELEFONSKE APLIKACIJE V ASTERISKU Diplomsko delo Maribor, junij 2009

i Diplomsko delo univerzitetnega študijskega programa RAZVOJ TELEFONSKE APLIKACIJE V ASTERISKU Študent: Študijski program: Mentorica: Marko Matijaško UN ŠP Telekomunikacije dr. Tatjana KAPUS, izred. prof. za področje elektronike in telekomunikacij Maribor, junij 2009

ii

iii ZAHVALA Zahvaljujem se mentorici dr. Tatjani Kapus za pomoč in vodenje pri opravljanju diplomskega dela. Posebna zahvala velja staršem, ki so mi omogočili študij in me vsa ta leta vzpodbujali ter mi stali ob strani.

iv RAZVOJ TELEFONSKE APLIKACIJE V ASTERISKU Ključne besede: IP-telefonija, programska naročniška centrala, podatkovna baza, konfiguriranje, klicni načrt UDK: 621.395:004.728.057.4(043.2) Povzetek V diplomskem delu opisujemo izdelavo telefonske aplikacije s pomočjo naročniške telefonske centrale IP Asterisk, ki članom Laboratorija za mikroračunalniške sisteme omogoča prijavo oziroma odjavo na telefonih v različnih prostorih. Prav tako lahko vodja laboratorija ob vsakem času preveri dosegljivost kateregakoli člana. Vsi člani so dosegljivi s strani drugih zaposlenih na Tehniških fakultetah in lahko jih tudi sami kličejo. Za testiranje delovanja aplikacije potrebujemo ustrezne telefone oziroma programske telefone. Vzeli smo, da je uporabljen signalizacijski protokol SIP in da so telefoni povezani v omrežje IP. Delo najprej opisuje namestitev telefonske centrale kakor tudi podatkovne baze. Nato se osredotočimo na konfiguriranje terminalov, podatkovne baze in pisanje Asteriskovih konfiguracijskih datotek. Težave, ki smo jih ob tem imeli, in njihove možne rešitve opišemo na koncu dela.

v DEVELOPMENT OF A TELEPHONY APPLICATION IN ASTERISK Key words: IP telephony, software private branch exchange, database, configuration, dial plan UDK: 621.395:004.728.057.4(043.2) Abstract In this diploma thesis, we describe the development of a telephony application with the help of IP private branch exchange Asterisk, which allows members of the Microcomputer systems laboratory to log in or log out on the telephones in different rooms. The head of the laboratory can at any time verify availability of any member. All the members are reachable to other employees of the Technical faculties, which they can also call. To test the application we need phones or software phones. We assumed the use of signaling protocol SIP and that the phones are connected to an IP network. The thesis first describes the installation of the telephone exchange as well as the database. We then focus on the configuration of terminals, the database and writing of Asterisk configuration files. The problems we encountered in this work and their possible solutions are described at the end of this thesis.

vi VSEBINA 1 UVOD... 1 2 TELEFONSKA CENTRALA ASTERISK... 3 2.1 KAJ JE ASTERISK... 3 2.2 SESTAVA... 3 2.3 MOŽNOSTI... 4 2.4 KLICNE MOŽNOSTI... 5 2.5 PODPORA KODEKOV... 5 2.6 KANAL SIP... 6 2.7 KLICNI NAČRT... 7 2.8 KONTEKSTI... 7 2.9 RAZŠIRITVE... 8 2.10 PRIORITETE... 8 2.11 APLIKACIJE... 9 2.12 MAKRI... 10 2.13 UJEMANJE VZORCEV... 10 3 NAMESTITEV ORODIJ... 11 3.1 NAMESTITEV ASTERISKA... 11 3.2 NAMESTITEV PODATKOVNE BAZE POSTGRESQL... 12 3.3 NAMESTITEV IN KONFIGURIRANJE ODBC... 13 4 KONFIGURIRANJE APLIKACIJE... 17 4.1 OPIS APLIKACIJE... 17 4.2 POTEK DELA... 19 4.3 KONFIGURIRANJE TERMINALA... 19 4.4 POTEK NAMESTITVE PROGRAMSKEGA TELEFONA X-LITE... 21 4.5 KONFIGURIRANJE PODATKOVNE BAZE... 23 4.6 SNOVANJE KLICNEGA NAČRTA... 24 4.7 SNEMANJE ZVOČNIH POSNETKOV... 38 5 PRIMERI DELOVANJA APLIKACIJE... 40

vii 5.1 PRIJAVA/ODJAVA ČLANA... 40 5.2 PRIMERI KLICEV... 45 6 TEŽAVE PRI KONFIGURIRANJU APLIKACIJE... 52 6.1 APLIKACIJA SIPADDHEADER... 52 6.2 RAZLOČEVALNO ZVONJENJE... 53 6.3 REŠITEV... 54 7 SKLEP... 57 VIRI... 58 PRILOGE... 59

viii KAZALO SLIK Slika 4.1 Slika 4.2 Slika 4.3 Slika 4.4 Slika 4.5 Slika 4.6 Slika 5.1 Slika 5.2 Slika 5.3 Slika 5.4 Slika 5.5 Slika 5.6 Slika 5.7 Slika 5.8 Slika 5.9 Slika 5.10 Slika 5.11 Slika 5.12 Slika 5.13 Slika 5.14 Slika 5.15 Slika 6.1 Primer definiranja terminala v sip.conf...20 Programski telefon X-lite...21 Konfiguriranje uporabnika...22 Pravilno konfiguriran programski telefon...22 Grafična podoba podatkovne baze...24 Prijavljeni člani LMS...28 Uspešna prijava...40 Vnos neobstoječe prijavne številke...41 Vnos napačne PIN-kode...42 Vnos števila 1 za ohranitev prijave...43 Vnos števila 2 za odjavo...44 Odjava/prijava...45 Član klicatelj ni prijavljen...46 Klicani član ni prijavljen...46 Klic med članoma LMS...47 Klic člana s strani drugih zaposlenih na FERI...48 Član ni prijavljen na svojem terminalu...49 Klic vodje laboratorija s strani drugih zaposlenih na FERI...49 Zunanji klic...50 Klic člana do zaposlenega na FERI...50 Član kliče zaposlenega na drugi TF...51 Konfiguriranje terminala za razločevalno zvonjenje...53

ix UPORABLJENE KRATICE BRI B2BUA DTMF FERI Basic Rate Interface, osnovni vmesnik Back-To-Back User Agent, uporabniški agent od strani do strani Dual Tone Multi-Frequency, dvotonska večfrekvenčna signalizacija Fakulteta za elektrotehniko, računalništvo in informatiko GSM Global System for Mobile communications, globalni sistem za mobilne komunikacije HTTP IAX IP ISDN LMS MGCP ODBC PIN PRI PSTN RTP SIP TF URL HyperText Transfer Protocol, protokol za prenos hiperteksta Inter-Asterisk exchange, izmenjava med Asteriski Internet Protocol, medmrežni protokol Integrated Services Digital Network, digitalno omrežje z integriranimi storitvami Laboratorij za mikroračunalniške sisteme Media Gateway Control Protocol, protokol za krmiljenje medijskih prehodov Open DataBase Connectivity, odprto povezovanje podatkovnih baz Personal Identification Number, osebna identifikacijska številka Primary Rate Interface, primarni vmesnik Public Switched Telephone Network, javno komutirano telefonsko omrežje Real-time Transport Protocol, protokol za prenos v realnem času Session Initiation Protocol, protokol za zagon seje Tehniške fakultete Uniform Resource Locator, enolični lokalizator vira

Razvoj telefonske aplikacije v Asterisku Stran 1 1. UVOD Dogajanje na področju telekomunikacij dandanes vstopa v ospredje in je predmet izrazitih sprememb, ki zadevajo tako operaterje, kot tudi končne uporabnike. Nekdaj izrazito tehnološko naravnano razmišljanje je danes v prvi vrsti usmerjeno k uporabniku, storitvam in vsebinam. Priprava ponudbe je v prvi vrsti osredotočena na uporabnika. V današnjih časih zaznavamo razcvet internetne komunikacije. To je predvsem posledica vse večjega razvoja internetnih ter posledično telefonskih storitev, kakor tudi vse večjih potreb in zahtev posameznih uporabnikov in podjetij. Tako je v zadnjih letih zelo napredovalo področje, ki ga najbolje poznamo pod imenom IPtelefonija. Le-ta pomeni telefonske storitve, izvajane preko interneta oziroma paketnega omrežja s protokolom IP ("Internet Protocol" medmrežni protokol) in ne preko javnega telefonskega omrežja. Uveljavljati se je začela predvsem zaradi znižanja stroškov uporabnika, kasneje tudi zaradi mnogo dodatnih brezplačnih storitev, kot so prikaz identitete kličočega, posredovanje klica, glasovna pošta in mnoge druge. Velika prednost uporabe protokola IP je tudi, da omogoča učinkovito konvergenco klasičnega telefonskega in podatkovnega omrežja, ki omogoča preusmeritev telefonskega prometa na podatkovno omrežje IP. Obstoječe analogno in digitalno telefonsko omrežje in naprave je možno preko ustreznih vmesnikov povezati na obstoječe podatkovno omrežje IP. V ta namen je bila leta 1999 s strani Marka Spencerja iz podjetja Digium razvita odprtokodna programska oprema za telefonsko naročniško centralo, imenovana Asterisk. Asterisk je vodilni svetovni motor in orodje odprtokodne telefonije. Ker ga je možno popolnoma brezplačno naložiti s svetovnega spleta, je bil Asterisk idealna platforma za namen tega diplomskega dela. Tako je cilj tega diplomskega dela s pomočjo takšne centrale izdelati aplikacijo, ki bo članom Laboratorija za mikroračunalniške sisteme omogočala prijavo oziroma odjavo na telefonih v različnih prostorih. Prav tako naj bi lahko vodja laboratorija ob vsakem času preveril dosegljivost kateregakoli člana. Vsi člani naj bi bili dosegljivi s strani drugih zaposlenih na Tehniških fakultetah in naj bi jih lahko tudi sami klicali. Za testiranje

Razvoj telefonske aplikacije v Asterisku Stran 2 delovanja aplikacije bomo potrebovali ustrezne telefone oziroma programske telefone. Vzeli bomo, da je uporabljen signalizacijski protokol SIP ("Session Initiation Protocol" protokol za zagon seje) in da so telefoni povezani v omrežje IP. Diplomsko delo je razdeljeno na sedem poglavij. Uvod, ki predstavlja prvo poglavje, vsebuje splošen opis IP-telefonije. V drugem poglavju predstavimo telefonsko naročniško centralo Asterisk. Na kratko se seznanimo z njenimi lastnostmi in možnostmi. Med najpomembnejše sestavne dele Asteriska vsekakor sodi klicni načrt. Tega obravnavamo nekoliko natančneje. Tretje poglavje je posvečeno namestitvi potrebnih orodij za izvedbo glavnega dela diplomske naloge. Tako opišemo postopke za namestitev programske opreme Asteriska in podatkovne baze. Prav tako so podana navodila za namestitev in konfiguriranje konektorja ODBC ("Open Database Connectivity" odprto povezovanje podatkovnih baz). Glavni del predstavlja četrto poglavje. Začeli smo s konfiguriranjem terminala in podatkovne baze. Sledi jedro našega dela, opis programske kode aplikacije. Poglavje je zaključeno z razdelkom o snemanju zvočnih posnetkov, potrebnih za aplikacijo. Peto poglavje prinaša primere delovanja aplikacije, ki smo jih ponazorili z izpisi iz Asteriskove konzole in dodatno opisali. V šestem poglavju smo opisali težave, na katere smo naleteli pri delu, in nakazali možne rešitve. V zadnjem, sklepnem sedmem poglavju, povzamemo naše delo in podamo smernice za nadaljnje delo.

Razvoj telefonske aplikacije v Asterisku Stran 3 2. TELEFONSKA CENTRALA ASTERISK 2.1 Kaj je Asterisk Asterisk je odprtokodna programska oprema za telefonsko naročniško centralo (PBX "Private Branch Exchange"). To pomeni da lahko do nje dostopa in jo uporablja vsakdo. Ime izvira iz simbola asterisk,*, ki v okoljih Unix (tudi Linux), za katera je bil Asterisk primarno razvit, pomeni "wildcard", nadomestni znak. Gledano s tehničnega vidika, podpira TDM ("Time-Division Multiplexing" časovno multipleksiranje) kakor tudi VoIP ("Voice over IP" govor preko IP) s tremi protokoli (SIP, H.323, MGCP ("Media Gateway Control Protocol" protokol za krmiljenje medijskih prehodov)). Za medomrežno povezavo z digitalno in analogno telefonsko opremo podpira Asterisk veliko različne strojne opreme. Nanj je možno priklopiti različne vmesnike in vmesniške kartice, kot na primer PSTN ("Public Switched Telephone Network" javno komutirano telefonsko omrežje), ISDN ("Integrated Services Digital Network" digitalno omrežje z integriranimi storitvami) (BRI ("Basic Rate Interface" osnovni vmesnik) oziroma PRI ("Primary Rate Interface" primarni vmesnik)) in GSM ("Global System for Mobile communications" globalni sistem za mobilne komunikacije). To pomeni, da lahko nanj povežemo skoraj vso že obstoječo telefonsko opremo, ne da bi za prehod na VoIP potrebovali še kakšne dodatne vmesnike [5]. Omogoča prilagodljive rešitve IP- telefonije, od majhnih okolij s 5 10 uporabniki, do velikih telefonskih central IP z več sto uporabniki. Temu primerna mora biti tudi strojna oprema (strežnik). Je popolnoma fleksibilen sistem, kar pomeni, da lahko dodajamo različne aplikacije, ki jih razvijemo sami in prilagodimo našim potrebam. 2.2 Sestava Pri prenosu govora preko interneta oziroma omrežja IP uporablja Asterisk tri protokole za VoIP, in sicer: SIP, H.323, MGCP.

Razvoj telefonske aplikacije v Asterisku Stran 4 Zelo pomemben je protokol IAX ("Inter-Asterisk Exchange" izmenjava med Asteriski), ki je glavni protokol za povezovanje več Asteriskov. Asterisk je sestavljen iz treh glavnih paketov: osnovnega programa Asterisk (asterisk), gonilnikov Zapata za telefonijo (zaptel), knjižnice PRI (libpri). Če želimo uporabljati samo omrežje VoIP, je edina zahteva namestitev osnovnega programa Asterisk. Gonilniki zaptel so potrebni, če želimo uporabiti analogno oziroma digitalno strojno opremo, knjižnica libpri pa je potrebna, če želimo uporabiti vmesnik ISDN PRI. 2.3 Možnosti Asterisk ponuja mnogo možnosti, za uporabo katerih se lahko posameznik odloči po lastnih željah in potrebah. Takšne možnosti so na primer [8]: konferenčni klici, pregled porabe po uporabnikih, snemanje pogovorov, avtomatska izbira najcenejše poti, glasba na čakanju, uporaba standardnih, video, brezvrvičnih ali programskih telefonov IP, poljubna določitev internih številk, avtentikacija uporabnikov, dodelitev uporabnikov v skupine in prevzem klica, grafični vmesnik za enostavno konfiguriranje in upravljanje s sistemom, povezljivost dveh ali več sistemov preko interneta, enostavna povezljivost z obstoječimi telefonskimi sistemi (vzporedno delovanje).

Razvoj telefonske aplikacije v Asterisku Stran 5 2.4 Klicne možnosti Asterisk prav tako ponuja veliko klicnih možnosti, se pravi opcij, ki jih uporabimo bodisi pred ali med samim potekom klica. Nekatere od klicnih možnosti Asteriska so [8]: glasovna pošta, preusmeritev klica, neposredni klic na interno številko, posredovanje klicev, zapora odhodnega prometa, avtomatski odzivnik, preusmeritev klica ob zasedenosti, preusmeritev klica ob nedosegljivosti, obvestila o klicih preko elektronske pošte. 2.5 Podpora kodekov Asterisk podpira naslednje govorne kodeke [4]: G.711 (A-zakon in µ-zakon), G.722, G.723.1, G.726, G.729, GSM, ilbc, LPC10, Speex, ADPCM.

Razvoj telefonske aplikacije v Asterisku Stran 6 Asterisk podpira tudi video kodeke [4]: H.261, H.263, H.263p, H.264. 2.6 Kanal SIP Protokol SIP, pogosto uporabljen v telefonih VoIP, skrbi za vzpostavljanje in sproščanje klica, skupaj s kakršnokoli spremembo klica, kot je predaja klica. Namen protokola SIP je pomagati končnima točkama govoriti med seboj (če je možno, neposredno med seboj). Protokol SIP je signalizacijski protokol, kar pomeni, da je njegov edini namen omogočiti govor med dvema končnima točkama. Ne ukvarja se s prenosom medija klica (govora). Poznamo dve vrsti končnih točk: odjemalce in strežnike. Odjemalec je končna točka, ki prične zahtevo, strežnik pa to zahtevo obdela in ustvari odgovor. Ko želi končna točka priklicati drugo končno točko (kot na primer pri klicu med programskima telefonoma), tvori zahtevo in jo pogosto pošlje na proksi SIP. Strežnik proksi ugotovi cilj zahteve in jo pošlje naprej. Ko izvorna in ciljna točka uspešno vzpostavita klic, je medij prenesen s protokolom RTP ("Real-time Transport Protocol" protokol za prenos v realnem času) in poslan neposredno med končnima točkama. Proksiji SIP se ne ukvarjajo z mediji, ampak s paketi SIP [1]. Asterisk, po drugi strani, imenujemo "Back-To-Back User Agent" (B2BUA uporabniški agent od strani do strani), kar pomeni, da deluje kot končna točka v obeh vlogah, kot strežnik (prejemanje) in kot odjemalec (oddajanje). Ko na primer programski telefon kliče določeno razširitev, je klic vzpostavljen neposredno med programskim telefonom in Asteriskom. Če logika, ki jo zapišemo v Asterisk, ugotovi, da želimo klicati drugo končno napravo, deluje Asterisk tudi kot odjemalec končne naprave in vzpostavi novo povezavo, poznano kot kanal, do drugega telefona [1]. Govor med dvema telefonoma pa "teče" neposredno skozi Asterisk. Z drugimi besedami je kanal povezava, ki pripelje klic do oziroma od telefonske centrale Asterisk. Kanal je lahko povezava do običajne telefonske slušalke oziroma navadne telefonske linije ali do logičnega klica (klica preko interneta).

Razvoj telefonske aplikacije v Asterisku Stran 7 Vsak klic je tvorjen ali prejet na ločenem kanalu. Konfiguriranje kanalov SIP se izvede v datoteki sip.conf, kjer konfiguriramo uporabnike oziroma terminale. Vsakemu kanalu je potrebno z rezerviranimi spremenljivkami določiti vrednosti, ki bodo posameznega uporabnika enolično določale (konkretno definiranje si oglejte v podpoglavju 4.3). Ko imamo povezavo SIP vzpostavljeno, bo ime kanala imelo obliko: SIP/peer-id, kjer je peer ime uporabnika in id naključni identifikator, ki enolično identificira to povezavo [7]. 2.7 Klicni načrt Klicni načrt Asteriska specificiramo v konfiguracijski datoteki z imenom extensions.conf. Sestavljen je iz štirih glavnih delov [1]: kontekstov, razširitev, prioritet, aplikacij. 2.8 Konteksti Klicni načrt je razdeljen na dele, imenovane konteksti. Konteksti so poimenovane skupine razširitev, ki služijo več namenom. Preprečujejo interakcijo različnih delov klicnega načrta. Razširitev, ki je definirana v enem kontekstu, je popolnoma izolirana od razširitev, ki so definirane v kateremkoli drugem kontekstu, razen če je definirano drugače. Konteksti so definirani z imenom, ki ga vpišemo v oglate okepaje ([ ]). Ime je lahko sestavljeno iz vseh črk od A do Z (velike ali male črke), števk od 0 do 9, vezajev in podčrtajev. Na primer, kontekst za dohodne klice bi izgledal tako: [dohodni] Vsi ukazi, ki sledijo za imenom konteksta, so del tega konteksta, dokler ni definiran nov kontekst. Ko definiramo kanal, je eden od parametrov, ki je definiran v definiciji tega kanala, prav kontekst. Z drugimi besedami je kontekst točka v klicnem načrtu, kjer se povezave določenega kanala začnejo. Posebnost sta konteksta [globals] in [general], ki se nahajata na začetku vsakega klicnega načrta. Kontekst [general] opisuje splošne nastavitve

Razvoj telefonske aplikacije v Asterisku Stran 8 klicnega načrta, [globals] pa globalne spremenljivke. Morda najpomembnejša lastnost konteksta je zagotavljanje varnosti. Pri pravilni uporabi lahko uporabnikom dodelimo določene pravice (na primer klice v tujino), ki pa jih drugi uporabniki nimajo. Ob nepravilini konfiguraciji klicnega načrta lahko pride do hujših zlorab sistema [1]. 2.9 Razširitve Razširitve so v Asterisku definirane kot zaporedje korakov (vsak korak nosi določeno aplikacijo), ki so potrebni, da gre Asterisk skozi klic. Znotraj posameznega konteksta lahko definiramo poljubno mnogo razširitev. Ko je določena razširitev sprožena (z dohodnim klicem ali s števkami, izbranimi v določenem kanalu), Asterisk sledi korakom, definiranim za to razširitev. Zatorej so razširitve tiste, ki določajo, kaj se zgodi s klicem, ko gre skozi klicni načrt. Prav tako je treba poudariti, da je razširitev v Asterisku lahko tako število kakor tudi ime. Sintaksa za razširitev je sestavljena iz besede exten, sledi ji enačaj in simbol za "večje": exten => Celotna razširitev je sestavljena iz treh delov: imena oziroma številke razširitve, prioritete (vsaka razširitev lahko ima več korakov, številko koraka imenujemo prioriteta), aplikacije (ukaza), ki pri klicu izvede določeno akcijo. Ti trije deli razširitve so ločeni z vejicami [1]: exten => ime, prioriteta, aplikacija() 2.10 Prioritete Vsaka razširitev lahko ima več korakov, imenovanih prioritete. Vsaka prioriteta je zaporedno oštevilčena, začenši s številko 1, in izvede eno določeno aplikacijo. Za vsako naslednjo prioriteto uporabimo črko n ("next"). Vsakič ko Asterisk naleti na prioriteto z

Razvoj telefonske aplikacije v Asterisku Stran 9 imenom n, vzame številko prejšnje prioritete in ji prišteje 1. Namesto črke n lahko za vsako naslednjo prioriteto uporabimo številko, za ena večjo od prejšnje številke [1]. 2.11 Aplikacje Aplikacije so glavna gonilna sila celotnega klicnega načrta [1]. Vsaka aplikacija izvede določeno akcijo na trenutnem kanalu, kot na primer predvaja zvočni posnetek, sprejme ton DTMF ("Dual Tone Multi-Frequency" dvotonska večfrekvenčna signalizacija), pokliče drug kanal in podobno. Nekatere aplikacije, kot sta na primer Answer() in Hangup(), ne potrebujejo dodatnih navodil za izvedbo. Drugim moramo v oklepaje dati argumente, ki dodatno opisujejo, kaj naj naredi aplikacija. Opisali bomo le nekatere [3]: NoOp() ta aplikacija ne naredi ničesar, vendar je zelo uporabna pri iskanju napak, saj izpiše vrednosti na Asteriskovi konzoli. Set() nastavi spremenljivko kanala ali vrednost funkcije. Goto() prehod na določeno prioriteto, razširitev ali kontekst. GotoIf() pogojni Goto(). Playback() predvaja zvočni posnetek. Hangup() brezpogojno konča klic. Background() predvaja zvočni posnetek, medtem ko čakamo na vnos številke oziroma imena. WaitExten() čaka na vnos razširitve. Read() prebere spremenljivko preko DTMF. Macro() izvede določen makro. Dial() vzpostavi klic in povezavo do trenutnega kanala.

Razvoj telefonske aplikacije v Asterisku Stran 10 2.12 Makri Makri so zeli uporabni pri izogibanju ponavljanju v klicnem načrtu. Definicija makra je zelo podobna definiciji konteksta. Makre definiramo z macro- pred imenom našega makra v oglatih oklepajih: [macro-ime] Pred imenom makra mora biti macro-. To makre razlikuje od normalnih kontekstov. Ukazi znotraj makra so skoraj enaki vsemu drugemu znotraj klicnega načrta. Edina razlika je, da makri uporabljajo le razširitev "s". Ko klici vstopijo v kontekst brez specifično določene razširitve, se posredujejo do razširitve s. Črka s označuje besedo start, saj se bo tukaj začel klic, če ni bilo prejetih nobenih informacij o klicu [1]. 2.13 Ujemanje vzorcev Ujemanje vzorcev nam omogoča implementacijo ene razširitve v klicnem načrtu, ki se bo ujemala z različnimi številkami. Pri uporabi ujemanja vzorcev obstajajo določene črke in simboli, ki označujejo, kaj naj se ujema. Vzorec se vedno začne s podčrtajem (_). Ta pove Asterisku, da bomo uporabili ujemanje vzorca in ne natančne vrednosti. Za podčrtajem lahko uporabimo naslednje oznake [1]: X pomeni katerokoli števko od 0 do 9, Z pomeni katerokoli števko od 1 do 9, N pomeni katerokoli števko od 2 do 9, [1-5] ujemanje s posamezno enomestno števko, v tem primeru 1, 2, 3, 4 ali 5,. ujemanje z enim ali več znaki ne glede na to, kateri so.

Razvoj telefonske aplikacije v Asterisku Stran 11 3. NAMESTITEV ORODIJ 3.1 Namestitev Asteriska Asterisk namestimo na operacijski sistem Linux [1]. V našem primeru je namestitev potekala na operacijski sistem Linux CentOS 5.2. Že pred namestitvijo Asteriska je treba imeti nameščen spletni strežnik Apache in nekatere pakete, ki so potrebni za delovanje Asteriska samega. Te pakete namestimo z naslednjim ukazom: yum install y gcc libtermcap-devel gcc-c++ unixodbc-devel libtool Za namestitev najnovejše različice izvorne kode (v našem primeru je to različica 1.4.23) naredimo naslednje korake (potrebujemo korenske pravice): # cd /usr/src # wget http://downloads.digium.com/pub/asterisk/asterisk-1.4-current.tar.gz #tar zxvf asterisk-1.4-current.tar.gz # cd /usr/src/asterisk-1.4.23 #make clean #./configure # make menuselect #make install #make samples Asterisk poženemo v datoteki /usr/sbin z ukazom "asterisk". Ukaz "make samples" ustvari primere konfiguracijskih datotek, potrebnih za delovanje centrale. V našem primeru sta to datoteki sip.conf in extensions.conf. V sip.conf bomo vpisali vse uporabnike oziroma terminale in njihove lastnosti, s katerimi bomo operirali in ki bodo del našega sistema. V extensions.conf pa bomo določili, kako bodo klici potekali. Prav tako bo za našo aplikacijo pomembna konfiguracijska datoteka func_odbc.conf, o kateri pa nekoliko več v naslednjem poglavju. Uporabljene bodo še nekatere datoteke, ki pa so pomembnejše pri vzpostavitvi podatkovne baze kot pri samem Asterisku in bodo opisane sproti.

Razvoj telefonske aplikacije v Asterisku Stran 12 3.2 Namestitev podatkovne baze PostgreSQL Čeprav je na voljo veliko podatkovnih baz za okolje Linux, smo se odločili za PostgreSQL. Najprej namestimo strežnik PostgreSQL [1]: # yum install y postgresql-server Za prvi zagon podatkovne baze izvedemo ukaz: # service postgresql start Naslednji korak je tvorjenje uporabnika z imenom asterisk, s pomočjo katerega se bomo povezovali in urejali našo podatkovno bazo: # su postgres $ createuser P Enter name of user to add: asterisk Enter password for new user: Enter it again: Shall the new role be a superuser? (y/n) n Shall the new user be allowed to create databases? (y/n) y Shall the new user be allowed to create more new users? (y/n) n CREATE USER Ker PostgreSQL ne "posluša" povezave TCP/IP, ki jo bo Asterisk uporabljal, moramo le-to omogočiti. To storimo tako, da v konfiguracijski datoteki, ki se nahaja v /var/lib/pgsql/data/postgresql.conf, spremenimo parametre na : listen_addresses = true port = 5432 Ko smo to storili, moramo v konfiguracijski datoteki, ki se nahaja v /var/lib/pgsql/data/pg_hba.conf, dovoliti uporabniku povezavo do strežnika PostgreSQL preko vtičnice TCP/IP. To storimo s spremembo konfiguracijske datoteke: host all asterisk 127.0.0.1 255.255.255.255 md5

Razvoj telefonske aplikacije v Asterisku Stran 13 local all asterisk trust Sedaj lahko ustvarimo podatkovno bazo, ki jo bomo poimenovali asterisk, in nastavimo lastnika te baze, ki bo naš uporabnik asterisk. $ createdb owner=asterisk asterisk CREATE DATABASE Strežnik PostgreSQL ponovno poženemo: $ exit # service postgresql restart Povezavo do strežnika PostgreSQLlahko preverimo na naslednji način: # psql h 127.0.0.1 U asterisk Password: 3.3 Namestitev in konfiguriranje ODBC Konektor ODBC je abstraktna plast podatkovne baze, ki Asterisku omogoča komunikacijo z več podatkovnimi bazami, ne da bi razvijalec moral ustvariti dodaten konektor za vsako podatkovno bazo, ki jo želi administrirati [1]. To prihrani veliko truda pri razvijanju in vzdrževanju kode. Pred namestitvijo konektorja v Asterisk moramo najprej namestiti ODBC na Linux sam (če tega že nismo storili ob instalaciji Asteriska). Za namestitev gonilnikov ODBC uporabimo ukaz: # yum install y unixodbc unixodbc-devel libtool-ltdl libtool-ltdl-devel Najprej je treba preveriti v /etc/odbcinst.ini, ali imamo pravilno konfiguriran gonilnik ODBC PostgreSQL. Izgledati mora tako: [PostgreSQL] Description = ODBC for PostgreSQL Driver Setup = /usr/lib/libodbcpsql.so = /usr/lib/libodbcpsqls.so

Razvoj telefonske aplikacije v Asterisku Stran 14 FileUsage = 1 Prav tako je treba preveriti, ali sistem lahko vidi gonilnik. To preverimo z ukazom: # odbcinst q d Rezultat mora biti: [PostgreSQL] Naslednji korak je konfiguriranje datoteke /etc/odbc.ini, kjer ustvarimo identifikator, ki ga bo Asterisk uporabljal za sklicevanje na to konfiguracijo. Datoteka je podobna tej: [asterisk-connector] Description Driver Database Servername UserName Password = PostgreSQL connection to 'asterisk' database = PostgreSQL = asterisk = localhost = asterisk = welcome Port = 5432 Protocol = 7.4 ReadOnly RowVersioning = No = No ShowSystemTables ShowOidColumn = No = No FakeOidIndex = No ConnSettings = Sedaj preverimo povezavo na našo bazo z aplikacijo isql. Aplikacija isql ne bo izvedla povezave, če se skušamo prijaviti kot korenski uporabnik. Pognana mora biti s strani lastnika baze. Ker je lastnik podatkovne baze astersik uporabnik asterisk, moramo

Razvoj telefonske aplikacije v Asterisku Stran 15 konfigurirati račun Linux z istim imenom. Po konfiguriranju novega računa preverimo delovanje: # su asterisk $ echo»select 1«isql v asterisk-connector Ko imamo unixodbc nameščen, konfiguriran in ko smo preverili, da deluje, moramo ponovno prevesti Asterisk, da namestimo in ustvarimo module ODBC. #cd /usr/src/asterisk-1.4 #make distclean #./configure #make menuselect #make install Sledi konfiguriranje konfiguracijske datoteke res_odbc.conf za dostop do naše baze. Povezave ODBC so konfigurirane v datoteki res_odbc.conf, ki se nahaja v datoteki /etc/asterisk. V tej datoteki nastavimo parametre, ki jih bodo različni moduli Asteriska uporabljali za povezavo do podatkovne baze. Datoteka res_odbc.conf: [asterisk] enabled => yes dsn => asterisk-connector username => asterisk password => welcome pooling => no limit => 0 pre-connect => yes Opcija dsn kaže na povezavo podatkovne baze, ki smo jo konfigurirali v etc/odbc.ini. Ko imamo datoteko res_odbc.conf konfigurirano, poženemo Asterisk in preverimo povezavo do podatkovne baze:

Razvoj telefonske aplikacije v Asterisku Stran 16 *CLI> odbc show Name: asterisk DSN: asterisk-connector Pooled: no Connected: yes

Razvoj telefonske aplikacije v Asterisku Stran 17 4. KONFIGURIRANJE APLIKACIJE 4.1 Opis aplikacije Imamo člane laboratorija LMS vključno z vodjo. Praviloma vsak sedi v svoji sobi pri svojem telefonu in ima svojo interno telefonsko številko, ki je tu podana poleg imena člana: Zmago Brezočnik vodja (7210) Tatjana Kapus (7213) Bogdan Dugonik (7214) Robert Meolic (7215) Peter Vicman (7268) Boštjan Vlaovič (7217) Aleksander Vreže (7267) Andrej Romih (7212) Tim Kovše (7208) Vzemimo, da se občasno nekateri člani laboratorija nahajajo v drugem prostoru laboratorija in ne svojem. Da bi jih tudi takrat lahko poklicali in da bi imeli nadzor nad tem, ali so v službi, se morajo v vsakem prostoru, kamor pridejo (tudi v svojem), prijaviti na enem od telefonov v tem prostoru. Ko prostor zapustijo, pa se morajo odjaviti. Prijava in odjava potekata podobno. Vsak član naj ima svojo kodo PIN ("Personal Identification Number" osebna identifikacijska številka), ki mu jo določi administrator. Ob prihodu v prostor si izbere enega od telefonov članov laboratorija in se prične prijavljati, tako da vtipka zadnje tri cifre svoje telefonske številke. Cifre vtipka, tudi kadar se hoče odjaviti. Centrala preveri, ali so cifre od enega od članov laboratorija. Če niso, to javi uporabniku in postopek prijave oziroma odjave se konča. Če so cifre od enega od članov, ima član na voljo tri poskuse, da vtipka svojo PIN-kodo. Čim vtipka pravilno kodo, se nadaljuje postopek in član ne sme več vtipkati PIN-kode. Za vsako zaporedno napačno

Razvoj telefonske aplikacije v Asterisku Stran 18 vtipkanje kode pa je član opozorjen. Če tudi v tretjem poskusu ne vtipka svoje kode (tj. te, ki pripada njegovi telefonski številki), je član obveščen o neuspešnem poskusu. Če je član pravilno vtipkal PIN-kodo, se prijava oziroma odjava nadaljuje, tako da centrala preveri, ali je že od prej prijavljen. Če ni, si zabeleži, da se je član prijavil in na katerem telefonu (tj. na kateri telefonski številki). Če je, centrala preveri, ali je na isti številki, s katere se prijavlja. Če ni na isti, ga odjavi in prijavi na novi številki. Če je na isti, ga centrala vpraša, ali hoče ostati še naprej prijavljen ali naj ga odjavi. Pove mu tudi, katero cifro naj vtipka za ohranitev prijave, katero pa za odjavo. Glede na vtipkano cifro (na voljo je samo en poskus če cifra ni pričakovana, je član obveščen o napaki in postopek se konča brez spremembe statusa prijave) ostane član še naprej prijavljen ali pa ga centrala odjavi. Eden od namenov prijavljanja je, da lahko vsak član laboratorija prikliče vsakega drugega, četudi je v drugem prostoru laboratorija. Člani laboratorija se med seboj kličejo kot običajno, z internimi telefonskimi številkami, navedenimi zgoraj in v imeniku FERI. Ko eden od članov kliče drugega na njegovo številko, se najprej preveri, ali je član s to številko prijavljen. Če ni, se klic ne izvede in kličočemu centrala javi, da klicani ni prijavljen. Če je prijavljen, se klic usmeri na številko, na kateri je klicani prijavljen in klic se nadaljuje, kot je običaj. Posebnost je samo, da centrala za vsakega člana laboratorija povzroči drugačno zvonjenje, tako da član laboratorija, prijavljen na drugem telefonu, ve, da je klic za njega. Za vsakega člana laboratorija je način zvonjenja enolično določen, ne glede na to, na katerem telefonu naj mu zvoni. Člane laboratorija pa seveda lahko poskušajo z interno številko klicati tudi drugi zaposleni na FERI. Vsi ti imajo štirimestne interne številke, ki se pričnejo s 7, druga cifra je 0, 1 ali 2, preostali pa poljubni, vendar takšni, da številka ni enaka številkam članov laboratorija. Centrala mora ugotoviti, ali kliče drug zaposlen s FERI. V tem primeru skuša vzpostaviti klic do klicanega, samo če je prijavljen na svojem telefonu. Izjema je klicanje vodje laboratorija. Do tega se klic izvede v vsakem primeru, tudi če ni prijavljen nikjer ali če je prijavljen na drugem telefonu laboratorija. Če ni prijavljen, se klic izvede na njegovo številko, če je, pa se izvede na številko, na kateri je prijavljen. Člane laboratorija lahko kličejo tudi vsi, ki niso zaposleni na FERI, so pa zaposleni na eni od tehniških fakultet. Telefonske številke vseh zaposlenih na tehniških fakultetah so 7-

Razvoj telefonske aplikacije v Asterisku Stran 19 mestne. Zadnje štiri cifre so interna številka. Prve tri cifre so na FERI 220, na drugih tehniških fakultetah pa drugačne. Zunanji klici se usmerijo na klicano številko ne glede na to, ali je član s to številko kje prijavljen ali ne. Vzemimo še, da klicanemu članu laboratorija v primeru klica z drugih tehniških fakulteti na njegovem telefonu zvoni drugače kot za klice s FERI. Tako takoj sliši, ali je klic od zunaj, in se lahko hitro odloči, ali se bo nanj odzval ali ne. Seveda člani laboratorija lahko kličejo po celem FERI in vse na drugih tehniških fakultetah. Kličejo lahko samo, če so prijavljeni. Če niso, centrala ne izvede klica in člana opozori, da ni prijavljen. Vsi opisani klici se izvajajo s protokolom SIP. 4.2 Potek dela Z delom bomo začeli pri konfiguriranju terminalov. Ker bomo za aplikacijo potrebovali le protokol SIP, bomo parametre za posamezen terminal določili v konfiguracijski datoteki sip.conf. Sledila bo namestitev in konfiguriranje programskega telefona, ki bo v našem primeru X-lite podjetja CounterPath. Po upešnem konfiguriranju bomo v podatkovni bazi tvorili tabelo, kamor bomo vnesli vse člane LMS in jim dodelili različne vrednosti, kot so ime, priimek, PIN, prijavna številka in podobno. Nadaljevali bomo z najpomembnejšim delom naše aplikacije, s klicnim načrtom. Odprli bomo datoteko extensions.conf in definirali potek delovanja aplikacije. Na koncu bomo posneli zvočne posnetke, za katere smo uvideli, da so primerni pri vodenju člana skozi aplikacijo. 4.3 Konfiguriranje terminala Najprej se posvetimo konfiguracijski datoteki sip.conf in konfiguriranju terminala. Terminal bomo predstavili z imenom kabineta enega izmed članov laboratorija. Minimalna konfiguracija za en terminal oziroma enega uporabnika izgleda, kot prikazuje slika 4.1 [1].

Razvoj telefonske aplikacije v Asterisku Stran 20 Slika 4.1: Primer definiranja terminala v sip.conf [G_1102] ; predstavlja ime oziroma številko, s katero definiramo terminal in jo bomo v našem primeru uporabili za določanje lokacije, kjer bo eden od članov LMS prijavljen. type=friend ; določimo tip uporabnika. Izbiramo lahko med peer, user in friend. Peer terminal/uporabnik, ki lahko samo prejema pozive. User terminal/uporabnik, ki lahko samo prične pozive. Friend terminal/uporabnik, ki lahko tako prične kot prejema pozive. context=hotdesk ; določimo kontekst, v katerega gre klic na ta terminal. callerid=kapus <7213> ; prikaz imena ob klicu. secret=skrivnost ; izberemo geslo, ki ga nastavimo v terminalu samem. host=dynamic ; definiramo gostitelja, tako da določimo, kje v omrežju se terminal nahaja, ko želi Asterisk nanj poslati klic. To lahko storimo na dva načina, statično ali dinamično. Če želimo gostitelja definirati kot statičnega, damo spremenljivki host kot vrednost naslov IP terminala. Dinamično pomeni, da ko se bo terminal želel registrirati, bo Asterisk s strani tega telefona oziroma programskega telefona prejel paket REGISTER, ki bo Asterisku povedal, kateri naslov IP uporablja. Podobno naredimo za vse druge terminale (glejte Prilogo A):

Razvoj telefonske aplikacije v Asterisku Stran 21 G2_3N_52, G2_3N_58, G_203_Meolic, G_203_Vicman, G_218_Vlaovic, G_218_Vreze, G_218_Romih, G_218_Kovse. 4.4 Potek namestitve programskega telefona X-lite Programski telefon X-Lite podjetja CounterPath je zelo popularen pri uporabnikih Asteriska, saj je zelo enostaven za uporabo, funkcionalen in kar je najpomembnejše, zastonj. Naložimo ga s strani www.counterpath.net in namestimo v okolje Linux. Slika 4.2: Programski telefon X-lite

Razvoj telefonske aplikacije v Asterisku Stran 22 Za konfiguriranje pritisnemo gumb "Settings" na grafičnem vmesniku (kot je označeno na sliki 4.2). Izberemo System Settings SIP Proxy [Default]. Tako pridemo v privzeto konfiguracijo programskega telefona. Konfiguriramo ga, kot prikazuje slika 4.3. Slika 4.3: Konfiguriranje uporabnika Uporabnika konfiguriramo glede na konfiguracijo uporabnika v datoteki sip.conf. Pod "Domain" in "SIP Proxy" vnesemo naslov IP Asteriska, kar je v našem primeru 192.168.1.2. Slika 4.4: Pravilno konfiguriran programski telefon

Razvoj telefonske aplikacije v Asterisku Stran 23 Na sliki 4.4 je možno videti, da smo terminal pravilno konfigurirali ("Logged in") z imenom G_1102, kar predstavlja ime kabineta. 4.5 Konfiguriranje podatkovne baze Najprej se povežemo na konzolo podatkovne baze z ukazoma [1]: # su - postgres $ psql - U asterisk - h localhost asterisk Password: Vnesemo geslo in ustvarimo tabelo z imenom ast_hotdesk: CREATE TABLE ast_hotdesk ( id serial NOT NULL, extension int8, first_name text, last_name text, cid_name text, cid_number varchar(10), pin int4, context text, status bool DEFAULT false, "location" text, login int8, CONSTRAINT ast_hotdesk_id_pk PRIMARY KEY (id) ) WITHOUT OIDS;

Razvoj telefonske aplikacije v Asterisku Stran 24 Nato napolnimo bazo z naslednjimi podatki: asterisk=> INSERT INTO ast_hotdesk ('extension', 'login', 'first_name', 'last_name', 'cid_name', 'cid_number', 'pin', 'context', 'location') \ VALUES (7213, '213', 'Tatjana', 'Kapus', 'Tatjana Kapus', '022207213', '888', 'calls_tf', 'G_1102'); Na tem mestu je treba poudariti, da se bo vrednost lokacije spreminjala, tako kot se bo član prijavljal na različnih terminalih. Enako, z drugačnimi vrednostmi, storimo tudi za druge člane LMS. Vse podatke v tabeli ast_hotdesk lahko pogledamo z enostavnim stavkom SELECT iz konzole PostgreSQL: asterisk=> SELECT * FROM ast_hostdesk; ki nam prikaže: Slika 4.5: Grafična podoba podatkovne baze 4.6 Snovanje klicnega načrta Klicni načrt opisujemo po vrsti, začenši s prijavo in odjavo člana, nadaljujemo z opisom poteka internih klicev, vmes opisujemo funkcije iz konfiguracijske datoteke func_odbc.conf, zaključimo z opisom izvedbe zunanjih klicev. Komentar ločimo od programske kode s podpičjem (;). Celotno programsko kodo, brez komentarjev, si je

Razvoj telefonske aplikacije v Asterisku Stran 25 možno ogledati v Prilogi B in Prilogi C na koncu diplomskega dela. Pri snovanju klicnega načrta smo si nekoliko pomagali s podobno aplikacijo, "hotdesking" [1]. Odpremo datoteko extensions.conf, ustvarimo konteksta [globals] in [general] in definiramo: [globals] Brezocnik=SIP/G2_3N_52 Kovse=SIP/G_218_Kovse Kapus=SIP/G_1102 Dugonik=SIP/G2_3N_58 Meolic=SIP/G_203_Meolic Vicman=SIP/G_203_Vicman Vlaovic=SIP/G_218_Vlaovic Vreze=SIP/G_218_Vreze Romih=SIP/G_218_Romih ; definiramo globalne spremenljivke, na katere se bomo sklicevali, ko bomo hoteli klicati na primer preko kanala SIP/G_1102. [general] Sedaj ustvarimo kontekst hotdesk, začnemo z ujemanji vzorcev, ki bodo omogočili prijavo članom LMS: [hotdesk] exten => _2XX,1,NoOp() exten => _2XX,n,Set(E=${EXTEN}) exten => _2XX,n,Set(${E}_STATUS=${HOTDESK_INFO(status,${E})}) exten => _2XX,n,Set(${E}_PIN=${HOTDESK_INFO(pin,${E})}) exten => _2XX,n,GotoIf($[${ISNULL(${${E}_STATUS})}]?invalid_user,1) exten => _2XX,n,Goto(login,1)

Razvoj telefonske aplikacije v Asterisku Stran 26 ; ko se član LMS vsede h kateremukoli terminalu člana LMS, vtipka svojo prijavno številko, tj. zadnje tri števke svoje interne številke, za prijavo oziroma odjavo. To smo definirali z ujemanjem vzorca, ki se prične s števko 2 in še dvema števkama, ki predstavljata število med 0 in 9. Nato nastavimo status člana (ali je prijavljen ali odjavljen) in PIN člana. Prijavno številko uporabi func_odbc za preverbo v funkciji HOTDESK_INFO() klicnega načrta. Ta funkcija, ki smo jo definirali v konfiguracijski datoteki func_odbc.conf, izvede stavek SQL in vrne, karkoli je dobljeno iz podatkovne baze. Funkcijo HOTDESK_INFO() smo definirali tako: [INFO] prefix=hotdesk dsn=asterisk read=select ${ARG1} FROM ast_hotdesk WHERE extension = ${ARG2} Začnemo s predpono, ki pa je neobvezna. Če je posebej ne imenujemo, Asterisk doda ime ODBC, tako da bi naša funkcija bila poimenovana ODBC_INFO(). Atribut dsn pove Asterisku, katero povezavo iz res_odbc.conf naj uporabi. Ker bi lahko bilo konfiguriranih mnogo povezav podatkovne baze, tukaj določimo, katero uporabiti. Sedaj definiramo stavek SQL z atributom read. Funkcije klicnega načrta imajo dva formata, s katerima ju lahko prikličemo: enega za pridobivanje informacij in drugega za nastavljane informacij. Atribut read je uporabljen pri klicu naše funkcije HOTDESK_INFO() s formatom za pridobivanje informacij. Tako sta status oziroma PIN in razširitev, s katere član kliče, zajeta v stavku SQL, ki smo mu dodelili atribut read. Dostopna sta kot ${ARG1} in ${ARG2}. Preverimo, ali je član pravilno vtipkal prijavno številko oziroma ali takšna številka sploh obstaja v naši bazi. Če je ne najde, preidemo na razširitev invalid_user: exten => invalid_user,1,noop() exten => invalid_user,n,verbose(1 Hot Desk extension ${E} ne obstaja) exten => invalid_user,n,playback(silence/2&hotdesk/ne_obstaja) exten => invalid_user,n,hangup()

Razvoj telefonske aplikacije v Asterisku Stran 27 Ta nam predvaja zvočni posnetek in prekine pogovor. Za prijavno številko, ki obstaja, tj. se nahaja v bazi, pa preidemo na razširitev z imenom login. Vsak član ima svojo kodo PIN, ki mu jo določi administrator. exten => login,1,noop() exten => login,n,set(pin_tries=0) ; nastavimo spremenljivko z imenom PIN_TRIES na 0. exten => login,n,set(max_pin_tries=2) exten => login,n(get_pin),noop() ; poimenujemo prioriteto. exten => login,n,set(pin_tries=$[${pin_tries} + 1]) exten=>login,n,read(pin_entered hotdesk/vnesite_pin ${LEN(${${E}_PIN})}) ; predvajamo posnetek "Vnesi pin" in s funkcijo LEN preberemo vneseno. exten => login,n,gotoif($[${pin_entered} = ${${E}_PIN}]?valid_login,1) ; če se vneseni PIN in PIN, ki smo ga prebrali iz baze, ujemata, preidemo na razširitev valid_login. exten => login,n,playback(hotdesk/napacen_pin) ; če se ne ujemata, predvajamo "Napacen pin". exten => login,n,gotoif($[${pin_tries} <=${MAX_PIN_TRIES}]?get_pin:login_fail,1) ; dovolimo tri poizkuse vnosa kode PIN. Če tudi tretjič napačno vnesemo kodo PIN, skočimo na razširitev login_fail: exten => login_fail,1,noop() exten => login_fail,n,playback(silence/1&hotdesk/neuspesna_prijava) exten => login_fail,n,hangup() Če smo pravilno vnesli kodo PIN, ki pripada določenemu članu, preidemo na valid_login, ob tem pa je izgled naše baze na primer takšen kot na sliki 4.6.

Razvoj telefonske aplikacije v Asterisku Stran 28 Slika 4.6: Prijavljeni člani LMS exten => valid_login,1,verbose(1 Hot Desk Extension ${E} is changing status) exten => valid_login,n,verbose(1 Checking current status of extension ${E}) exten => valid_login,n,set(${e}_status=${hotdesk_info(status,${e})}) ; preverimo status kličočega. exten => valid_login,n,set(location=${cut(channel,/,2)}) exten => valid_login,n,set(location=${cut(location,-,1)}) Na tem mestu uporabimo spremenljivko CHANNEL, s pomočjo katere ugotovimo, s katere lokacije kliče član LMS. Ta spremenljivka ima ponavadi vrednost kot na primer SIP/G_1102-140daec0. Najprej uporabimo funkcijo CUT(), s katero najprej odrežemo del niza SIP/. Zatem odrežemo še del niza -140daec0 in dodelimo dobljeno G_1102, kar predstavlja prostor, s katerega član kliče, spremenljivki LOCATION. exten => valid_login,n,gotoif($[${${e}_status} = 0]?8) ; preverimo, ali je član že od prej prijavljen. Če ni, preidemo na korak 8 razširitve valid_login. exten => valid_login,n,gotoif($[${${e}_status} = 1]?11) ; če je član prijavljen, preskočimo na korak številka 11. ; uporabimo funkcijo HOTDESK_STATUS, ki je definirana tako:

Razvoj telefonske aplikacije v Asterisku Stran 29 [STATUS] prefix=hotdesk dsn=asterisk write=update ast_hotdesk SET status = '${VAL1}', location = '${VAL2}' WHERE login = '${ARG1}' Sintaksa je zelo podobna sintaksi za atribut read. Prva stvar, v kateri se razlikujeta, je ta, da pri atributu write znotraj stavka SQL uporabljamo spremenljivki ${VALx} in ${ARGx}. Ti vsebujeta vrednosti, ki jih dodelimo funkciji v klicnem načrtu. Pri definirani funkciji HOTDESK_STATUS() imamo dve spremenljivki VAL in eno spremenljivko ARG, ki so bile določene v klicnem načrtu z izjavo: exten => valid_login,n,set(hotdesk_status(${e})=1\,${location}) ; prenašamo vrednost spremenljivke ${E} v funkcijo HOTDESK_STATUS, tako da je nato dosegljiva v stavku SQL znotraj func_odbc.conf s spremenljivko ${ARG1}. Nako prenašamo dve vrednosti: 1 in ${LOCATION}. Tako sta ti dve vrednosti dosegljivi stavku SQL s spremenljivkama ${VAL1} in ${VAL2}. Tako za vsakega člana, ki se prijavi, nastavimo status 1 in zapišemo, na kateri lokaciji se je prijavil. exten => valid_login,n,playback(hotdesk/uspesna_prijava) exten => valid_login,n,hangup() exten => valid_login,n,gotoif($[${location} = ${HOTDESK_LOCATION_INFO(${E})}]?13) ; če je član že prijavljen in se želi odjaviti iz istega prostora, kjer je že prijavljen, ali če pozabi, da je že prijavljen, preverimo, ali je lokacija, s katere kliče, enaka lokaciji, na kateri je prijavljen oziroma ki je zapisana v bazi. To storimo s funkcijo: [LOCATION_INFO] prefix=hotdesk dsn=asterisk read=select location FROM ast_hotdesk WHERE login= '${ARG1}'

Razvoj telefonske aplikacije v Asterisku Stran 30 Izberemo lokacijo, kjer je član prijavljen. Če se lokaciji ujemata, preidemo na korak 13, kjer predvajamo zvočni posnetek, ki članu ponudi možnost ostati prijavljen ali se odjaviti. To stori, tako da pritisne ponujeno števko na tipkovnici terminala. Če se lokaciji ne ujemata, preidemo na naslednji korak, pri katerem skočimo nazaj na korak 8 iste razširitve. Če se član pozabi odjaviti in se želi prijaviti na drugi lokaciji, ga aplikacija odjavi na stari lokaciji in prijavi na novi. exten => valid_login,n,goto(8) exten => valid_login,n,background(hotdesk/prijava_odjava) exten => valid_login,n,waitexten(3) ; čakamo na vnos člana. Ob pritisku tipke 1 na terminalu se predvaja zvočni posnetek, da se je član uspešno prijavil. Ker je član že bil prijavljen in je to morda pozabil, se predvaja samo ta posnetek brez kakršnekoli druge akcije. Ob pritisku števila 2 skočimo na razširitev z imenom logout. Če uporabnik vnese število, ki ni pričakovano, za to je v Asterisku rezervirana razširitev i, člana na to opozorimo. Prav tako ga opozorimo na napako, če poteče čas za vnos, za kar je rezervirana razširitev t. exten => 1,1,Playback(hotdesk/uspesna_prijava) exten => 1,n,Hangup() exten => 2,1,Goto(logout,1) exten => i,1,noop() exten => i,n,playback(hotdesk/napacno_stevilo) exten => i,n,hangup() exten => t,1,playback(hotdesk/napacno_stevilo) exten => t,n,hangup() Člana odjavimo z razširitvijo logout. Tako s pomočjo funkcije HOTDESK_STATUS() nastavimo status prijavnega števila na 0. Na tem mestu uporabimo spremenljivko kanala ${ODBCROWS}, ki je definirana s funkcijo HOTDESK_STATUS(). Ta nam pove, koliko vrstic je bilo spremenjenih s stavkom SQL UPDATE; predpostavljamo, da 1. Če je

Razvoj telefonske aplikacije v Asterisku Stran 31 vrednost ${ODBCROWS} manj kot 1, predpostavljamo, da je prišlo do napake, kar ponazorimo z razširitvijo error. exten => logout,1,noop() exten => logout,n,set(hotdesk_status(${e})=0) exten => logout,n,gotoif($[${odbcrows} < 1]?error,1) exten => logout,n,playback(silence/1&hotdesk/uspesna_odjava) exten => logout,n,hangup() Razširitev login_fail uporabimo, ko tudi tretjič narobe vtipkamo PIN-kodo ob prijavi oziroma odjavi člana. Aplikacija nas opozori, da je bila prijava neuspešna. exten => login_fail,1,noop() exten => login_fail,n,playback(silence/1&hotdesk/neuspesna_prijava) exten => login_fail,n,hangup() exten => error,1,noop() exten => error,n,playback(silence/1&hotdesk/napaka) exten => error,n,hangup() Če član ob prijavi oziroma odjavi vtipka napačno prijavno številko, ga na to opozorimo. exten => invalid_user,1,noop() exten => invalid_user,n,verbose(1 Hot Desk extension ${E} ne obstaja) exten => invalid_user,n,playback(silence/2&hotdesk/ne_obstaja) exten => invalid_user,n,hangup() include => hotdesk_outbound ; vključimo kontekst hotdesk_outbound, ki bo članom laboratorija omogočal odhodne klice. [hotdesk_outbound] exten => _X.,1,NoOp() exten => _X.,n,Set(LOCATION=${CUT(CHANNEL,/,2)})

Razvoj telefonske aplikacije v Asterisku Stran 32 exten => _X.,n,Set(LOCATION=${CUT(LOCATION,-,1)}) ; ponovno definiramo spremenljivko LOCATION z uporabo spremenljivke CHANNEL. exten => _X.,n,Set(WHO=${HOTDESK_PHONE_STATUS(${LOCATION})}) Definiramo spremenljivko WHO s pomočjo funkcije HOTDESK_PHONE_STATUS(): [PHONE_STATUS] prefix=hotdesk dsn=asterisk read=select login FROM ast_hotdesk WHERE location = '${ARG1}' AND status = '1' Če član ni prijavljen, ne more opravljati izhodnih klicev. Če je prijavljen, s pomočjo funkcije HOTDESK_INFO() pridobimo iz baze informacije o članu. exten => _X.,n,GotoIf($[${ISNULL(${WHO})}]?not_logged_in,1) ; če je spremenljivka WHO, ki mora vrniti prijavno številko klicatelja, nič oziroma ne obstaja, preidemo na razširitev z imenom not_logged_in. exten => _X.,n,Set(${WHO}_CID_NAME=${HOTDESK_INFO(cid_name,${WHO})}) exten => _X.,n,Set(${WHO}_CID_NUMBER=${HOTDESK_INFO(cid_number,${WHO})}) exten => _X.,n,Set(${WHO}_CONTEXT=${HOTDESK_INFO(context,${WHO})}) exten => _X.,n,Goto(${${WHO}_CONTEXT},${EXTEN},1) ; preidemo na kontekst, ki je članu določen v bazi, in sicer na številko, ki jo kliče, na prioriteto številka 1. Člana opozorimo, da ni prijavljen. exten => not_logged_in,1,noop() exten => not_logged_in,n,playback(silence/1&hotdesk/niste_prijavljeni) exten => not_logged_in,n,hangup()

Razvoj telefonske aplikacije v Asterisku Stran 33 [LMS] S tem kontekstom omogočimo članom laboratorija LMS klice med seboj oziroma dohodne klice drugih zaposlenih na FERI in z drugih TF (tehniških fakultet). exten => 7210,1,NoOp() exten => 7210,n,Set(E=${EXTEN}) exten => 7210,n,Set(LOCATION=${HOTDESK_LOCATION(${E})}) ; definiramo novo funkcijo HOTDESK_LOCATION(), ki iz baze prebere lokacijo, kjer je član prijavljen, glede na svojo razširitev. [LOCATION] prefix=hotdesk dsn=asterisk read=select location FROM ast_hotdesk WHERE extension= '${ARG1}' Najprej definiramo razširitev vodje laboratorija, ki je 7210. Do vodje laboratorija mora biti klic vzpostavljen v vsakem primeru, kar pomeni, da je dosegljiv na lokaciji, kjer je prijavljen oziroma na lastnem telefonu, če ni prijavljen nikjer. exten => 7210,n,GotoIf($[${ISNULL(${LOCATION})}]?6) exten => 7210,n,Dial(SIP/${LOCATION},30) exten => 7210,n,Dial(${Brezocnik},30) exten => 7210,n,Hangup() Drugače je za druge člane LMS. Do teh mora biti klic vzpostavljen na več načinov. Če pride klic od zaposlenega na FERI, ki ni član LMS, se klic do člana LMS izvede, samo če je prijavljen na svojem telefonu. Če ni prijavljen, klicatelja opozorimo, da številka trenutno ni dosegljiva. Če je dohodni klic enega izmed članov LMS, se klic izvede na lokacijo, kjer je prijavljen, oziroma se klicatelja opozori, če ni prijavljen nikjer. Za dohodne klice drugih zaposlenih na TF velja, da se klic izvede le na domač terminal. exten => 7208,1,NoOp() exten => 7208,n,Set(E=${EXTEN})

Razvoj telefonske aplikacije v Asterisku Stran 34 exten => 7208,n,GotoIf($[${CONTEXT}=FERI_others]?5) ; klic iz konteksta, imenovanega FERI_others (ta kontekst definiramo v datoteki sip.conf zraven tvorjenega uporabnika, ki ni član LMS, vendar je zaposlen na FERI, prav tako ga, kot bomo videli kasneje, definiramo v klicnem načrtu). Če pride takšen klic do enega izmed članov LMS, preidemo na korak 5, iz katerega preskočimo v makro others, drugače preidemo na naslednji korak oziroma v makro LMS. Spremenljivka CONTEXT [2] je v Asterisku rezervirana spremenljivka, ki podaja ime trenutnega konteksta. Tako se bo klic, ki bo prišel od drugih zaposlenih na FERI, začel v kontekstu FERI_others, kjer pa bomo vključili kontekste, na katere se bo ta klic lahko izvedel. exten => 7208,n,Macro(LMS) exten => 7208,n,Macro(others) exten => 7208,n,GotoIf($[${LOCATION}=G_218_Kovse]?8) ; če ugotovimo, da je lokacija, na kateri je član trenutno prijavljen, enaka domači lokaciji, preidemo na korak 8, kjer kličemo na domač terminal, če ne, preidemo v makro not_available: exten => 7208,n,Macro(not_available) exten => 7208,n,Dial(${Kovse},30) Člane laboratorija pa lahko prikličejo tudi drugi zaposleni na TF. exten => _220XXXX,1,NoOp() exten => _220XXXX,n,Set(E=${EXTEN:3}) ; ker drugi zaposleni na TF ne morejo priklicati članov LMS oziroma zaposlenih na FERI kar po internih številkah, prikličejo jih lahko z dodatkom številke 220 k interni številki, odrežemo prva tri števila celotne telefonske številke, tako da nam preostane samo interna številka člana LMS. exten => _220XXXX,n,GotoIf($[${E}=7210]?${E},6) ; če je dobljena spremenljivka E enaka 7210, torej enaka interni številki vodje laboratorija LMS, preidemo na to razširitev in na prioriteto številka 6, kjer se ne zgodi nič drugega kot klic na domač telefon vodje laboratorija LMS.

Razvoj telefonske aplikacije v Asterisku Stran 35 exten => _220XXXX,n,Goto(${E},8) ; podobno je za druge člane LMS. Če dobljena spremenljivka ni enaka vodji laboratorija, je enaka kateremu drugemu članu LMS. Tako preidemo na željeno interno številko, na prioriteto številka 8, kjer prav tako poizkuša nekdo iz konteksta external priklicati člana LMS na domač telefon. exten => logged_out,1,noop() exten => logged_out,n,playback(silence/1&hotdesk/ni_prijavljen) exten => logged_out,n,hangup() exten => i,1,noop() exten => i,n,playback(silence/2&hotdesk/ne_morete_klicati) exten => i,n,hangup() include => calls_feri include => calls_tf [macro-lms] exten => s,1,noop() exten => s,n,set(location=${hotdesk_location(${e})}) exten => s,n,gotoif($[${isnull(${location})}]?lms,logged_out,1) ; če je lokacija nič oziroma član ni prijavljen, preidemo nazaj na kontekst LMS, na razširitev logged_out, na prioriteto številka 1 in klicatelja opozorimo, da član trenutno ni prijavljen. Če je član prijavljen, ga lahko pokličemo na trenutno lokacijo. exten => s,n,dial(sip/${location},30) exten => s,n,gotoif($[»${dialstatus}«=»busy«]?7) exten => s,n,macro(not_available) exten => s,n,congestion() [macro-others] exten => s,1,noop()

Razvoj telefonske aplikacije v Asterisku Stran 36 exten => s,n,set(location=${hotdesk_location(${e})}) exten => s,n,gotoif($[${isnull(${location})}]?5) ; če član ni prijavljen, preidemo na korak 5 oziroma na makro not_available, kjer klicatelja, zaposlenega na FERI, opozorimo, da številka trenutno ni dosegljiva. exten => s,n,goto(lms,${e},6) ; če je član prijavljen, preidemo nazaj na kontekst LMS, razširitev, katero klicatelj kliče, na prioriteto 6. exten => s,n,macro(not_available) ; kličemo makro z imenom not_available. [macro-not_available] V tem makru predvajamo zvočni posnetek "Številka trenutno ni dosegljiva!". exten => s,1,noop() exten => s,n,playback(hotdesk/ni_dosegljiva) exten => s,n,hangup() Enak postopek velja za vse druge člane LMS. Definiramo makro za klice znotraj FERI. Člani laboratorija LMS lahko kličejo po vsem FERI z interno številko. Drugi zaposleni FERI so v datoteki sip.conf konfigurirani kot interna številka. [macro-calls_feri] exten => s,1,dial(sip/${e}) [calls_feri] exten => _7[0-1]XX,1,Set(E=${EXTEN}) ; nastavimo spremenljivko E, ki pove, katero številko je klical klicatelj, in preskočimo na makro calls_feri, kjer to številko z aplikacijo Dial() prikličemo. Enako velja za vse številke drugih zaposlenih na FERI, ki pa so od 7000 do 7299, vendar ne enake številkam članov LMS. exten => _7[0-1]XX,n,Macro(calls_FERI)

Razvoj telefonske aplikacije v Asterisku Stran 37 exten => _720[0-7],1,Set(E=${EXTEN}) exten => _720[0-7],n,Macro(calls_FERI) exten => 7209,1,Set(E=${EXTEN}) exten => 7209,n,Macro(calls_FERI) exten => 7211,1,Set(E=${EXTEN}) exten => 7211,n,Macro(calls_FERI) exten => 7216,1,Set(E=${EXTEN}) exten => 7216,n,Macro(calls_FERI) exten => _721[8-9],1,Set(E=${EXTEN}) exten => _721[8-9],n,Macro(calls_FERI) exten => _72[2-5]X,1,Set(E=${EXTEN}) exten => _72[2-5]X,n,Macro(calls_FERI) exten => _726[0-6],1,Set(E=${EXTEN}) exten => _726[0-6],n,Macro(calls_FERI) exten => 7269,1,Set(E=${EXTEN}) exten => 7269,n,Macro(calls_FERI) exten => _72[7-9]X,1,Set(E=${EXTEN}) exten => _72[7-9]X,n,Macro(calls_FERI) exten => i,1,noop() exten => i,n,playback(silence/2&hotdesk/ne_morete_klicati) exten => i,n,hangup() include => calls_tf Definiramo kontekst, ki bo ujel vsak klic s terminala, ki je član konteksta FERI_others. [FERI_others] include => LMS

Razvoj telefonske aplikacije v Asterisku Stran 38 ; vključimo kontekst LMS. Ponovno definiramo nov kontekst. Člani laboratorija lahko kličejo tudi vse druge zaposlene na TF, katerih številke se začnejo z 220. Tako druge zaposlene na TF definiramo s celotno številko, kot na primer 2206534. [calls_tf] exten => _220XXXX,1,NoOp() exten => _220XXXX,n,Set(E=${EXTEN}) exten => _220XXXX,n,Dial(SIP/${E}) exten => i,1,noop() exten => i,n,playback(silence/2&hotdesk/ne_morete_klicati) exten => i,n,hangup() include => LMS [external] include => LMS ; kontekst, ki ujame vsak klic s terminala, ki je član konteksta external. Tako lahko ugotovimo, iz katerega konteksta pride klic in glede na to nastavimo določene akcije. 4.7 Snemanje zvočnih posnetkov Za potrebe aplikacije moramo posneti nekaj zvočnih posnetkov, ki bodo uporabnika vodili skozi celoten postopek prijave/odjave, klicev in podobnega. Kakovostne zvočne posnetke smo posneli kar s terminalom preko nekaj dodatnih vrstic v klicnem načrtu. exten => _66XX,1,Wait(2) exten => _66XX,n,Record(/tmp/prompt${EXTEN:2}:wav) exten => _66XX,n,Wait(1) exten => _66XX,n,Playback(/tmp/prompt${EXTEN:2}) exten => _66XX,n,Wait(2)

Razvoj telefonske aplikacije v Asterisku Stran 39 exten => _66XX,n,Hangup() Vse, kar ta del kode omogoča, je, da lahko s klicem na številke od 6600 do 6699 posnamemo svoje posnetke, ki jih Asterisk shrani v datoteko /tmp in vsakega poimenuje od prompt00.wav do prompt99.wav. Kasneje lahko te posnetke preimenujemo in jih obvezno premaknemo v privzet direktorij za zvočne posnetke Asteriska /var/lib/asterisk/sounds. Za večjo preglednost smo ustvarili dodatno datoteko z imenom /hotdesk, kar pomeni, da bomo uporabljali posnetke, shranjene v /var/lib/asterisk/sounds/hotdesk. Vsakič ko želimo uporabiti določen zvočni posnetek, to storimo, tako da primerni aplikaciji v klicnem načrtu dodamo pot do posnetka, ki je v našem primeru hotdesk/ime_posnetka. Posneli smo sledeče: vnesite_pin.wav: "Vnesite pin." napacen_pin.wav: "Napačen pin." uspesna_prijava.wav: "Prijava je bila uspešna." napacno_stevilo.wav: "Vnesli ste napačno število." uspesna_odjava.wav: "Odjava uspela." neuspesna_prijava.wav: "Prijava ni bila uspešna." napaka.wav: "Napaka." ne_obstaja.wav : "Ta številka ne obstaja." niste_prijavljeni.wav: "Niste prijavljeni." ni_dosegljiva.wav: "Številka trenutno ni dosegljiva." ni_prijavljen.wav : "Uporabnik ni prijavljen." ne_morete_klicati.wav : "Te številke ne morete klicati." prijava_odjava.wav : "Če želite še naprej biti prijavljeni, pritisnite 1, če se želite odjaviti, pritisnite 2."

Razvoj telefonske aplikacije v Asterisku Stran 40 5. PRIMERI DELOVANJA APLIKACIJE S primeri bomo prikazali delovanje aplikacije. To bomo storili tako, da bomo prikazali posnetke iz Asteriskove konzole. Prikazali bomo vse od prijave člana, napačnega vnosa prijavne številke, napačnega vnosa PIN-kode do klicev znotraj FERI in do drugih zaposlenih na TF. 5.1 Prijava/odjava člana Terminal, ki ga ima član v svojem kabinetu oziroma laboratoriju, je predstavljen z imenom le-tega. Prijava poteka, tako da član vtipka zadnje tri cifre svoje interne številke. Aplikacija od člana zahteva vnos PIN-kode, ki mu jo določi administrator. Ob pravilno vneseni kodi dobimo izpis, prikazan na sliki 5.1. Slika 5.1: Uspešna prijava Iz slike in prvih šest prioritet razširitve hotdesk je razvidno, da je aplikacijo uporabil član s prijavno številko 210. Ob vnosu prijavne številke aplikacija preveri, ali član s to prijavno številko obstaja v bazi. Tako je v tretjem in četrtem koraku razvidno, da član s to prijavno številko obstaja, saj je aplikacija iz baze prebrala njegov status in njegovo PIN-kodo.

Razvoj telefonske aplikacije v Asterisku Stran 41 Naprej preide na razširitev login, kjer člana opozori, da mora vnesti svojo PIN-kodo. V našem primeru se v vrstici 16 lepo vidi, da jo je vnesel pravilno. Ob pravilno vneseni kodi aplikacija preveri, ali je član že od prej prijavljen, kar je razvidno v tretji prioriteti razširitve valid_login. Ker v našem primeru član ni prijavljen, preverimo v četrti prioriteti po vrsti, s katere lokacije kliče in to zapišemo v bazo. Prav tako spremenimo status člana na 1, kar pomeni, da je prijavljen. Nazadnje članu predvajamo posnetek, ki ga obvesti, da se je uspešno prijavil. Če se član zmoti in vtipka neobstoječo prijavno številko, ga na to aplikacija opozori. Na sliki 5.2 vidimo, da je član v prioriteti številka dve vnesel neobstoječo prijavno številko, 251. V naslednjih dveh vrsticah opazimo, da želi aplikacija preveriti status in PIN-kodo tega člana, vendar teh podatkov iz baze ne uspe dobiti, saj ne obstajajo. Tako člana z zvočnim posnetkom opozori, da ta prijavna številka ne obstaja. Slika 5.2: Vnos neobstoječe prijavne številke Član lahko največ trikrat vnese napravilno PIN-kodo. Ob vsakem nepravilnem poizkusu ga na to opozorimo. Ko to stori tudi tretjič, člana obvestimo, da prijava ni uspela. Na sliki 5.3 vidimo v vrstici šestnajst, da je član s prijavno številko 208 vnesel namesto svoje PINkode, ki je 777, 555. Ker je vnesel napačno PIN-kodo, ga v prioriteti številka osem razširitve login z zvočnim posnetkom opozorimo na napačno vneseno PIN-kodo in mu ponudimo ponoven vnos. Tako je iz vrstice sedemindvajset možno razbrati, da je član v drugem poizkusu pravilno vnesel svojo kodo. V bazo aplikacija zapiše status in lokacijo, kjer se je ta član prijavil in člana obvesti, da je bila prijava uspešna.

Razvoj telefonske aplikacije v Asterisku Stran 42 Slika 5.3: Vnos napačne PIN-kode Če je član prijavljen na določeni lokaciji in se želi s te lokacije odjaviti, ga aplikacija vpraša, ali želi še naprej biti prijavljen ali naj ga odjavi. Za odjavo mora pritisniti 2, če želi ostati prijavljen, pa 1. Tako lahko na sliki 5.4 v prioriteti številka tri razširitve valid_login vidimo, da je član s prijavno številko 210 bil prijavljen že od prej. Aplikacija najprej preveri v prioriteti sedem, ali je lokacija, s katere član kliče, enaka lokaciji, na kateri je bil nazadnje prijavljen. Ker se lokaciji ujemata, kar je razvidno iz enajste prioritete razširitve valid_login, kjer je število 1 pred vprašajem, kar pomeni resničnost izraza, preidemo na prioriteto trinajst, kjer aplikacija od člana zahteva vnos števila 1 za ohranitev prijave oziroma števila 2 za odjavo. V tem primeru je član izbral opcijo 1. Ker se s tem vnosom v bazi nič ne spremeni, člana obvesti, da je bila prijava uspešna in prekine trenutno sejo.

Razvoj telefonske aplikacije v Asterisku Stran 43 Slika 5.4: Vnos števila 1 za ohranitev prijave Podobno velja za izbiro števila 2, oziroma odjavo člana, kar ponazarja slika 5.5. Tudi tukaj je na prvem mestu vnos PIN-kode. Ob pravilnem vnosu aplikacija ugotovi, da član kliče z iste lokacije, kjer je bil že od prej prijavljen. Član, v tem primeru je to tisti s prijavno številko 210, vnese število 2, kar pomeni, da se želi odjaviti. Ob vnosu preide aplikacija na novo razširitev, imenovano logout, kjer v drugi vrstici te razširitve nastavi status kličoče prijavne številke na 0, kar pomeni, da je član odjavljen. Obvesti ga, da je bila odjava uspešna in prekine sejo.

Razvoj telefonske aplikacije v Asterisku Stran 44 Slika 5.5: Vnos števila 2 za odjavo Člana, ki se pozabi odjaviti, preden zapusti določeno lokacijo, in se želi prijaviti na novi lokaciji, aplikacija na stari lokaciji odjavi in prijavi na novi. Na sliki 5.6 vidimo, da se v prioriteti številka enajst razširitve valid_login lokaciji ne ujemata. Torej se je klicatelj pozabil odjaviti, ko je odšel z določene lokacije. Ko aplikacija to ugotovi, preide na prioriteto številka osem iste razširitve in nastavi za kličočo prijavno številko novo lokacijo. Člana obvesti, da se je uspešno prijavil in prekine sejo.

Razvoj telefonske aplikacije v Asterisku Stran 45 Slika 5.6: Odjava/prijava 5.2 Primeri klicev Če član ni prijavljen, ne more opravljati izhodnih klicev. Tak primer ponazarja slika 5.7. V prioriteti številka štiri je opaziti, da je spremenljivka WHO prazna, kar pomeni, da kličoči član ni prijavljen. Če spremenljivka WHO iz baze ne dobi vrednosti prijavne številke, ki jo po definiciji zahteva, preide s pomočjo aplikacije GotoIf na razširitev not_logged_in. Ta članu v drugi vrstici predvaja zvočni posnetek, da ni prijavljen. Tako aplikacija članu, ki ni prijavljen, ne omogoča opravljanja izhodnih klicev.

Razvoj telefonske aplikacije v Asterisku Stran 46 Slika 5.7: Član klicatelj ni prijavljen Primer, ko je član klicatelj prijavljen, vendar klicani član ni prijavljen, predstavlja slika 5.8. Slika 5.8 : Klicani član ni prijavljen

Razvoj telefonske aplikacije v Asterisku Stran 47 Član z interno številko 7210 kliče na interno številko 7213. V prvih devetih vrsticah aplikacija izpiše podatke o klicatelju in preide v kontekst calls_tf, ki je članu določen s konfiguracijo baze. Ker pa klicatelj ne opravlja klica v sklopu tega konteksta, je v tem kontekstu vključen kontekst LMS, ki pa omogoča klice znotraj laboratorija. Tako pridemo v prioriteto številka štiri, ki skoči v makro, imenovan LMS, kateri preveri, kje se klicani član nahaja. Ker, kot se vidi v prioriteti številka dve makra LMS, aplikacija ni uspela iz baze pridobiti spremenljivke LOCATION, preide na razširitev logged_out. To pomeni, da član, ki je bil klican, ni prijavljen na nobeni lokaciji. Klicatelju predvaja posnetek o nedosegljivosti uporabnika in prekine sejo. Naslednji primer je primer klica med dvema članoma LMS. Takšno situacijo predstavlja slika 5.9. Član z interno številko 7210 kliče na interno številko 7213. Tako tudi v tem primeru aplikacija najprej izpiše podatke o klicatelju in preide v klicateljev privzeti kontekst. V tretji prioriteti najprej preveri, ali je klic zunanji. Ker ni, preide v makro, imenovan LMS. Najprej v drugi prioriteti preveri lokacijo klicanega, v tretji preveri, ali je morda član odjavljen in nato prikliče lokacijo člana. V tem primeru je to G_1102. Slika 5.9 : Klic med članoma LMS

Razvoj telefonske aplikacije v Asterisku Stran 48 Primer klica, ko člana LMS kliče drug zaposlen na FERI, je ponazorjen na sliki 5.10. Član je prijavljen na svoji lokaciji. Klic je izveden s številke 7277 na številko 7215. Drugi zaposleni na FERI vstopijo v klicni načrt v kontekstu, imenovanem FERI_others, ki vključuje kontekst LMS. Tako aplikacija ugotovi, da prihaja klic od zunaj. V tretji prioriteti konteksta FERI_others aplikacija ugotovi, da je prišel klic s strani drugih zaposlenih na FERI. Po tej ugotovitvi skoči v makro, imenovan others, kjer ugotovi, ali je član sploh prijavljen (druga prioriteta makra others). Ker je aplikacija ugotovila, da je član prijavljen, izstopi iz makra in preide nazaj v kontekst LMS na razširitev, ki je enaka klicani številki, na prioriteto šest. To prikazuje četrta vrstica makra others. V naslednjem koraku preveri, ali je lokacija člana enaka njegovi domači lokaciji. Ob tej pozitivni ugotovitvi prikliče to lokacijo, ki je v tem primeru G_203_Meolic. Slika 5.10 : Klic člana s strani drugih zaposlenih na FERI Če član ni prijavljen na svoji lokaciji, je prijavljen kje drugje oziroma sploh ni prijavljen, in kliče drug zaposlen na FERI, se le-temu javi, da številka trenutno ni dosegljiva. Izjema je vodja laboratorija, do katerega se klic izvede v vsakem primeru, na lokacijo, kjer je prijavljen oziroma na domačo lokacijo, če ni prijavljen nikjer. Takšna primera predstavljata sliki 5.11 in 5.12. Na sliki 5.11 je možno videti, da je aplikacija odkrila, da klicani član ni prijavljen na svojem terminalu. To ponazarja šesta prioriteta konteksta LMS in razširitev, ki je v tem

Razvoj telefonske aplikacije v Asterisku Stran 49 primeru enaka klicani številki, 7215. Takoj zatem skoči aplikacija v makro, imenovan not_available. Ta javi klicatelju, zaposlenemu na FERI, ki ni član LMS, da številka trenutno ni dosegljiva. Slika 5.11 : Član ni prijavljen na svojem terminalu Do vodje laboratorija se klic izvede v vsakem primeru. Tako je na sliki 5.12, v tretji prioriteti, možno videti, da vodja ni prijavljen na nobeni lokaciji. V takšni situaciji izvedemo klic na domači telefon vodje laboratorija, kar prikazuje prioriteta, označena s številko šest. Tako je klic izveden na G2_3N_52. Slika 5.12 : Klic vodje laboratorija s strani drugih zaposlenih FERI Predstavimo še klic, ki pride s strani drugih zaposlenih na TF. Ta vstopi v klicni načrt v kontekstu external. Slika 5.13 prikazuje tak klic. Takšen klic se v vsakem primeru izvede le na domač terminal člana LMS. Tako je iz priložene slike možno videti, da je nekdo z

Razvoj telefonske aplikacije v Asterisku Stran 50 drugih tehniških fakultet klical številko 2207208. Tej številki je aplikacija "odrezala" prve tri števke. Tako je preskočila na to klicano razširitev in iz prioritete številka štiri skoči na številko osem, kjer se izvede klic na domač terminal. V tem primeru je to G_218_Kovse. Slika 5.13 : Zunanji klic Člani LMS lahko kličejo vse druge zaposlene na FERI, ki niso člani LMS, kakor tudi vse druge zaposlene na preostalih TF. Na sliki 5.14 vidimo primer klica, ko član, kot se vidi iz podatkov o klicatelju v prvih devetih prioritetah, Robert Meolic, kliče na številko 7277. Tako v deveti prioriteti konteksta hotdesk aplikacija preide v privzeti kontekst člana klicatelja, ki je v tem primeru calls_feri. V drugi prioriteti tega konteksta vstopi v makro calls_feri, kjer se vzpostavi seja do kličočega. Slika 5.14: Klic člana do zaposlenega na FERI

Razvoj telefonske aplikacije v Asterisku Stran 51 Nazadnje vidimo na sliki 5.15 klic člana Tima Kovšeta na številko 2208000, kar pomeni klic do zaposlenega na eni od preostalih TF. Aplikacija podobno kot v prejšnjem primeru preide v deveti prioriteti konteksta hotdesk v privzet kontekst člana, calls_feri. Ker pa v tem primeru klic ni namenjen številki, ki bi bila v sklopu tega konteksta, je v kontekst calls_feri vključen kontekst calls_tf, ki članu omogoča klice tudi do preostalih zaposlenih na TF. Tako je klic v resnici v kontekstu calls_tf, vendar Asteriskova konzola izpisuje ime privzetega konteksta. Tukaj aplikacija pod spremenljivko E, druga prioriteta, izpiše številko kličočega in s pomočjo aplikacije Dial, tretja prioriteta, prikliče to številko. Slika 5.15: Član kliče zaposlenega na drugi TF