Zkušenosti s realizací VoIP operátora na open-source

Milan Piller 14. 10. 2013

Článek pojednává o tom, jak se realizoval telefonní operátor založený od základu až po webové rozhraní pouze na open-source systémech. Článek není schopen dát ucelený návod, ale zasvěcuje do celé problematiky provozu telefonních ústředen operátorů. Proberu realizaci ústředny, billing i zabezpečení.

Poznámka na úvod: Článek není myšlen jako PR, ale jako ukázka možnosti realizace podobného projektu čistě pomocí open-source nástrojů. Zveřejňuji specifikace, které si ostatní poskytovatelé zbytečně a nelogicky chrání.

Proč aneb motivace

Již delší dobu se zabýváme open-source informačními systémy. Zejména se jedná o IS pro práci ve skupinách, tzv. collaboration, obchodními systémy zaměřené na zákazníky a dodavatele CRM a SRM a také systémy pro automatizaci výroby ERP.

V současné době je celkem trendem v podnikatelské sféře mít plné propojení CRM IS s telefonní ústřednou pro funkce známé z call center. To je ale pro běžného uživatele, který telefonuje přes VoIP, nevhodné, protože to pro něj přináší příliš mnoho funkcí navíc. Přesto jsme chtěli vytvořit něco navíc než jen pouhé „telefonování přes internet“.

Nejlepší volbou pro VoIP telefonii bylo poskytnout obyčejným uživatelům funkce známé z collaboration systémů s tím, že se primárně nebudou rozšiřovat skupiny a každý registrovaný uživatel dostane k telefonnímu číslu také virtuální kancelář zdarma, jak ji znáte z outlookových systémů, s možností synchronizace. Ve virtuální kanceláři měl tak uživatel získat funkce, které jsou běžné hlavně z agendy v chytrých telefonech, jako e-mail, kalendář, adresář, poznámky, úkoly atd., a pokud možno, aby vše celé mohl uživatel synchronizovat s mobilními telefony. Virtuální kancelář měla být dobře škálovatelná proto, aby se na její bázi vytvořil také billing systém pro ústřednu. Vítězně ze všech požadavků vyšel celkem známý open-source nástroj eGroupware.

Ústředna Asterisk

Než popíši vlastnosti a funkce webového prostředí, začal bych přímo realizací a přípravou telefonní ústředny založené na Asterisku pro spolupráci s webovým systémem a billingem. Vzhledem k tomu, že primárně eGroupware běží na databázi MySQL, bylo celkem logické, aby oba systémy měly stejný databázový systém. To snadno zvládla knihovna napsaná pro Asterisk celkem dobře a nemuselo se používat ODBC.

Vytvořila se CDR tabulka v databázi a pomocí cdr_mysql.conf se připojila do Asterisku. Poté se museli vytvořit SIPoví virtuální uživatelé v další tabulce. Tak jako se u CDR v tabulce vytváří sloupce podle dalších parametrů, tak i zde jsou sloupce podle různých parametrů, které by se jinak zadávaly do účtů v SIP.conf. Opět zde následovalo připojení DB v  res_mysql.conf.

Jenomže u telefonního operátora nestačí pouze SIP uživatelé, ale musí se předem počítat s tím, že některá telefonní čísla mohou přijít a odejít a také se musí vytvořit možnost přesměrovávání hovorů. Přibyly tedy další tabulky s možností dopisování různých extensions a odkazů na makra. Jak SIPoví uživatelé, tak další možnosti extensions či include jiných tabulek se připojují v extconfig.conf

Jakmile byla databáze připravená a zkušební čísla vyzkoušena, nastal čas se pustit do vytváření dialplánu. Contexty uváděné u jednotlivých uživatelů by měly být vždy rozděleny alespoň do několika skupin. Je tak možné na žádost uživatele zakázat nebo povolit odchozí zahraniční volání, povolit je jen v rámci ČR a SK nebo povolit ostatní mezinárodní hovory, popř. blokovat hovory s vysokou tarifikací. Povolení nebo zakázání se provede tak, že se includují další contexty v extensions.conf  již s možnými předvolbami.

