Подключение плат Digium E1 во FreeSWITCH

    Digium TE12x
    В данной статье на примере однопортовой E1 карты Digium TE121P рассмотрим пример подключения её во FreeSWITCH на операционной системе CentOS.

    Физическое подключение


    Физическое подключение вам по идее должен обеспечивать провайдер телефонии. На карте предусмотрен 75-омный разъём RJ-45.
    У нас, например, для подключения к провайдеру используются модемы NSGate NS-200/SB-LE с портами E1+LAN+V.35, очень рекомендую, сразу можно подключить у провайдера по одной выделенной линии и E1 и Ethernet.
    Распиновку кабеля можно посмотреть здесь.
    Когда карта подключится к провайдеру, лампочка на ней загорится зелёным, если, конечно, вы всё правильно настроите, как описано далее.

    Настройка


    Для работы платы необходимо установить и настроить три компоненты:
    1. libPRI — это библиотека, предназначенная для работы с потоковыми TDM-интерфейсами ISDN: PRI (Primary Rate Interface) и BRI (Basic Rate Interface).
    2. DAHDI — драйверы для плат производства Digium.
    3. 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_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, канальные переменные и др.
    Поделиться публикацией

    Похожие публикации

    Комментарии 12

      0
      dahdi_monitor ещё есть, для настройки tx/rx gain может помочь
        0
        Спасибо за статью, а вы рассматривали аналоги Digium на пример продукцию Openvox и Atcom, если да то почему другие варинты не подошли?
          0
          Нет, не рассматривали ни Openvox ни Atcom, почему — внятно не скажу, кто-то испугал, типа — не бери. Хотя, наверно, зря. Ещё есть вариант Sangoma, если интересно, могу и про неё статью написать.
            0
            С большим удовольствием почитал бы про Sangoma. А с платами FXS и FXO у вас был опыт, интересует также производитель и возникшие проблемы.
              0
              Да, именно Sangoma FXO. Проблемы две: никогда не берите аналоговую плату без эходава (я на этом сильно погорел), и залипают звонки.
                0
                Звонки залипают, вероятно по тому, что не настроили реакцию карты на BUSY TONE. К сожалению на разных станциях он разный.
                  0
                  А подскажите пожалуйста, где и как это настраивается? Может я что-то не так делаю…
                    0
                    Вам нужно записать тон отбоя (позвонить в город, на другой стороне положить трубку и записать гудки) проанализировать частоту тона, каденс, длительность и настроить dahdi что-то вроде:

                    busydetect=yes
                    busycount=6
                    busypattern=500,500
                    cadence=125,125,2000,-4000
          0
          А почему эхоподавитель выбрали mg2 а не hpec/oslec? Сравнивали качество?
            0
            Да нет, не сравнивали. Как-то не заморачивались, этот работает и работает.
              0
              По моим субъективным ощущениям — лидер — Ослик. За ним — hpec, mg2 — в отстающих, kb1 завершает этот рейтинг.
              0
              Еще бы такую статью как с FXO и FXS платами что править!!!

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое