AllInfo
Main: Info Blog Temp Mail


unix 2012-03-04 12-45-40

Корпоративный VoIP сервер на базе Asterisk в Ubuntu Server 8.04.2



Задача: поднять корпоративный сервер IP телефонии с несколькими потоками
E1 от разных провайдеров и несколькими SIP провайдерами, завернуть логи
в базу и настроить подбивку статистики, настроить электронные факсы.

В течении двух недель экспериментировал с Asterisk на различных
платформах и сборках - FreeBSD, CentOS, Trixbox, AsteriskNOW, Elastix,
Akozia... везде что-то не нравилось и не сросталось, и в итоге я
остановился на Ubuntu Server 8.04.2.

ASTERISK

Итак, ставим Ubuntu, во время установки отмечаем LAMP (Linux Apache
MySQL PHP) и OpenSSH.
Обновляемся и устанавливаем необходимые пакеты:

aptitude update
aptitude upgrade
aptitude install make gcc cpp g++ linux-headers-2.6.24.23-server \
bison ncurses-dev mysql-client libmysqlclient-dev libnewt-dev php-gd


Основную часть будем ставить из исходников, скачанных с сервера Digium:

wget http://downloads.digium.com/pub/asterisk/releases/asterisk-1.6.0.5.tar.gz
wget http://downloads.digium.com/pub/asterisk/asterisk-addons-1.6.0.1.tar.gz
wget http://downloads.digium.com/pub/telephony/dahdi-linux/dahdi-linux-2.1.0.4.tar.gz
wget http://downloads.digium.com/pub/telephony/dahdi-tools/dahdi-tools-2.1.0.2.tar.gz
wget http://downloads.digium.com/pub/libpri/releases/libpri-1.4.9.tar.gz


Распаковываем все это дело в /usr/src и начинаем по-порядку устанавливать.

Libpri:

make
make install


Dahdi:

make
make install


Dahdi-tools:

./configure
make menuselect
make
make install


Asterisk:

./configure
make menuselect
make
make install


Asterisk addons:

./configure
make menuselect
make
make install
reboot


Make menuselect делаем для проверки необходимых компонентов. Особенно
нас интересует mysql.

После того как все установлено необходимо поправить несколько основных файлов.

У меня установлены две платы Openvox D110P, которые являются полным
аналогом (китайская подделка =)) плат от Digium TE110P. Провайдеры
телефонии - Peterstar & Golden Telecom.

# cat /etc/dahdi/system.conf

span=1,1,0,ccs,hdb3,crc4
bchan=1-15
echocanceller=mg2,1-15
dchan=16
bchan=17-21
echocanceller=mg2,17-21
loadzone = us
defaultzone=us
span=2,0,0,ccs,hdb3
bchan=32-46
dchan=47
echocanceller=mg2,32-46


# cat /etc/asterisk/chan_dahdi.conf

[channels]
switchtype=euroisdn
pridialplan=unknown
prilocaldialplan=national
resetinterval = 100000000
facilityenable = yes
signalling=pri_cpe
rxwink=300
usecallerid=yes
cidsignalling=bell
cidstart=ring
hidecallerid=no
callwaiting=yes
usecallingpres=yes
sendcalleridafter=1
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
canpark=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=yes
echotraining=800
relaxdtmf=yes
rxgain=0.0
txgain=0.0

group=1
context=from_peterstar
immediate=no
channel=>1-15,17-21
mohsuggest=default

group=2
context=from_golden
immediate=no
channel=>32-46
mohsuggest=default


Теперь можно уйти в ребут.

После перезагрузки смотрим подгрузились ли необходимые модули:

lsmod | sort

dahdi 197768 87 dahdi_echocan_mg2,xpp,dahdi_transcode,wcb4xxp,wctdm,wcfxo,wctdm24xxp,wcte11xp,wct1xxp,wcte12xp,wct4xxp
dahdi_echocan_mg2 6920 0
dahdi_transcode 9352 1 wctc4xxp
.....
wcb4xxp 83492 0
wcfxo 13984 0
wct1xxp 16544 0
wct4xxp 353920 0
wctc4xxp 49180 0
wctdm24xxp 135008 0
wctdm 40652 0
wcte11xp 27424 37
wcte12xp 71392 0
.....