Příklad: jeden context, který odkazuje na volání 112 atd. a _00800XXXXXX, se nachází v jiném contextu než třeba _ZX , _00420 a _00421 a také v jiném kontextu je volání na _00 apod. Takto je pak možné různě pokračovat včetně odlišení lokálních čísel od ostatních. Pak dojdeme k závěru, že pokud nám něco context nezablokuje, jsou zde pouhé čtyři druhy volání: placená a zdarma, jdoucí přes dodavatele hlasových služeb, dále volání zdarma v rámci sítě a nakonec volání na přesměrovaná tel. čísla, popř přinesená a odnesená tel. čísla. Ta se dají řešit ve stejné tabulce jako přesměrovaná pomocí extensions.

Mohou pak ještě nastat stavy, kdy se dva operátoři spojí a nabídnou vzájemné volání zdarma. Pak přibudou další způsoby kvůli odlišným trunkům. Pro každé toto volání je v dialplánu jedno makro označené např. jako [macro-freecall]. Volání v rámci sítě je jednoduché makro a končí funkcí Dial na SIPový účet registrovaný v příslušné tabulce účtů.

U nás je to ještě o něco složitější a v rámci příchozích kanálů se snažíme co nejlépe ještě dohledat telefonní číslo. Volání zdarma jde přes trunk dodavatele hlasových služeb a nastavuje potřebné parametry SIPových hlaviček. Podobně funguje i placené makro, které je rozšířeno o AGI skripty pro billing a určování času, který může volající provolat v rámci kreditu a ceny volání za minutu.

Makro pro přesměrovávaní funguje tak, že z databázové tabulky vybere informace o tom, za jakých podmínek a stavů má být hovor přesměrován: vždy, při nedostupnosti, nezvedání, odmítnutí atd. Následuje souhrn podmínek GotoIf a nakonec se zjistí, zda je tel. číslo dostupné v rámci sítě nebo půjde přes trunk dodavatele a podle toho se odkáže na další makro, v tomto případě placené nebo pro volání v rámci sítě zdarma. Kvůli zvýšené bezpečnosti se přesměrování realizuje jen na tel. čísla pro ČR.

Schéma hovoru při navázání a zavěšení

Největším naším nepřítelem (a také všech našich zákazníků) jsou útočníci, kteří se snaží o fraudová volání. Již při spuštění je otázkou pouhého jednoho týdne, než si nové ústředny zlí hoši všimnou a začnou provádět útoky, viz výpisy z CLI konzole.

Jen za rok 2010 řešil ČTÚ stížnosti fraudových volání v hodnotě více než 10 miliónů korun. Vyvinuli jsme proto doplněk založený na AGI skriptech pro zamezení těchto volání. Ze zkušeností vyplynula potřeba jej implementovat nejen na odchozí volání, ale pro všechna makra včetně příchozích hovorů. 

Riziko totiž neznamenají jen bezpečnostní chyby ústředny, ale i hacknutý telefon či softwarový klient u zákazníka. Tyto problémy ovšem už poskytovatel nedokáže přímo ovlivnit. Jak je navíc známo, Asteriskové ústředny zapisují hovory do CDR tabulky až po ukončení hovoru. Za dobu, po kterou lze navázat a udržovat hovor, je možné napáchat na více linkách škodu, kterou nakonec poskytovatel bude muset uhradit.

Velmi dobře si toto riziko uvědomujeme, a proto vzešel z naší dílny modul propojený přes AGI, který dočasně cachuje všechny hovory už na jejich začátku. Jedním z více parametrů identifikace fraudových volání je např. UniqueID hovoru (čas kdy hovor skutečně začal a který je stejný i při několikanásobném přesměrovávání hovorů). Podle UniqueID se dá následně z CDR tabulky zjistit, zda hovor již skončil a je již v CDR tabulce zapsán. V opačném případě jsou veškeré další pokusy o fraudová volání zamítnuty. Lze tak přidělovat čas i dalším paralelním hovorům v rámci probíhajícího volání v závislosti na stavu původního volajícího limitu. Všechny naše skripty jsou psány v jazyce Perl a z větší míry slouží pro synchronizaci dat mezi databázemi.

Webové rozhraní a billing

