2012/4 – 6. 1. 2012
Pokročilé služby v podnikové komunikaci Martin Mikulec1, Miroslav Vozňák1 1
Fakulta elektrotechniky a informatiky VŠB – Technická univerzita Ostrava
Email: { martin.mikulec.st1,miroslav.voznak}@vsb.cz
Abstrakt – Článek se zabývá implementací pokročilých služeb v softvérové IP pobočkové ústředně Asterisk. Pokročilé služby vzniknou vzájemnou integrací hlasových služeb pobočkové ústředny s dalšími informačními a komunikačními systémy. Propojením Asterisku, XMPP serveru a kalendáře je možné kontrolovat dostupnost uživatelů a na základě jejich stavů měnit chování ústředny. Vzájemnou interoperabilitou bylo dosaženo pokročilých služeb jako automatického směrování volání na základě dostupnosti volajícího účastníka v kalendáři nebo XMPP klienta, automatická změna stavu XMPP klienta v případě aktivního hovoru, přímé vytáčení účastníka bez znalosti telefonního čísla přímo z XMPP klienta, vzájemná komunikace s ústřednou v okně XMPP klienta, zápis detailu hovoru do kalendáře, nebo automatické upozornění na schůzku. Celý systém byl navrhnut jako open-source řešení, což ve spojení s virtuálním serverem zajišťuje snadnou reprodukovatelnost výsledků v praxi.
1 Úvod Jedním z klíčových systémů každé větší společnosti či firmy je komunikační server integrující obsluhu volání a související služby, který je znám pod označením pobočková ústředna (PBX). Z obyčejných přepojovacích zařízení se postupem času staly moderní komunikační centra s možností tyto hlasové služby integrovat do jiných informačních a komunikačních systémů. Těmto službám, které vzniknou integrací více systémů, se říká služby pokročilé. Jejich užívání přináší mnoho výhod po stránce zkvalitňování komunikace mezi uživateli. Přizpůsobuje chod ústředny dennímu režimu uživatelů nebo zlepšuje obsluhu zákazníků call centra, která jsou na pokročilých službách, jako je hlasový průvodce nebo propojení s vnitřním informačním systémem, postavena. Jako pobočková ústředna byl zvolen open-source SW PBX Asterisk. Asterisk podporuje nativně řadu signalizačních protokolů využívajících IP jako SIP, IAX, H.323, MGCP, ale po doplnění příslušných rozhraní lze provozovat i další jako SS7, DSS1 či QSIG [1]. Díky modularitě celého systému a intenzivnímu vývoji je možné Asterisk od verze 1.8 propojit s online kalendáři. Propojení s XMPP serverem bylo představeno už s verzí Asterisku 1.4. Elektronické online kalendáře zrychlují, usnadňují a zpřehledňují běžnou komunikaci ve firmě. Ve spojení s ústřednou získáváme nástroj pro směrování hovorů, upozorňování na události nebo pro jednoduchý záznam o provozu na ústředně. Velmi rychlou textovou komunikaci uživatelů s možností jejich online prezence umožňuje Instant Messaging neboli odesílání a přijímání zpráv v reálném čase. Na rozdíl od tele-
fonu nebo emailu druhá strana ví, zda je účastník k dispozici či nikoliv. Představitelem opensource řešení je standardizovaný protokol XMPP známý jako Jabber. Komunikace mezi XMPP serverem a Asteriskem přináší možnost nechat reagovat ústřednu na prezenci uživatele a naopak. Dále může ústředna posílat oznámení uživateli do okna XMPP klienta a reagovat na jeho textové odpovědi.
2 Návrh řešení a cíle Systém je realizován formou klient – server. Z důvodu reprodukovatelnosti byl zvolen virtuální server a opensource řešení služeb včetně operačního systému Ubuntu. Na klientské straně stál laptop s programy, využívajících služeb serveru. Na tomto laptopu byl zároveň server hostován. Cílem bylo provést instalaci operačního systému a jednotlivých komponent, jejich vzájemné propojení a naprogramování chování ústředny za účelem demonstrace nových funkcí a služeb. Tyto služby byly představeny jako samostatně tak i souhrnně v tzv. „prezenčním skriptu“.
3 Realizace Na server byl nasazen operační systém Ubuntu 10.04.1 Server Edition. Jako PBX byla zvolena nejnovější Asterisk 1.8 LTS. Dále opensource kalendářový systém Davical, XMPP server Openfire a aplikace pro převod hlasu na řeč Festival. Davical ke svému běhu vyžadoval dodatečnou instalaci PostgreSQL databázového serveru a Openfire běží v prostředí Javy (JRE – Java Runtime Environment) [5]. Na straně klientu figurovaly dva softwarové telefony X-lite , XMPP klienti Pidgin a Spark a nakonec kalendářový klient Sunbird.
4–1
Obrázek 1: Schéma zapojení
2012/4 – 6. 1. 2012 3.1 Asterisk a kalendáře Instalace Asterisku proběhla standardně kompilací ze zdrojových kódů, velkou výhodou verze 1.8 je předinstalační skript /contrib/scripts/install_prereq , který po spuštění prohledá a případně doplní závislosti a knihovny, které bude Asterisk ke svému běhu potřebovat [3]. Kompilace poté již probíhá zcela bezproblémově. Instalace kalendářového serveru Davical byla provedena běžně z balíčku [4]. Ke svému chodu vyžaduje PostgreSQL databázi. Po dokončení instalace a počáteční konfiguraci byl vytvořen na serveru online kalendář dostupný pod URL http://IP_SERVERU/caldav.php/user/home. K tomuto kalendáři lze přistupovat z jakéhokoliv kalendářového klienta podporující protokol CalDAV. Asterisk je schopen s kalendáři komunikovat od verze 1.8 vydané na podzim 2010. Obsahuje moduly pro podporu CalDAV, iCalendar a Microsoft Exchange servery. Aby mohl Asterisk z kalendáře číst a zapisovat do něj, je třeba nakonfigurovat soubor /etc/asterisk/calendar.conf a znovu načíst konfiguraci. Dále následovalo naprogramování chování systému obsahující jednak nastavení příslušných proměnných pro interakci s kalendářem, volání funkcí Asterisku a ošetření jednotlivých stavů komunikace. To vše je řízeno dialplanem uloženém v souboru extensions.conf. Níže uvedená část diaplanu v extensons.conf pravidelně kontroluje dostupnost pobočky 100 v nastaveném kalendáři. Pokud je uživatel dostupný (free), volá linku 101, pokud je nedostupný (busy), volá linku 102. exten =>100,1,GotoIf(${CALENDAR_BUSY(název_kalendáře)}?b usy:free) exten =>100,n(busy),Dial(SIP/102) exten =>100,n,Hangup() exten =>100,n(free),Dial(SIP/101) exten => 100,n,Hangup() Příklady logovacích výpisů z Asterisku pro všechny čísla poboček jsou dostupné ke stažení z odkazu https://liptel.vsb.cz/lib/exe/fetch.php?media=team:logs.zip . Rovněž je možné do kalendáře zapisovat, jako příklad posloužíi jednoduché logování hovorů. Po ukončení hovoru na pobočku se do kalendáře zapíše identifikace volajícího (CALLERID) a časový interval volaní (začátek, konec). Proměnná ${EPOCH} označuje aktuální UNIX-style epochu (číslo v sekundách od 1. ledna 1970). exten =>101,1,Set(start=${EPOCH}) exten =>101,n,Dial(SIP/101) exten => h,1,Set(end=${EPOCH}) exten =>h,n,Set(CALENDAR_WRITE(název_kalendáře,summary,s tart,end)=Volal $ {CALLERID(all)},${start},${end})
Řada komerčních komunikačních systémů umožňuje čtení záznamů událostí uložených v kalendáři, proto jsme se zaměřili rovněž na integraci této funkce, kterou lze zařadit mezi pokročilé služby. Nejdříve je nutné zvolit vhodnou aplikaci pro převod textu na řeč, v našem případě jsme použili aplikaci Festival [6], která je vyvíjena v Centru pro výzkum technologie řeči na University of Edinburgh a patří k mezi nejznámější volně šiřitelné TTS nástroje. Po vytočení pobočky 888 přehraje Asterisk do telefonu všechny události, které jsou naplánované na další hodinu. Mezi detaily, které je schopné číst [7], patří: název události (summary) úplný popis události (description) osoba, která událost organizuje (organizer) místo události (location) název kalendáře (calendar) jedinečný identifikátor události (uid) začátek události ve formátu unixtime (start) konec události ve formátu unixtime (end) Dostupnost (busystate) Seznam pozvaných účastníků (attendees) Níže uvádíme část skriptu, kterou jsme vytvořili v extension.conf. exten => 888,1,Answer exten => 888,n,Set(id=${CALENDAR_QUERY(jméno_kalendáře,${E POCH},$[${EPOCH} +24*60*60])}) exten =>888,n,Set(num=${CALENDAR_QUERY_RESULT(${id}, getnum)}) exten =>888,n,Set(i=1) exten =>888,n,Festival("Plan na dalsich 60 minut je nasledujici") exten =>888,n,Festival(Celkovypocetschuzek je ${num}) exten =>888,n,While($[${i} <=${num}]) exten =>888,n,Festival(schuzkacislo ${i} mazacatek) exten =>888,n,SayUnixTime(${CALENDAR_QUERY_RESULT($ {id},start,${i})},,Q 'digits/at' IMp) exten =>888,n,Festival(a konec je v) exten =>888,n,SayUnixTime(${CALENDAR_QUERY_RESULT($ {id},end,${i})},,IMp) exten =>888,n,Festival(mistoschuzky je: ${CALENDAR_QUERY_RESULT(${id},location,${i})}) exten =>888,n,Festival(Schuzka je zapsana v kalendari: ${CALENDAR_QUERY_RESULT(${id},calendar,${i})}) exten =>888,n,Festival(Obsah schuzky je: ${CALENDAR_QUERY_RESULT($ {id},summary,${i})}) exten =>888,n,Set(i=$[${i} + 1]) exten => 888,n,EndWhile Podobnou funkcí jako je CALENDAR_QUERY() je funkce CALENDAR_EVENT(). Tato funkce byla použita pro hlasové oznámení blížící se schůzky 10 minut před jejím začátkem.
4–2
2012/4 – 6. 1. 2012 Do dialplanu byl doplněn kontext calendar_event_notify a na něj je odkazováno v konfiguraci calendáře v calendar.conf. Opět uvádíme námi inkriminovanou část v extension.conf, která obsahuje výše popsané použití funkce CALENDAR_EVENT().
[calendar_event_notify] exten => s,1,Answer exten =>s,n,Festival(za 10 minut mate schuzku\, ktera se kona v ${CALENDAR_EVENT(location)}\, obsahem schuzky je${CALENDAR_EVENT(description)}\,nashledanou) exten =>s,n,Hangup Dodatek pod nakonfigurovanýkalendář v calendars.conf timeframe = 60 autoreminder = 10 channel = SIP/101 context = calendar_event_notify extension = s 3.2 Asterisk a XMPP server Openfire [2] je XMPP server poskytující služby v oblasti online komunikace. Je vyvíjen v programovacím jazyku Java, z tohoto důvodu je multiplatformní. Pracuje s otevřeným komunikačním protokolem XMPP, který je od roku 2004 standardem pro prezenci a online komunikaci podle IETF. Openfire obsahuje celou řadu doplňků, jedním z nich je právě doplněk Asterisk-IM pro komunikaci s Asteriskem. Spojení Openfire a Asterisku umožňuje kontrolovat, který uživatel právě hovoří a není tak plně dostupný k online komunikaci. Jeho stav XMPP klienta se během hovoru změní na „On Phone“, který odpovídá stavu „pryč“. Zároveň je možné uživateli Openfire severu přiřadit pobočku z Asterisku a tímto uživatele přímo volat z XMPP klientaSpark bez znalosti čísla přiřazené pobočky. Pokud se Asterisk přihlásí k XMPP serveru jako uživatel, je schopen číst stavy spřátelených účtů, psát jim zprávy a přijímat jejich odpovědi. Na základě těchto funkcí může přizpůsobovat své chování. Vzájemné propojení Asterisku s Openfire serverem probíhá přes AMI (Asterisk Manager Interface). Na straně Asterisku je třeba přístup povolit a vytvořený účet nastavit do Asterisk-IM modulu na Openfire serveru. Zde je také nastaveno přiřazení čísla pobočky každému z uživatelů. Dále je třeba přihlásit Asterisk k XMPP serveru jako uživatele. Nastavení se provádí v souboru /etc/asterisk/jabber.conf, kde nastavíme běžné údaje k přihlášení k XMPP serveru jako adresa XMPP serveru, port, status, apod. Důležitá je položka buddy, která určuje spřátelené účty, které bude Asterisk žádat o autorizaci a které bude poté schopen sledovat. Typickým využitím je informování uživatele o příchozím hovoru v okně XMPP klienta a následné směrování hovoru na základě jeho odpovědi také v tomto okně. Uvedeme si opět část konfigurace, kterou jsme použili. exten => 333,1,Answer(); exten =>333,n, JabberSend(asterisk,alice@IP_SERVERU,Prichozi hovor od uzivatele ${CALLERID(name)}, vyber cilovou pobočku);
exten =>333,n, JabberSend(asterisk,alice@IP_SERVERU,1 :posli na 101); exten =>333,n, JabberSend(asterisk,alice@IP_SERVERU,2 :posli na 102); exten => 333,n, Set(OPTION=$ {JABBER_RECEIVE(asterisk,alice@ IP_SERVERU)}); exten => 333,n, GotoIf($[${OPTION} = 1]?10:20) exten => 333,10, JabberSend(asterisk,alice@IP_SERVERU, (Calling101...); exten => 333,n, Dial(SIP/101); exten => 333,20, JabberSend(asterisk,alice@IP_SERVERU, (Calling102...); exten => 333,n, Dial(SIP/102); Další zajímavou funkcí je směrování hovoru na základě aktuálně nastaveného stavu v XMPP klientu. Stavy, které XMPP server používá jsou následující: 1. Přítomen 2. Volný k hovoru (Free to chat) 3. Pryč 4. Pryč na dlouho 5. Nerušit 6. Offline 7. Odhlášen Celkem tedy máme 7 stavů, podle kterých můžeme měnit chování ústředny. Příkladem je jednoduchý skript, který rozlišuje, zdali je uživatel online (stav 1-5) nebo offline (stav 6-7) a podle toho směruje hovor buďto přímo na uživatele nebo do hlasové schránky. O tomto faktu informuje volajícího do okna XMPP klienta. exten =>555,1,Set(STATUS=$ {JABBER_STATUS(asterisk,alice@IP_SERVERU)}); exten => 555,2,gotoif($[$[${STATUS}] < 6]?3:10) exten=>555,3,Dial(SIP/101) exten => 555,10,jabbersend(asterisk,$ {CALLERID(name)}@IP_SERVERU, .Ahoj,${CALLERID(name)}, volana pobočka ${EXTEN} nenidostupna! Smeruji do hlasoveschranky.) exten => 555,11(unavailable),Dial(SIP/102) 3.3 Prezenční skript Jako souhrn většiny funkcí byl vytvořen prezenční skript. Cílem tohoto skriptu je směrovat hovor na základě stavu v kalendáři, XMPP klientu a podle reakce uživatele v okně XMPP klienta. Skript funguje následovně. Uživatel Bob má veřejnou pobočku pro celou kancelář, svoji privátní linku, voicemailovou schránku a asistentku Alici, která má také svou privátní linku. Asterisk sleduje Bobův stav v kalendáři a XMPP klientu. Pokud nemá žádnou schůzku v kalendáři (stav free) a je online, dostane zprávu do okna XMPP klienta o tom, že mu volá konkrétní uživatel a on má možnost tento hovor akceptovat nebo předat na asistentku. Pokud hovor příjme, má 30s na vyzvednutí hovoru, jinak hovor skončí v hlasové schránce. Pokud není Bob dostupný díky kalendáři nebo XMPP klientu, hovor je směrován na Alici na její privátní pobočku. U Alice
4–3
2012/4 – 6. 1. 2012 se zjišťuje, zdali je přítomna v práci (je online v XMPP klientu). Pokud ano, zvoní je telefon a má 30s na vyzvednutí hovoru, jinak hovor končí Bobovi v hlasové schránce. Kompletní schéma chování prezenčního skriptu dle výše uvedeného popisu je zobrazeno na obr. 2. BOB Kalendář dostupný?
ALICE Ne
Ano Ne XMPP online?
Ne
Ano XMPP zpráva přijmout hovor? Ano
Vyzvánění 30s Přijetí hovoru
J
XMPP online? Ano
Ne
XMPP zpráva přijmout hovor? Ano
Ne
Vyzvánění 30s
Ne
Ne
HLASOVÁ SCHRÁNKA
exten =>201,n(busy),Set(STATUS=${JABBER_STATUS(asterisk,a lice@IP_SERVERU)}); exten => 201,n,gotoif($[$[${STATUS}] < 7]?105:200) exten => 201,105,JabberSend(asterisk,alice@IP_SERVERU,Bob je nedostupny,prichozi hovor od uzivatele ${CALLERID(name)},vybercilovou pobočku:); exten => 201,106, JabberSend(asterisk,alice@IP_SERVERU,1: prevezmi hovor (101)); exten => 201,107, JabberSend(asterisk,alice@IP_SERVERU,2: posli na do hlasoveschranky Boba); exten => 201,108, Set(OPTION=${JABBER_RECEIVE(asterisk,alice@IP_SER VERU)}); exten => 201,109, GotoIf($[${OPTION} = 2]?200:110) exten => 201,110, JabberSend(asterisk,alice@IP_SERVERU,(Volam101...); exten => 201,n, Dial(SIP/101,30); exten =>201,n, Hangup(); exten => 201,200, VoiceMail(6001@mailbox-102) exten =>201,n,Hangup();
4 Závěr
Přijetí hovoru
J
Obrázek 2: Schéma chování prezenčního skriptu Níže následuje výpis inkriminované části direktiv a volání funkcí ve skriptu v extensions.conf. exten => 201,1,GotoIf(${CALENDAR_BUSY(asterisk)}?busy:free) exten =>201,n(free),Set(STATUS=${JABBER_STATUS(asterisk,b ob@IP_SERVERU)}); exten => 201,n,gotoif($[$[${STATUS}] < 7]?5:busy) exten => 201,5,JabberSend(asterisk,bob@IP_SERVERU,Prichozi hovor oduzivatele${CALLERID(name)}, vyber cilovou pobočku); exten =>201,n, JabberSend(asterisk,bob@IP_SERVERU,1 :prevezmi hovor (102)); exten =>201,n, JabberSend(asterisk,bob@IP_SERVERU,2 :posli na Alici 101); exten => 201,n, Set(OPTION=${JABBER_RECEIVE(asterisk,bob@IP_SER VERU)}); exten =>201,n, GotoIf($[${OPTION} = 2]?busy:10) exten => 201,10, JabberSend(asterisk,bob@IP_SERVERU,(Volam102...); exten => 201,n, Dial(SIP/102,30); exten =>201,n, VoiceMail(6001@mailbox-102) exten =>201,n, Hangup();
Článek seznamuje čtenáře s pokročilými službami, které jsou realizovány na SW IP pobočkové ústředně Asterisk ve spojení s online kalendáři a XMPP serverem. Integrací hlasových služeb do již používaných informačních systémů lze docílit rychlejší a kvalitnější komunikace jak uvnitř společnosti tak i společnosti se svými klienty. Jak jsme si ukázali, propojení PBX s kalendářem a systémem pro sledování presence nám umožní obsluhovat směrování příchozích hovorů pro daného uživatele na základě jeho aktuálního stavu. Celé řešení bylo realizováno na virtuálním serveru a pomocí opensource řešení. Výstupem je sada ověřených scénářů a odladěných nastavení, které zajišťují plnou funkcionalitu a interoperabilitu použitých komponent s Asteriskem. Integrací uvedených systémů byly realizovány následující pokročilé služby: Automatická změna stavu XMPP klienta na On Phone, pokud má uživatel aktivní hovor na pobočce Asterisku, kterou má provázanou s XMPP účtem. Tímto způsobem jsou ostatní spolupracovníci upozorněni, že daný uživatel momentálně není plně dostupný. Přímé volání účastníka bez znalosti jeho telefonního čísla. V XMPP klientu Spark je možné, pokud má uživatel v systému přidělenou pobočku, přímo volat daného účastníka. Po zvolení tlačítka volat ústředna nejprve zavolá volajícímu a po vyzvednutí hovoru dochází ke spojení s požadovanou pobočkou. Směrování hovoru na pobočku určenou odpovědí uživatele v okně XMPP klienta. Uživatel je v okně obeznámen, že má příchozí hovor a je mu nabídnuta možnost volby směrování na cílové pobočky. Na základě jeho číselné odpovědi je hovor směrován na jednu z nabízených poboček. Směrování hovoru na základě stavu nastaveného u XMPP klienta. Protokol XMPP je schopen nastavit až 7 různých
4–4
2012/4 – 6. 1. 2012 stavů. Dle těchto stavů se mění chování Asterisku a hovory se směrují na různé linky. Směrování hovoru na základě stavu nastaveného u události v online kalendáři. Asterisk pravidelně kontroluje dostupnost uživatele v kalendáři (stav volno nebo zaneprázdněn) a podle toho směruje volání na různé pobočky. Zápis detailů o hovoru do kalendáře. Po skončení hovoru je do zvoleného kalendáře automaticky zapsán čas počátku a konce hovoru a jména účastníků, kteří spolu komunikovali. Automatické upozornění na schůzku. Asterisk nastavený čas před schůzkou zavolá uživateli a přečte mu detaily, které má zapsané u události v kalendáři. Souhrn schůzek na následující hodinu. Po zavolání na specifickou pobočku Asterisk přečte události, které má uživatel zapsány na následující hodinu. Prezenční skript, který je souhrnem výše uvedených funkcí. Jedná se o modelovou situaci vedoucího, který má asistentku. Pokud přichází hovor na vedoucího, Asterisk zkontroluje jeho stav v kalendáři a XMPP klientu. Pokud je dostupný, příjde mu zpráva o příchozím hovoru a může se rozhodnout, zda-li hovor příjme. Pokud není jakákoliv podmínka splněna, hovor přechází na asistentku, zkontroluje se její stav v XMPP klientu, a hovor je směrován buď na ni nebo do hlasové schránky.
Poděkování Na tomto místě patří poděkování projektu č. 218086 FP7 EU, který je řešen na Katedře telekomunikační techniky FEI VŠB – Technické univerzity v Ostravě.
Literatura [1]
VOZŇÁK, M. Voice over IP.Vyd. 1. Ostrava : VŠB-TU Ostrava, 2008. 176 s. ISBN 978-80-248-1828-3.
[2]
SHARMA, Mayank. Openfire Administration.Vyd. 1. Birmingham :Packt Publishing Ltd,2008. 233 s. ISBN 978-1-847195-26-5.
[3]
Wiki.asterisk.org[online]. 2010 [cit. 2011-03-24]. Asterisk 1.8 Documentation. Dostupné zWWW:
.
[4]
Wiki.davical.org[online]. 2011 [cit. 2011-03-24]. Ubuntu/Lucid. Dostupné z WWW:.
[5]
Www.ubuntugeek.com[online]. 2010 [cit. 2011-03-24]. Howto install Sun Java RuntimeEnvironment (JRE) in Ubuntu 10.04 (Lucid Lynx).Dostupné z WWW:< http://www.ubuntugeek.com/how-installsun-java-runtime-environment-jre-in-ubuntu-10-04-lucid-lynx.html >.
[6]
KIKLHORN, M. Forum.ubuntu.cz[online]. 2010 [cit. 2011-03-24]. Instalace Festival-czech.Dostupné z WWW: .
[7]
ČERVENKA, Marek. Abclinuxu.cz[online]. 15.12.2009 [cit. 201103-24]. Asterisk a kalendáře.Dostupné z WWW: .
4–5