VoIP
FreenetIS umožňuje spravovat VoIP účty. Systém lze napojit na asterisk (popř. na SER a jeho deriváty) a dále na billing.
Obsah
Obecné informace
V systému FreenetIS si může každý uživatel zaregistrovat právě jedno číslo. Pokud je potřeba další účet je třeba zaregistrovat dalšího uživatele. Uživatel si v prostředí FreenetISu může změnit údaje o VoIP ůčtu jako heslo a nastavení hlasové schránky. Pokud je aktivní modul billingu je možné zobrazit i výpis hovorů popřípadě dobíjet kredit.
Nastavení
Pro správnou funkci VoIP je potřeba v nastavení FreenetISu nastavit rozsah čísel, které si můžou uživatelé registrovat. Dále je možné nastavit sip proxy, která se bude zobrazovat v uživatelském účtu VoIP. Pokud nějaké z rozsahu čísel nemá být nabízeno k registraci je potřeba jej definovat ve vynechaných čísel.
Integrace s asteriskem
Nainstalujeme potřebné balíky(Debian a jeho derivace).
apt-get install mysql asterisk asterisk-mysql
Pro integraci s asteriskem je potřeba vytvořit pohled do tabulky voip_sips:
Nejdříve je potřeba vytvořit databázi pro asterisk:
mysql> create database asterisk;
A pak samotné view do databáze FreenetISu:
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `asterisk`.`sip` AS select `freenetis`.`voip_sips`.`id` AS `id`, `freenetis`.`voip_sips`.`name` AS `name`, `freenetis`.`voip_sips`.`amaflags` AS `amaflags`, `freenetis`.`voip_sips`.`accountcode` AS `accountcode`, `freenetis`.`voip_sips`.`callgroup` AS `callgroup`, `freenetis`.`voip_sips`.`callerid` AS `callerid`, `freenetis`.`voip_sips`.`canreinvite` AS `canreinvite`, `freenetis`.`voip_sips`.`context` AS `context`, `freenetis`.`voip_sips`.`defaultip` AS `defaultip`, `freenetis`.`voip_sips`.`dtmfmode` AS `dtmfmode`, `freenetis`.`voip_sips`.`fromuser` AS `fromuser`, `freenetis`.`voip_sips`.`fromdomain` AS `fromdomain`, `freenetis`.`voip_sips`.`fullcontact` AS `fullcontact`, `freenetis`.`voip_sips`.`host` AS `host`, `freenetis`.`voip_sips`.`insecure` AS `insecure`, `freenetis`.`voip_sips`.`language` AS `language`, `freenetis`.`voip_sips`.`mailbox` AS `mailbox`, `freenetis`.`voip_sips`.`md5secret` AS `md5secret`, `freenetis`.`voip_sips`.`nat` AS `nat`, `freenetis`.`voip_sips`.`deny` AS `deny`, `freenetis`.`voip_sips`.`permit` AS `permit`, `freenetis`.`voip_sips`.`mask` AS `mask`, `freenetis`.`voip_sips`.`pickupgroup` AS `pickupgroup`, `freenetis`.`voip_sips`.`port` AS `port`, `freenetis`.`voip_sips`.`qualify` AS `qualify`, `freenetis`.`voip_sips`.`restrictcid` AS `restrictcid`, `freenetis`.`voip_sips`.`rtptimeout` AS `rtptimeout`, `freenetis`.`voip_sips`.`rtpholdtimeout` AS `rtpholdtimeout`, `freenetis`.`voip_sips`.`secret` AS `secret`, `freenetis`.`voip_sips`.`type` AS `type`, `freenetis`.`voip_sips`.`username` AS `username`, `freenetis`.`voip_sips`.`disallow` AS `disallow`, `freenetis`.`voip_sips`.`allow` AS `allow`, `freenetis`.`voip_sips`.`musiconhold` AS `musiconhold`, `freenetis`.`voip_sips`.`regseconds` AS `regseconds`, `freenetis`.`voip_sips`.`ipaddr` AS `ipaddr`, `freenetis`.`voip_sips`.`regexten` AS `regexten`, `freenetis`.`voip_sips`.`cancallforward` AS `cancallforward`, `freenetis`.`voip_sips`.`setvar` AS `setvar`, `freenetis`.`voip_sips`.`auth` AS `auth` from `freenetis`.`voip_sips`;
Dále vytvoříme view pro hlasovou schánku:
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `asterisk`.`voicemail_users` AS select `freenetis`.`voip_voicemail_users`.`id` AS `uniqueid`, `freenetis`.`voip_voicemail_users`.`customer_id` AS `customer_id`, `freenetis`.`voip_voicemail_users`.`context` AS `context`, `freenetis`.`voip_voicemail_users`.`mailbox` AS `mailbox`, `freenetis`.`voip_voicemail_users`.`password` AS `password`, `freenetis`.`voip_voicemail_users`.`fullname` AS `fullname`, `freenetis`.`voip_voicemail_users`.`email` AS `email`, `freenetis`.`voip_voicemail_users`.`pager` AS `pager`, `freenetis`.`voip_voicemail_users`.`stamp` AS `stamp` from `freenetis`.`voip_voicemail_users` where (`freenetis`.`voip_voicemail_users`.`active` = _utf8'1');
Konfigurace MySQL
Asterisk umí přistupovat přímo k mysq.
V /etc/asterisk/res_mysql.conf přidáme
[general] dbhost = localhost dbname = asterisk dbuser = username dbpass = password dbport = 3306 dbsock = /var/run/mysqld/mysqld.sock
Konfigurace Asterisku
Všechny soubory jsou v /etc/asterisk/
V extconfig.conf řekneme, že některé věci se čtou z DB - mělo by tam být
sippeers => mysql,asterisk,sip voicemail => mysql,asterisk,voicemail_users ;extensions => mysql,asterisk,extensions - zatím neimplementováno ve FreentISu!!!
Pro otestování připojení k MySql se připojíme ke konzoli
asterisk -rvvv
a spustime realtime mysql status
sip*CLI> realtime mysql status Connected to asterisk@localhost, port 3306 with username asterisk for 4 seconds.
Tím máme funkčnost spojení otestovanou.
V tento okamžik je asterisk integrován s FreentISem a po přidání VoIP účtu ve FreenetISu by mělo být možné se přihlásit k ústředně pomocí SW nebo HW klienta. Status přihlášení lze sledovat ve FreenetISu v nastavení VoIP učtu
Dále už nastavení asterisku záleží na požadavcích uživatele. Vzorová konfigucace pro prunk od NFX s.z.p.o.:
[general] static=yes writeprotect=no userscontext=default [default] ;defaultni kontext, spada sem vse co neni v jinem kontextu exten => s,1,Answer() exten => s,n,Wait(2) exten => s,n,Playback(slfree-volane-cislo-neexistuje) exten => s,n,Hangup() [internal] ;defaultni kontext pro nase cisla ;pokud volame 11 jdeme do vlastni hlasove shranky exten => 11,1,Goto(mailbox,s,1) ;pokud volame tisnove linky skaceme do kontextu emergency exten => 112,1,Goto(emergency,${EXTEN},1) exten => 150,1,Goto(emergency,${EXTEN},1) exten => 155,1,Goto(emergency,${EXTEN},1) exten => 158,1,Goto(emergency,${EXTEN},1) ;konverze dlouhych cisel na kratka - jen pro CR exten => _00420XXXXXXXXX,1,Goto(internal,${EXTEN:5},1) ;hovor je do slfree, prozkoumame kontext slfree exten => _951020XXX,1,Goto(slfree,${EXTEN},1) ;hovor je do CR, prozkoumame kontext outgoing-nfx exten => _XXXXXXXXX,1,Goto(outgoing-nfx,00420${EXTEN},1) ;hovor je do sveta, prozkoumame kontext outgoing-nfx exten => _XXXXXXXXXXXXXX,1,Goto(outgoing-nfx,${EXTEN},1) ;jinak nezname cislo exten => _X.,1,Goto(default,s,1) ;vse jde na ustrednu do nfx [outgoing-nfx] exten => _XXXXXXXXXXXXXX,1,Set(CALLERID(num)=00420${CALLERID(num)}) exten => _XXXXXXXXXXXXXX,n,Dial(SIP/nfx/${EXTEN}) exten => _XXXXXXXXXXXXXX,n,Hangup [incomming-nfx] ;konverze dlouhych cisel na kratka exten => _00420XXXXXXXXX,1,Goto(incomming-nfx,${EXTEN:5},1) ;hovor je do slfree, prozkoumame kontext [slfree] exten => _951020XXX,1,Goto(slfree,${EXTEN},1) ;jinak nezname cislo exten => _X.,1,Goto(default,s,1) [slfree] ;kontext pro cisla z slfree, data bereme z db exten => _951020XXX,1,Macro(safedial,SIP/${EXTEN},30) ;Realtime integrace zatím není ve FreenetISu implementována!!! ;switch => Realtime
Nakonec nastavíme trunk pro odchozí hovory.
[nfx] type=peer host=sip.nfx.czf qualify=no language=cz insecure=port,invite fromdomain=****** canreinvite=no context=incomming-nfx nat=no
Tro jiné trunky (např trunk od Havel nebo 802.cz) je potřeba vlastní řešení...
Billing API
Billing zapišťuje dobíjení kreditu, tarifikaci hovorů, výpis hovorů aj. Do FreenetISu bylo zaintegrováno LBilling API. LBilling API bylo vyvynuto pro potřeby NFX s.z.p.o. a jeho specifinace je dostupná na interních stránkách NFX. Samotný billing byl ale navržen tak, aby byl univerzální a pouze se měnil ovladač billungu.
Aktuálně je implementován pouze driver pro Lbilling API NFX. Další API lze dle potřeby doprogramovat.
Instalace
1) Vytvořte MySQL pojmenovanou lbilling na stejném DB serveru jako máte databázi FreenetISu. 2) Vytvořte pohledy do FreenetIS databáze (pokud se FreenetIS databáze nejmenuje freenetis, změňte všechny hodnoty `freenetis` na jméno Vaší databáze, popřípadě změňte i uživatele, který definuje pohledy).
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `transfers` AS select `freenetis`.`transfers`.`id` AS `id`,`freenetis`.`transfers`.`origin_id` AS `origin_id`,`freenetis`.`transfers`.`destination_id` AS `destination_id`,`freenetis`.`transfers`.`previous_transfer_id` AS `previous_transfer_id`,`freenetis`.`transfers`.`member_id` AS `member_id`,`freenetis`.`transfers`.`user_id` AS `user_id`,`freenetis`.`transfers`.`type` AS `type`,`freenetis`.`transfers`.`datetime` AS `datetime`,`freenetis`.`transfers`.`creation_datetime` AS `creation_datetime`,`freenetis`.`transfers`.`text` AS `text`,`freenetis`.`transfers`.`amount` AS `amount` from `freenetis`.`transfers`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `voip_lbilling_accounts` AS select `voip_lbilling_accounts`.`id` AS `id`,`voip_lbilling_accounts`.`userid` AS `userid`,`voip_lbilling_accounts`.`cid` AS `cid`,`voip_lbilling_accounts`.`state` AS `state`,`voip_lbilling_accounts`.`limit` AS `limit`,`voip_lbilling_accounts`.`tarif` AS `tarif`,`voip_lbilling_accounts`.`descr` AS `descr` from `freenetis`.`voip_lbilling_accounts`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `voip_lbilling_payments` AS select `voip_lbilling_payments`.`id` AS `id`,`voip_lbilling_payments`.`userid` AS `userid`,`voip_lbilling_payments`.`date` AS `date`,`voip_lbilling_payments`.`value` AS `value`,`voip_lbilling_payments`.`state` AS `state`,`voip_lbilling_payments`.`descr` AS `descr` from `freenetis`.`voip_lbilling_payments`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `voip_lbilling_users` AS select `voip_lbilling_users`.`id` AS `id`,`voip_lbilling_users`.`type` AS `type`,`voip_lbilling_users`.`state` AS `state`,`voip_lbilling_users`.`limit` AS `limit`,`voip_lbilling_users`.`currency` AS `currency`,`voip_lbilling_users`.`descr` AS `descr` from `freenetis`.`voip_lbilling_users`;