В данной статье на примере однопортовой E1 карты Digium TE121P рассмотрим пример подключения её во FreeSWITCH на операционной системе CentOS.
Физическое подключение
Физическое подключение вам по идее должен обеспечивать провайдер телефонии. На карте предусмотрен 75-омный разъём RJ-45.
У нас, например, для подключения к провайдеру используются модемы NSGate NS-200/SB-LE с портами E1+LAN+V.35, очень рекомендую, сразу можно подключить у провайдера по одной выделенной линии и E1 и Ethernet.
Распиновку кабеля можно посмотреть здесь.
Когда карта подключится к провайдеру, лампочка на ней загорится зелёным, если, конечно, вы всё правильно настроите, как описано далее.
Настройка
Для работы платы необходимо установить и настроить три компоненты:
- libPRI — это библиотека, предназначенная для работы с потоковыми TDM-интерфейсами ISDN: PRI (Primary Rate Interface) и BRI (Basic Rate Interface).
- DAHDI — драйверы для плат производства Digium.
- FreeTDM — модуль FreeSWITCH для работы с платами телефонии.
libPRI
Загружаем libpri отсюда: downloads.asterisk.org/pub/telephony/libpri/
Например, так:
wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4-current.tar.gz
И устанавливаем:
make
make install
Собственно устанавливаем и всё. Никакой особой настройки она не требует.
FreeSWITCH взаимодействует с DAHDI через libPRI.
DAHDI
Также процесс установки DAHDI описан здесь: wiki.freeswitch.org/wiki/OpenZap_Dahdi
Итак, после инсталляции карты, проверяем ее в системе
lspci -v
И смотрим на каком прерывании сидит карта:
cat /proc/interrupts
Если wctdm занимает отдельный irq, то это хорошо, если же он делит его с кем-то, то это может сказываться на работе карты и качестве голоса, поэтому лучше всего разнести драйверы по разным прерываниям.
Загружаем DAHDI отсюда: downloads.asterisk.org/pub/telephony/dahdi-linux-complete/
Например, так:
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
Добавляем пользователя Asterisk
adduser asterisk
И создаем папку в /etc
mkdir /etc/asterisk
Оно нам не понадобится, но это надо будет сделать во избежание ошибок при установке драйверов.
make all
make install
Если была первая установка, то нужно выполнить config для установки файлов примеров конфигурации
make config
Сразу можно включить DAHDI в автозагрузку
chkconfig dahdi on
Запускаем генератор конфигурации DAHDI
/usr/sbin/dahdi_genconf
Редактируем файл /etc/dahdi/modules
Там должна быть одна незакомментированная строка:
wcte12xp
Остальные модули нам не нужны, их надо закомментировать, чтобы не загружались.
Далее настраиваем /etc/dahdi/system.conf:
Настройка подключения:
span=<span num>,<timing source>,<line build out (LBO)>,<framing>,<coding>[,yellow]
span num — порядковый номер спана
timing source — выбор источника для синхронизации таймера. 0 – мастер, 1 и более – мастером является удаленная сторона. Чем больше число, тем меньше приоритет.
line build out (LBO) — выбор в зависимости от расстояния до удаленной стороны. Не знаю, работает ли она в данном случае, но таблица приводится следующая:
0: 0 db (CSU) / 0-133 feet (DSX-1)
1: 133-266 feet (DSX-1)
2: 266-399 feet (DSX-1)
3: 399-533 feet (DSX-1)
4: 533-655 feet (DSX-1)
5: -7.5db (CSU)
6: -15db (CSU)
7: -22.5db (CSU)
framing – тип телефонной сигнализации. Для E1 выбирается ccs или cas.
coding – кодирование в линии. Для E1 выбирается ami или hdb3.
yellow – выполняется ли проверка и генерация crc4.
Все данные параметры E1 вам должен сообщить провайдер телефонии (конечно, кроме span num).
Далее следует конфигурация каналов:
<device>=<channel list>
Для E1 потока нам будут интересны device только bchan и dchan. Для E1 используется следующая настройка:
bchan=1-15,17-31
dchan=16
Далее описывается временная зона:
loadzone=<zone>
defaultzone=<zone>
Временная зона указывается двухбуквенным кодом. По умолчанию — us.
Далее описывается кодировка PCM на каналах:
Выбор между mulaw (G.711u = PCMU) и alaw (G.711a = PCMA).
Далее описываются эхоподавители:
echocanceller=<echocanceller name>,<channel's>
echocanceller name — mg2, kb1, sec2, sec.
Вот мой файл /etc/dahdi/system.conf для примера:
# Autogenerated by ./dahdi_genconf on Tue Jun 7 18:38:22 2011
# If you edit this file and execute ./dahdi_genconf again,
# your manual changes will be LOST.
# Dahdi Configuration File
#
# This file is parsed by the Dahdi Configurator, dahdi_cfg
#
# Span 1: WCT1/0 "Wildcard TE121 Card 0" (MASTER) HDB3/CCS ClockSource.
span=1,1,0,ccs,hdb3
bchan=1-15,17-31
dchan=16
alaw=1-15,17-31
loadzone = ru
defaultzone = ru
echocanceller=mg2,1-15,17-31
Теперь можно стартовать DAHDI:
service dahdi start
При установке DAHDI в /usr/sbin записывается несколько утилит:
dahdi_test
dahdi_test
Opened pseudo dahdi interface, measuring accuracy...
99.999% 99.995% 99.999% 99.999% 99.999% 99.999% 99.999%
--- Results after 7 passes ---
Best: 99.999 -- Worst: 99.995 -- Average: 99.998506, Difference: 99.998507
Значения ниже 99,9 — плохой результат. Он означает, что DAHDI-устройство вынуждено конкурировать с другими процессами за прерывания и время процессора, что может привести к ухудшению качества звука.
dahdi_tool
Показывает статус карты и ошибки в её работе
dahdi_scan
Показывает сведения о карте, например, так:
[1]
active=yes
alarms=OK
description=Wildcard TE121 Card 0
name=WCT1/0
manufacturer=Digium
devicetype=Wildcard TE121 (VPMADT032)
location=PCI Bus 05 Slot 09
basechan=1
totchans=31
irq=169
type=digital-E1
syncsrc=1
lbo=0 db (CSU)/0-133 feet (DSX-1)
coding_opts=AMI,HDB3
framing_opts=CCS,CRC4
coding=HDB3
framing=CCS
dahdi_cfg [options]
Показывает конфигурацию
dahdi_hardware
Показывает сведения об установленной карте
FreeTDM
Для работы с платой у вас, на FreeSWITCH'е должен быть установлен модуль freetdm. Более того, он должен быть скомпилирован с поддержкой libpri. Если он скомпилирован без libpri, то придется перекомпилировать:
cd libs/freetdm
./configure --with-libpri
make
make install
Для настройки FreeTDM надо откорректировать три файла в папке conf: freetdm.conf, zt.conf и autoload_configs/freetdm.conf.xml. Ну, естественно, модуль FreeTDM должен быть включен в файле autoload_configs/modules.conf.xml.
Настройка freetdm.conf
Настраиваем секцию Zaptel/DAHDI. Для этого создаём (по умолчанию она уже создана) следующую секцию:
[span zt myDAHDISpan]
myDAHDISpan — здесь может быть любое выбранное вами имя.
Обратите внимание, что в этом файле параметр от значения отделяется знаком «=>».
name — выбранное вами имя.
trunk_type — Определяет тип, возможные значения: E1, T1, J1, BRI, BRI_PTMP, FXO, FXS, EM.
group — Условное групповое имя для исходящих звонков, должно начинаться с буквы. Далее, в примере диалплана мы увидим как его можно использовать.
txgain — Усиление или ослабление звука для передачи. Тип float. Слишком большое значение может привести к искажениям. Типичные значения в диапазоне от -5.0 до 5.0
rxgain — Усиление или ослабление звука для приема. Тип float. Слишком большое значение может привести к искажениям. Типичные значения в диапазоне от -5.0 до 5.0
Опции analog-start-type и number для E1 потоков не нужны.
b-channel — Номера b-каналов. Из параметра bchan (файл /etc/dahdi/system.conf)
d-channel — Номер d-канала. Из параметра dchan (файл /etc/dahdi/system.conf)
Параметры fxo-channel, fxs-channel и em-channel в нашем случае не нужны.
Также могут пригодиться параметры cas-channel и debugdtmf.
Пример моего работающего freetdm.conf:
[span zt pri]
name => pri
trunk_type => E1
group => e1group
b-channel => 1-15
d-channel => 16
b-channel => 17-31
Настройка zt.conf
Я не заморачивался с ним и взял все значения по умолчанию:
[defaults]
codec_ms => 20
wink_ms => 150
flash_ms => 750
echo_cancel_level => 64
rxgain => 0.0
txgain => 3.0
Настройка freetdm.conf.xml
<configuration name="freetdm.conf" description="Freetdm Configuration">
<settings>
<param name="debug" value="7"/>
<!--<param name="hold-music" value="$${moh_uri}"/>-->
<!--<param name="enable-analog-option" value="call-swap"/>-->
<!--<param name="enable-analog-option" value="3-way"/>-->
</settings>
<libpri_spans>
<span id="1" name="pri">
<param name="node" value="network"/>
<param name="switch" value="euroisdn"/>
<param name="l1" value="alaw"/>
<param name="dp" value="international"/>
<param name="debug" value="all"/>
<param name="dialplan" value="XML"/>
<param name="context" value="default"/>
</span>
</libpri_spans>
</configuration>
Атрибут name — имя спана, совпадающее с именем, которое мы указали в файле freetdm.conf
Остальные параметры могут принимать следующие значения:
node или mode — тип узла (в скобках — допустимые синонимы): cpe (user), network (net)
switch или dialect (в скобках — допустимые синонимы): ni1, ni2, dms100, lucent5e (5ess), att4ess (4ess), euroisdn (q931), gr303eoc, gr303tmc
l1 или layer1: alaw, ulaw
dp или ton: international, national, local, private, unknown
Как вы понимаете эти параметры должен сообщить провайдер, к которому вы подключаете поток E1.
Далее, указываем куда отправлять звонки:
dialplan — диалплан, в который будет отправлен звонок: XML, YAML, Asterisk (?)
context — контекст, в который будет отправлен звонок.
Следующие параметры необязательны:
debug: q921_all, q921_raw, q921_dump, q921_state, q931_all, q931_dump, q931_state, q931_anomaly, config, apdu, aoc
overlapdial (в скобках — допустимые синонимы): yes (both), incoming (receive), outgoing (send), no
opts: suggest_channel, omit_display, omit_redirecting_number, aoc
service_message_support: true, false
Параметры типа узла, диалект, кодировку, вам должен дать провайдер телефонии.
И да, имена параметров имеют синонимы, т.е. node = mode, switch = dialect.
Настройка диалплана
Исходящие вызовы пишутся по следующему правилу:
freetdm/<span name или имя группы>/a/<destination_number>
Буква «a» может быть маленькая, а может быть и большая. Размер буквы (хе-хе) определяет, как FreeTDM будет выбирать свободные каналы в спане. «a» — снизу вверх, т.е. от первого до максимального, а «A» — сверху вниз, т.е. от максимального (31, в нашем случае) до первого.
Например, все номера начинающиеся на 9 отправлять на нашу карту
<extension name="outgoing_pri">
<condition field="destination_number" expression="^9(d+)$">
<action application="bridge" data="freetdm/e1group/a/$1"/>
</condition>
</extension>
Следующий пример, все входящие на карту звонки отправляем на extension с именем ivr_main (в моём случае меню IVR):
<extension name="pri_input">
<condition field="chan_name" expression="^(FreeTDM)">
<action application="set" data="ringback=${ru-ring}"/>
<action application="set" data="transfer_ringback=${ru-ring}"/>
<action application="transfer" data="ivr_main XML default"/>
</condition>
</extension>
Ну вот в общем как-то так.
Главный источник информации, конечно, здесь: http://wiki.freeswitch.org/wiki/FreeTDM
Там же много дополнительной информации, как то: команды CLI, заголовки SIP, канальные переменные и др.
Автор: Freeswitched