Nyní bych přešel k webovému rozhraní přes billing systém. Poskytovatel hlasových služeb nám dodal ceník volání v Excelu o nějakých 25 000 řádcích podle předvoleb a navíc bez úvodních dvou nul. Další ceny volání byly dodány jen v dokumentu PDF. Ceny byly ještě nakonec odlišné od různých předvoleb a například cena volání do Vietnamu byla jiná při volání na 0084 a 00841, přičemž předvolba 0084121 byla tarifikována jako 0084 a 008464 s odlišnou cenou.

I zde si s tím Perl dovedl poradit tak, že hledá předvolby podle sloupce směrem od konce volaného čísla. Můžeme tak tarifikovat jinak čísla s různými předvolbami, přičemž přednost má to, které je podrobnější. Vznikla tak další databáze s tabulkami kreditů, tarifikací a stavů uživatelů, něco jako propojovací bod mezi ústřednou a webovým rozhraním. Můžeme tak zvýhodňovat volání na virtuální operátory a odlišit cenu volání do jiných sítí. Tento propojovací bod je statickou databází zpracovaných hovorů, ze které pak čerpá eGroupware.

Čím složitější a více rozdělený systém v databázi to byl, tím nám nakonec připadalo jednodušší vyřešit realizaci dalších funkcí pro virtuální kancelář.

Jako poslední přišel na řadu eGroupware, což je nakonec to, co bude uživatel používat. eGroupware je informační systém, který se skládá z jednotlivých modulů (aplikací). Každá aplikace se nachází v samostatném adresáři. Zásadní jsou e-maily, díky kterým můžeme řešit různé zprávy, kalendář, adresář, infolog, záložky, novinky a interní wiki. V každém adresáři jsou šablony (templates) a PHP skripta (inc). Šablony neumožňují přímo vkládání PHP kódu, ale je možné jim za pomocí tříd a funkcí přiřadit libovolnou proměnnou. Výsledek pak vypadá např. takto: funkce nastaví proměnnou kredit podle vašeho id na určitou hodnotu

$this->template->set_vars('kredit',
$promenna);

Pro multijazyčnost nastavíme ještě

$this->template->set_vars('kredit_title',
lang('Váš kredit je:'));

a v template pak uvedeme text:

{kredit_title} {kredit}

Najednou máme ve webovém rozhraní stav o našem kreditu. Tímto způsobem jsme pokračovali s dalšími funkcemi.

Perlové skripty každou chvilku synchronizují stav volání do dalších tabulek sloužící pro zálohy a aktualizují stav kreditu z billingové databáze. Skripty také stojí za tím, že veškeré informace o hovorech jsou zobrazovány v infologu (příchozí, odchozí, zmeškané). V podstatě se jedná o synchronizaci mezi tabulkami Asterisku a eGroupware.

Infolog je mocný nástroj v celém eGroupware systému, neboť umožňuje zpracovávat a filtrovat ohromná data a zároveň obsahuje i nástroje pro bussines inteligence. Je možné k informacím přiřazovat další proměnné, čehož jsme využili i my a přibyly tak další informace o délce a ceně hovoru a to pouze u stavu, který patří k hovorům. Celý infolog totiž zpracovává nejen hovory, ale také úkoly nebo poznámky.

Dojde-li ke smazání jedné položky v eGroupware, nedojde k žádné změně stavu kreditu. Celý billing je založen na dodatečné databázi, ze které čerpá i eGroupware a do které zapisuje Asterisk přes AGI skripty v Perlu. Adresář byl nastaven tak, aby telefonní čísla zobrazoval jako odkazy ve formátu sip:352222100, číslo podpory. Po kliknutí na číslo se okamžitě spouští přiřazený SIPový klient podle nastavený pro SIP dle MIME.

Kalendář umožňuje veškeré funkce známé z kalendářních systémů a vkládání probíhá po kliknutí na zvolený čas. Umožňuje import z iCal a CSV a export do iCal. V kalendáři se také zobrazují informace o žádostech pro nabití kreditu. S FelamiMail se setkáte ihned po registraci účtu, neboť v něm naleznete heslo do SIP klienta. S každou registrací se totiž zároveň vytváří e-mailový účet. Našim záměrem je využít e-mailové schránky také při zpracování faxu či SMS či pro zasílání důležitých zpráv klientům. Změnu hesla tak nebude nikdy nutné posílat mimo server.

