VoIP

Z Freenetis Wiki
Přejít na: navigace, hledání

FreenetIS umožňuje spravovat VoIP účty. Systém lze napojit na asterisk (popř. na SER a jeho deriváty) a dále na billing.

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 synchronizačního skriptu

Synchronizační skript zproztředkovává pro FreenetIS dobíjení kreditu a synchronizaci VoIP uživatelů.

Před instalací zkontrolujte zda-li máte nainstalovaný na SIP serveru perl.

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`;

2) Na SIP server umístěte následující soubory lbilling-synchronization.pl a html.tt do složky /usr/local/bin/lbilling/

3) Nastavte práva pro synchronizační skript:

chmod a+x /usr/local/bin/lbilling/lbilling-synchronization.pl

4) Nakonfigurujte proměnné ve skriptu lbilling-synchronization.pl (sekce configuration).

nano /usr/local/bin/lbilling/lbilling-synchronization.pl

5) Přidejte synchronizační skript (následující řádky) do CRONu (/etc/crontab):

#lBilling synchronization
30 22   * * * root perl /usr/local/bin/lbilling/lbilling-synchronization.pl -s
*/5 *  * * * root perl /usr/local/bin/lbilling/lbilling-synchronization.pl -p