Дальше проверяем как dahdi переварил наши платы:

# dahdi_cfg -vvvvvvvv

DAHDI Tools Version - 2.1.0.2

DAHDI Version: 2.1.0.4
Echo Canceller(s): MG2
Configuration

SPAN 1: CCS/HDB3 Build-out: 0 db (CSU)/0-133 feet (DSX-1)
SPAN 2: CCS/HDB3 Build-out: 0 db (CSU)/0-133 feet (DSX-1)

Channel map:

Channel 01: Clear channel (Default) (Echo Canceler: mg2) (Slaves: 01)
...
Channel 15: Clear channel (Default) (Echo Canceler: mg2) (Slaves: 15)
Channel 16: D-channel (Default) (Slaves: 16)
Channel 17: Clear channel (Default) (Echo Canceler: mg2) (Slaves: 17)
...
Channel 46: Clear channel (Default) (Echo Canceler: mg2) (Slaves: 46)
Channel 47: D-channel (Default) (Slaves: 47)

37 channels to configure.

Setting echocan for channel 1 to mg2
...
Setting echocan for channel 46 to mg2


Еще одна утилита:

dahdi_scan

[1]
active=yes
alarms=OK
description=Digium Wildcard TE110P T1/E1 Card 0
name=WCT1/0
manufacturer=Digium
devicetype=Digium Wildcard TE110P T1/E1
location=PCI Bus 04 Slot 01
basechan=1
totchans=31
irq=23
type=digital-E1
syncsrc=0
lbo=0 db (CSU)/0-133 feet (DSX-1)
coding_opts=HDB3
framing_opts=CCS,CRC4
coding=HDB3
framing=CCS
[2]
active=yes
alarms=OK
description=Digium Wildcard TE110P T1/E1 Card 1
name=WCT1/1
manufacturer=Digium
devicetype=Digium Wildcard TE110P T1/E1
location=PCI Bus 04 Slot 02
basechan=32
totchans=31
irq=21
type=digital-E1
syncsrc=0
lbo=0 db (CSU)/0-133 feet (DSX-1)
coding_opts=HDB3
framing_opts=CCS,CRC4
coding=HDB3
framing=CCS


Настраиваем Asterisk. Приведу только основные блоки своей конфигурации
т.к. всё достаточно индивидуально.

# cat /etc/asterisk/extensions.conf

[general]
static = yes
writeprotect = yes
clearglobalvars = yes

[globals]
CONSOLE = Console/dsp ; Console interface for demo
TRUNKMSD = 1 ; MSD digits to strip (usually 1 or 0)
FEATURES =
DIALOPTIONS =
RINGTIME = 20
FOLLOWMEOPTIONS =
PAGING_HEADER = Intercom
PAGING_TIMEOUT = 60

[default]

[from_peterstar]
exten => 1111111,1,Ringing
exten => 1111111,n,Wait(1)
exten => 1111111,n,Answer
exten => 1111111,n,Dial(SIP/100,90,tr)
exten => 1111111,n,Queue(office)
exten => 1111111,n,Hangup()

[from_golden]
exten => 2222222,1,Ringing
exten => 2222222,n,Wait(1)
exten => 2222222,n,Answer
exten => 2222222,n,Dial(SIP/200,90,tr)
exten => 2222222,n,Queue(sklad)
exten => 2222222,n,Hangup()

[to_peterstar]
exten => _[1-9]XXXXXX,1,Set(CALLERID(all)=1111111)
exten => _[1-9]XXXXXX,2,Dial(dahdi/g1/${EXTEN},90,t)
exten => _7XXXXXX,1,Set(CALLERID(all)=1111111)
exten => _7XXXXXX,2,Dial(dahdi/g1/${EXTEN},90,t)
exten => t,1,Busy

[to_golden]
exten => _[1234569]XXXXXX,1,Set(CALLERID(all)=2222222)
exten => _[1234569]XXXXXX,2,Dial(dahdi/g2/${EXTEN},90,t)
exten => _7XXXXXX,1,Set(CALLERID(all)=2222222)
exten => _7XXXXXX,2,Dial(dahdi/g2/${EXTEN},90,t)
exten => t,1,Busy

[to_sipnet]
exten => _7921XXXXXXX,1,Dial(SIP/sipnet_et/${EXTEN},90,t)
exten => _7921XXXXXXX,2,Hangup()
.....


# cat /etc/asterisk/queue.conf

[general]

[default]

[office]
music=default
strategy=ringall
timeout=60
retry=30
wrapuptime=15
;periodic-announce-frequency=30
;periodic-announce = queue-periodic-announce
monitor-format = wav49
monitor-type = MixMonitor
context = office
member => SIP/100

[sklad]
music=default
strategy=ringall
timeout=60
retry=30
wrapuptime=15
;periodic-announce-frequency=30
;periodic-announce = queue-periodic-announce
monitor-format = wav49
monitor-type = MixMonitor
context = sklad
member => SIP/200


Вобщем в город звоним через Peterstar & Golden, а на мобильные и
межгород прописываем sipnet и его аналоги.

Дальше я решил запустить астериск стандартным для убунты образом:

/etc/init.d/asterisk start


Но оказолось что при компиляции никакие стартовые скрипты не создались.
Хотя в других версиях такого бага небыло.
Мое решение - вписываем в конец скрипта /etc/init.d/rc.local строчку:

/usr/sbin/asterisk -f -vvvg -c


Для проверки можно перезагрузиться и посмотреть сработало ли:

ps -aux | grep asterisk | grep -v grep

root 6184 0.1 1.1 28612 12108 ? Sl Feb19 4:05 /usr/sbin/asterisk -f -vvvg -c


Залезаем на консоль Астериска, начинаем звонить и смотреть не лезут ли ошибки:

asterisk -r
....


ФАКС

Вобщем все красиво, все работает, дальше будем прикручивать электронный факс.

Лирическое отступление: сначала я решил поставить факс из репозиториев
убунты - asterisk-app-fax, это чудо потянуло за собой астериск 1.4.22 и
все мои труды накрылись медным тазом =). Поэтому будем ставить связку
iaxmodem + hylafax, хоть из репозитория, но без вышеуказанных проблем.

aptitude install hylafax-serveк hylafax-client iaxmodem


Создаем несколько виртуальных модемов:

# cat /etc/iaxmodem/ttyIAX0

device /dev/ttyIAX0
owner uucp:uucp
mode 660
port 4570
refresh 50
server 127.0.0.1
peername iaxmodem
secret password
codec alaw
cidname Company
cidnumber +7(812)1111111


Выполняем для каждого модема:

cd /etc/iaxmodem
cp ttyIAX0 ttyIAX1
....


Не забываем менять название девайса в первой строчке файла настроек.
Запусаем iaxmodem:

/etc/init.d/iaxmodem start


Проверяем появились ли виртуальные модемы:

ls /dev | grep ttyIAX

ttyIAX0
ttyIAX1
....


Дальше нужно настроить взаимодействие этих модемов с hylafax.
Начальная настройка hylafax:

faxsetup


И для чего для каждого модема проделываем:

faxaddmodem


Прописывам модемы в астериске:

# cat /etc/asterisk/iax.conf

[general]
bindport = 4569
bindaddr = 0.0.0.0
disallow=all
allow=ulaw
allow=alaw

[iaxmodem]
type=friend
secret=password
port=4570
host=dynamic
context=office
disallow=all
allow=alaw

[iaxmodem1]
type=friend
secret=password
port=4580
host=dynamic
context=sklad
disallow=all
allow=alaw
.....


# cat /etc/asterisk/sip.conf