Synchronizace s mobilními telefony probíhá pomocí open-source aplikace Funambol přes protokol RPC na adrese mysip.cz/rpc.php s přihlašovacím jménem jako telefonní číslo a heslem uvedeným při registraci. Funambol je dostupný pro Blackberry, Android, Xchange, Outlook, Thunderbird, Winmoble, Symbian, OS X, iPhone, iPad a další.

S provozem eGroupware jsme schopni poskytnout také další tři aplikace. Správce záložek s možností synchronizace záložek pro prohlížeče na jiných stanicích, správce novinek, kde lze posílat a získávat interní zprávy, které se zobrazují také na domovské stránce a v poslední řadě i interní wiki, kterou jsme použili pro přípravu zpracování manuálů a nastavení telefonů či klientů. V tomto nás čeká ještě hodně práce a nové manuály budou přibývat.

Rozhodli jsme se jít co nejméně násilnou cestou při konfiguraci klientských zařízení. Ve většině případů postačí telefonní číslo jako jméno, heslo do SIP účtu, registrační server sip.mysip.cz a pro zařízení za NAT ještě STUN server mysip.cz. Veškerá další nastavení jako volbu kodeků ponecháváme na klientovi, případně tyto informace doplňujeme na dotaz.

Nakonec se můžete připojit přes:

  • hardwarový VoIP telefon
  • analogový telefon s VoIP bránou
  • softwarového klienta PC pomocí X-Lite, Twinkle atd.
  • mobilního klienta jako jsou
  • rád také používám AGEphone Mobile
Našli jste v článku chybu?
Lupa.cz: Olympiáda zakázala GIFy. Moc to nepomáhá

Olympiáda zakázala GIFy. Moc to nepomáhá

Vitalia.cz: „Sjíždět“ porno není bez rizika

„Sjíždět“ porno není bez rizika

Měšec.cz: Test: Výběry z bankomatů v cizině a kurzy

Test: Výběry z bankomatů v cizině a kurzy

Podnikatel.cz: Vyrábí boty, ve kterých neumíte chodit

Vyrábí boty, ve kterých neumíte chodit

Vitalia.cz: Galerie: Strouhanka ze starých rohlíků? Kdepak

Galerie: Strouhanka ze starých rohlíků? Kdepak

Podnikatel.cz: Česká pošta vycouvala ze služby ČP Cloud

Česká pošta vycouvala ze služby ČP Cloud

Podnikatel.cz: Kauza z Vinohrad pokračuje. Policie se omlouvá

Kauza z Vinohrad pokračuje. Policie se omlouvá

Vitalia.cz: Vakcína Cervarix je oficiálně i pro chlapce

Vakcína Cervarix je oficiálně i pro chlapce

Root.cz: Xiaomi má vlastní notebook podobný Macu

Xiaomi má vlastní notebook podobný Macu

Měšec.cz: Do ostravské MHD bez jízdenky. Stačí karta

Do ostravské MHD bez jízdenky. Stačí karta

Měšec.cz: Ceny PHM v Evropě. Finty na úspory

Ceny PHM v Evropě. Finty na úspory

Měšec.cz: Co s reklamací, když e-shop krachuje?

Co s reklamací, když e-shop krachuje?

Měšec.cz: Na návštěvě na exekutorském úřadě

Na návštěvě na exekutorském úřadě

Měšec.cz: Kurzy platebních karet: vyplatí se platit? (TEST)

Kurzy platebních karet: vyplatí se platit? (TEST)

Lupa.cz: Nechcete datacentrum? Jsou na prodej

Nechcete datacentrum? Jsou na prodej

Lupa.cz: Co vzal čas: internetové kavárny a herny

Co vzal čas: internetové kavárny a herny

Lupa.cz: Hackujete? Můžete mít problém sehnat práci

Hackujete? Můžete mít problém sehnat práci

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře

Měšec.cz: Udali ho na nelegální software a přišla Policie

Udali ho na nelegální software a přišla Policie

Vitalia.cz: Musí moudrák opravdu ven?

Musí moudrák opravdu ven?