FreeSWITCH 1.3.2
dahdi - DAHDI 2.6.1+2.6.1, версия сборки 2.6.2 (parabel)
libpri - 1.4.14
конфиги Dahdi:
system.conf
Код:
# eth-tdmoe - имя интерфейса, который смотрит в плату E1
# 00:00:aa:aa:64:64 - MAC E1 интерфейса
dynamic=eth,eth-tdmoe/00:00:aa:aa:64:64/0,31,1
dynamic=eth,eth-tdmoe/00:00:aa:aa:64:64/1,31,2
dynamic=eth,eth-tdmoe/00:00:aa:aa:64:64/2,31,3
dynamic=eth,eth-tdmoe/00:00:aa:aa:64:64/3,31,4
bchan=1-15,17-31
dchan=16
bchan=32-46,48-62
dchan=47
bchan=63-77,79-93
dchan=78
bchan=94-108,110-124
dchan=109
alaw=1-15,17-31,32-46,48-62,63-77,79-93,94-108,110-124
loadzone=ru
defaultzone=ru
echocanceller=oslec,1-15,17-31,32-46,48-62,63-77,79-93,94-108,110-124
modules
Код:
# Contains the list of modules to be loaded / unloaded by /etc/init.d/dahdi.
#
# NOTE: Please add/edit /etc/modprobe.d/dahdi or /etc/modprobe.conf if you
# would like to add any module parameters.
#
# Format of this file: list of modules, each in its own line.
# Anything after a '#' is ignore, likewise trailing and leading
# whitespaces and empty lines.
# Digium TE205P/TE207P/TE210P/TE212P: PCI dual-port T1/E1/J1
# Digium TE405P/TE407P/TE410P/TE412P: PCI quad-port T1/E1/J1
# Digium TE220: PCI-Express dual-port T1/E1/J1
# Digium TE420: PCI-Express quad-port T1/E1/J1
#wct4xxp
# Digium TE120P: PCI single-port T1/E1/J1
# Digium TE121: PCI-Express single-port T1/E1/J1
# Digium TE122: PCI single-port T1/E1/J1
#wcte12xp
# Digium T100P: PCI single-port T1
# Digium E100P: PCI single-port E1
#wct1xxp
# Digium TE110P: PCI single-port T1/E1/J1
#wcte11xp
# Digium TDM2400P/AEX2400: up to 24 analog ports
# Digium TDM800P/AEX800: up to 8 analog ports
# Digium TDM410P/AEX410: up to 4 analog ports
#wctdm24xxp
# X100P - Single port FXO interface
# X101P - Single port FXO interface
#wcfxo
# Digium TDM400P: up to 4 analog ports
#wctdm
# Digium B410P: 4 NT/TE BRI ports
#wcb4xxp
# Digium TC400B: G729 / G723 Transcoding Engine
#wctc4xxp
# Xorcom Astribank Devices
#xpp_usb
конфиги фрисвича: (собирать фритдм с параметром указывающим использование libpri)
freetdm.conf
Код:
[general]
cpu_monitor => no
cpu_monitoring_interval => 1000
cpu_set_alarm_threshold => 80
cpu_reset_alarm_threshold => 70
cpu_alarm_action => warn
; MFC-R2 with Zaptel/DAHDI
[span zt pri1]
trunk_type => E1
trunk_mode => CPE
b-channel => 1-15
d-channel => 16
b-channel => 17-31
[span zt pri2]
trunk_type => E1
trunk_mode => NET
b-channel => 32-46
d-channel => 47
b-channel => 48-62
[span zt pri3]
trunk_type => E1
trunk_mode => NET
b-channel => 63-77
d-channel => 78
b-channel => 79-93
zt.conf (изменен параметр echo_cancel_level для удаления эха)
Код:
[defaults]
codec_ms => 20
wink_ms => 150
flash_ms => 750
echo_cancel_level => 128
rxgain => 0.0
txgain => 0.0
freetdm.conf.xml
GNU nano 2.2.6 Файл: /usr/local/freeswitch/conf/autoload_configs/freetdm.conf.xml
Код:
<configuration name="freetdm.conf" description="FreeTDM Configuration">
<settings>
<param name="debug" value="0"/>
</settings>
<libpri_spans>
<span name="pri1">
<param name="node" value="cpe"/>
<param name="switch" value="euroisdn"/>
<param name="l1" value="alaw"/>
<param name="dp" value="international"/>
<param name="dialplan" value="XML"/>
<param name="context" value="e1_trunk"/>
</span>
<span name="pri2">
<param name="node" value="net"/>
<param name="switch" value="euroisdn"/>
<param name="l1" value="alaw"/>
<param name="dp" value="international"/>
<param name="dialplan" value="XML"/>
<param name="context" value="e1_trunk"/>
</span>
<span name="pri3">
<param name="node" value="net"/>
<param name="switch" value="euroisdn"/>
<param name="l1" value="alaw"/>
<param name="dp" value="international"/>
<param name="dialplan" value="XML"/>
<param name="context" value="e1_trunk"/>
</span>
</libpri_spans>
</configuration>
теперь маршрутизация:
Код:
/usr/local/freeswitch/conf/dialplan/default.xml
<?xml version="1.0" encoding="utf-8"?>
<include>
<context name="default">
<extension name="to_you route name1">
<condition field="${lua is_in_local_zone.lua ${destination_number} you route name1}" expression="true">
<action application="set" data="ringback=$${ru-ring}"/>
<action application="ring_ready"/>
<action application="bridge" data="freetdm/pri3/a/${destination_number}"/>
</condition>
</extension>
<extension name="to_you route name2">
<condition field="${lua is_in_local_zone.lua ${destination_number}to_you route name2}" expression="true">
<action application="set" data="ringback=$${ru-ring}"/>
<action application="ring_ready"/>
<action application="bridge" data="freetdm/pri2/a/${destination_number}"/>
</condition>
</extension>
<extension name="to_localsip">
<condition field="${user_exists(id ${destination_number} $${domain})}" expression="true">
<action application="set" data="ringback=$${ru-ring}"/>
<action application="ring_ready"/>
<action application="bridge" data="user/${destination_number}"/>
</condition>
</extension>
<extension name="to_free_numbers">
<condition field="${lua is_in_local_zone.lua ${destination_number} freenums}" expression="true">
<action application="set" data="ringback=$${ru-ring}"/>
<action application="ring_ready"/>
<action application="bridge" data="user/538081"/>
</condition>
</extension>
<extension name="to_city">
<condition field="destination_number" expression="^(\d{2,})$">
<action application="set" data="ringback=$${ru-ring}"/>
<action application="ring_ready"/>
<action application="bridge" data="freetdm/pri1/a/$1"/>
</condition>
</extension>
</context>
<context name="e1_trunk">
<extension name="to_you route name1">
<condition field="${lua is_in_local_zone.lua ${destination_number}you route name1}" expression="true">
<action application="set" data="ringback=$${ru-ring}"/>
<action application="ring_ready"/>
<action application="bridge" data="freetdm/pri3/a/${destination_number}"/>
</condition>
</extension>
<extension name="to_you route name2">
<condition field="${lua is_in_local_zone.lua ${destination_number} you route name2}" expression="true">
<action application="set" data="ringback=$${ru-ring}"/>
<action application="ring_ready"/>
<action application="bridge" data="freetdm/pri2/a/${destination_number}"/>
</condition>
</extension>
<extension name="to_localsip">
<condition field="${user_exists(id ${destination_number} $${domain})}" expression="true">
<action application="set" data="ringback=$${ru-ring}"/>
<action application="ring_ready"/>
<action application="bridge" data="user/${destination_number}"/>
</condition>
</extension>
<extension name="to_free_numbers">
<condition field="${lua is_in_local_zone.lua ${destination_number} freenums}" expression="true">
<action application="set" data="ringback=$${ru-ring}"/>
<action application="ring_ready"/>
<action application="bridge" data="user/номер на который сливается свободная ёмкость"/>
</condition>
</extension>
<extension name="to_city">
<condition field="destination_number" expression="^(\d{2,})$">
<action application="set" data="ringback=$${ru-ring}"/>
<action application="ring_ready"/>
<action application="bridge" data="freetdm/pri1/a/$1"/>
</condition>
</extension>
</context>
</include>
текст скрипта:
Код:
-- *** script finds number in zone file ***
-- call: lua is_in_local_zone.lua <number> <local_zone_name>
-- params:
-- <number> - 6-digit phone number
-- <local_zone_name> - zone name to check number existence (without ".txt" extension)
-- zone file format:
-- csv with 6-digit numbers in each row, called <zone_name>.txt
--
local destination_number = argv[1];
local local_zone = argv[2];
freeswitch.consoleLog("INFO","[LOCAL ZONE CHECKER SCRIPT] DESTINATION: " .. destination_number .. "\n");
freeswitch.consoleLog("INFO","[LOCAL ZONE CHECKER SCRIPT] LOCAL ZONE: " .. local_zone .. "\n");
local numbers_filename = "/usr/local/freeswitch/scripts/" .. local_zone .. ".txt";
local numbers_file = io.open(numbers_filename, "r");
reply = "false";
if numbers_file then
for number in numbers_file:lines() do
if number == destination_number then
freeswitch.consoleLog("INFO","[LOCAL ZONE CHECKER SCRIPT] NUMBER FOUNDED IN FILE\n");
numbers_file:close();
reply = "true";
break;
end
end
else
freeswitch.consoleLog("ERR","[LOCAL ZONE CHECKER SCRIPT] NUMBERS FILE NOT FOUNDED\n");
end
if reply == "false" then
freeswitch.consoleLog("INFO","[LOCAL ZONE CHECKER SCRIPT] NUMBER NOT FOUNDED IN FILE\n");
end
stream:write(reply);
Таким образом получаем атс которая одним потоком смотрит в город, другими двумя в сторону 2-х выносов. часть емкости оставляет на сипе.
есть еще один косяк. нужно поправит КПВ при вызове.
поправим напишу.