...
[111]
type=friend
context=office
secret=111
callerid="FAX-Office"<111>
nat=yes
host=dynamic
qualify=yes

[222]
type=friend
context=sklad
secret=222
callerid="FAX-Sklad"<222>
nat=yes
host=dynamic
qualify=yes
....


# cat /etc/asterisk/extensions.conf

exten => 111,1,Dial(IAX2/iaxmodem)
exten => 222,1,Dial(IAX2/iaxmodem1)
....


Для того, чтобы факсы отправлялись по e-mail необходимо настроить
почтовую систему на релей к вашему почтовому серверу и прописать
следующее:

# cat /etc/hylafax/FaxDispatch

case "$DEVICE" in
ttyIAX0) SENDTO=office@comp.spb.ru; FILETYPE=tif;;
ttyIAX1) SENDTO=sklad@comp.spb.ru; FILETYPE=tif;;
esac


При такой схеме факсы, приходящие на номер 111, будут идти на один
адрес, а приходящие на 222 - на другой, и т.д...

reboot


Отправлять факсы из винды можно после установки какой-нибудь клиентской
проги. Я использую Winprint Hylafax.


СТАТИСТИКА

Если аддон астериска собран с поддержкой MySQL:

# cat /etc/asterisk/cdr_mysql.conf

[global]
hostname=localhost
dbname=asterisk
table=cdr
password=password
user=root
port=3306
sock=/var/run/mysqld/mysqld.sock
userfield=1


Создаем базу:

mysql -p

> CREATE DATABASE asterisk;

GRANT INSERT
ON asterisk.*
TO asterisk@localhost
IDENTIFIED BY 'yourpassword';

USE asterisk;

CREATE TABLE `cdr` (
`calldate` datetime NOT NULL default '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL default '',
`src` varchar(80) NOT NULL default '',
`dst` varchar(80) NOT NULL default '',
`dcontext` varchar(80) NOT NULL default '',
`channel` varchar(80) NOT NULL default '',
`dstchannel` varchar(80) NOT NULL default '',
`lastapp` varchar(80) NOT NULL default '',
`lastdata` varchar(80) NOT NULL default '',
`duration` int(11) NOT NULL default '0',
`billsec` int(11) NOT NULL default '0',
`disposition` varchar(45) NOT NULL default '',
`amaflags` int(11) NOT NULL default '0',
`accountcode` varchar(20) NOT NULL default '',
`userfield` varchar(255) NOT NULL default ''
);

ALTER TABLE `cdr` ADD `uniqueid` VARCHAR(32) NOT NULL default '';
ALTER TABLE `cdr` ADD INDEX ( `calldate` );
ALTER TABLE `cdr` ADD INDEX ( `dst` );
ALTER TABLE `cdr` ADD INDEX ( `accountcode` );

reboot


Проверяем:

asterisk -r

pbx*CLI> cdr show status

CDR logging: enabled
CDR mode: simple
CDR output unanswered calls: no
CDR registered backend: mysql
CDR registered backend: csv
CDR registered backend: cdr-custom


Сие означает, что логи у нас пошли в базу.
Теперь прикручиваем модуль статистики:

wget http://areski.net/asterisk-stat-v2/asterisk-stat-v2_0_1.tar.gz


Распаковываем сожержимое в /var/www и настраиваем соответствующим
образом файлы ./lib/defaults.php и ./lib/DB-modules/phplib_mysql.php

apache2ctl restart


Заходим через браузер на адрес http://your-pbx-ip/cdr.php (можно сделать
и по-красивее) и радуемся тому, что все работает! =)

PS: При написании использовались следующие материалы:
* http://bbs.chinaunix.net/archiver/tid-1290435.html
* http://www.the-asterisk-book.com/unstable/faxserver-mit-iaxmodem-und-hylafax.html
* http://www.voip-info.org/wiki-Asterisk+cdr+mysql

PPS: http://alchemist-unix.blogspot.com/2009/02/ip-e1-sip.html - мой блог ;)

18.224.59.231 / 2024-04-27_17-57-51 UTC.