Установка Freeswitch

Thank you for reading this post, don't forget to subscribe!

FreeSWITCH — откры­тая теле­фон­ная плат­фор­ма, рас­про­стра­ня­е­мая в исход­ных кодах, создан­ная для удо­вле­тво­ре­ния потреб­но­сти в управ­ля­е­мых голо­сом или тек­стом систе­мах, мас­шта­би­ру­е­мых от софт­фонa до софт­сви­чa. FreeSWITCH может быть исполь­зо­ван в каче­стве ком­му­та­то­ра, АТС, медиа шлю­за или медиа сер­ве­ра для при­ло­же­ний IVR, исполь­зу­ю­щих про­стые или XML скрип­ты для управ­ле­ния алго­рит­мом обра­бот­ки звон­ка. FreeSWITCH под­дер­жи­ва­ет раз­ные про­то­ко­лы, такие как SIP, H.323, IAX2 и Google Talk, что поз­во­ля­ет вза­и­мо­дей­ство­вать c sipX, OpenPBX, Bayonne, Yate, или Asterisk.

 

1 Спо­соб авто­ма­ти­че­ская установка:

Для уста­нов­ки Freeswitch в CentOS 7 под­клю­чим epel репо­зи­та­рий от freeswitch. Под­клю­че­ние репо­зи­та­рия идет через RPM пакет с сер­ве­ров раз­ра­бот­чи­ка. Для это­го выпол­ним в кон­со­ли сле­ду­ю­щую команду.

Далее уста­но­вим сам freeswitch.

По окон­ча­нии уста­нов­ки добав­ля­ем в авто­за­груз­ку командой.

и можем запускать

Про­ве­ря­ем кор­рект­ность запус­ка вхо­дом в кон­соль. выпол­ня­ем коман­ду fs_cli.

На этом уста­нов­ка freeswitch на CentOS закончена.

 

2 Спо­соб сбор­ка из исходников

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

Сна­ча­ла реко­мен­ду­ет­ся отклю­чить Selinux, для это­го необ­хо­ди­мо поме­нять в фай­ле /etc/selinux/config поме­нять зна­че­ние пара­мет­ра SELINUX с enforsing на disabled

Сле­ду­ю­щим шагом необ­хо­ди­мо выпол­нить обнов­ле­ние систе­мы, запус­ка­ет­ся коман­дой yum update

Так­же реко­мен­ду­ет­ся уста­но­вить базо­вые сер­вер­ные ути­ли­ты, коман­дой yum groupinstall Base

После выпол­не­ния дан­ных шагов необ­хо­ди­мо пере­за­гру­зить сер­вер коман­дой reboot

После загруз­ки про­ве­рить ста­тус Selinux, коман­дой sestatusрезуль­тат дол­жен выдать disabled

Далее нуж­но уста­но­вить веб-серв­ре и mysql. В каче­стве веб-сер­ве­ра исполь­зу­ет­ся Apache, в каче­стве mysql — Mariadb.

Уста­нов­ка Apache про­из­во­дит­ся командой

yum install httpd

После уста­нов­ки необ­хо­ди­мо запу­стить Apache b доба­вить его в авто­за­пуск, командами

systemctl start httpd и
systemctl enable httpd .

 

Далее необ­хо­ди­мо уста­но­вить Mariadb, командой
yum install mariadb-server mariadb

Так­же реко­мен­ду­ет­ся выпол­нить пер­во­на­чаль­ную настрой­ку Mariadb с помо­щью коман­ды mysql_secure_installation

Так­же необ­хо­ди­мо уста­но­вить допол­ни­тель­ные зависимости:

yum install php php-pdo php-mysql sqlite-devel pcre-devel speex-devel libedit-devel bison patch ncurses-devel unixODBC-devel openssl-devel gnutls-devel libogg-devel autoconf automake gcc-c++ git-core libjpeg-devel libtool libjpeg-devel kernel-devel git xz-devel mesa-dri-drivers libXv libXScrnSaver xorg-x11-fonts* libXScrnSaver curl-devel libtiff-devel libjpeg-devel subversion fontconfig libICE libSM libX11 libXau libxcb libXcursor libXext libXfixes libXi libXinerama libXrandr libXrender libXScrnSaver libXv portaudio portaudio-devel

Так­же реко­мен­ду­ет­ся уста­но­вить и настро­ить ODBC кон­нек­тор, если он отсут­ству­ет в системе:

yum install unixODBC-devel mysql-connector-odbc

Далее необ­хо­ди­мо настро­ить ODBC с помо­щью фай­ла /etc/odbcinst.ini в боль­шин­стве слу­ча­ев нет необ­хо­ди­мо­сти вно­сить прав­ки. Ниже при­ве­ден при­мер­ный вид дан­но­го фай­ла — сек­ция [MySQL]

Далее необ­хо­ди­мо запол­нить файл /etc/odbc.ini при его отсут­ствии — необ­хо­ди­мо создать и вне­сти в него сле­ду­ю­щие данные:

Далее необ­хо­ди­мо ска­чать через git исход­ный код FreeSwitch.
Для это­го необ­хо­ди­мо перей­ти в дирек­то­рию /usr/src и выпол­нить команду:

git clone -b v1.8 https://freeswitch.org/stash/scm/fs/freeswitch.git  freeswitch

Далее перей­ти в дирек­то­рию с кодом: cd /usr/src/freeswitch

И запу­стить кон­фи­гу­ра­цию коман­дой ./bootstrap.sh -j

Далее перед про­дол­же­ни­ем уста­нов­ки реко­мен­ду­ет­ся рас­ком­мен­ти­ро­вать допол­ни­тель­ные моду­ли в фай­ле modules.conf

При­мер­ный вид при­ве­ден ниже на скриншоте:

Далее необ­хо­ди­мо запу­стить про­дол­же­ние кон­фи­гу­ра­ции командой

./configure –enable-portable-binary –prefix=/usr –localstatedir=/var –sysconfdir=/etc –with-gnu-ld –with-openssl –enable-core-odbc-support –enable-zrtp –enable-static-v8 –disable-parallel-build-v8 

при удач­ном кон­фи­гу­ри­ро­ва­нии будет выдан спи­сок дирек­то­рий, с кото­ры­ми рабо­та­ет FreeSwitch

Далее вызы­ва­ем коман­ду make

Если выпол­не­ние make пре­ры­ва­ет­ся сооб­ще­ни­ем Neither yasm nor nasm have been found необ­хо­ди­мо уста­но­вить ути­ли­ту yasm c помо­щью git: git clone https://github.com/yasm/yasm.git && cd yasm && ./autogen.sh && make && make install
После успеш­ной уста­нов­ки  – долж­но отоб­ра­зит­ся пред­ло­же­ние выпол­нить make install.

Для пол­ной уста­нов­ки вызы­ва­ет­ся команда

make install

После уста­нов­ки, отоб­ра­зит­ся опо­ве­ще­ние об успеш­ном раз­во­ра­чи­ва­нии FreeSwitch, а так­же  будут пред­ло­же­ны даль­ней­шие шаги: уста­нов­ка зву­ко­вых фай­лов, апгрейд вер­сии FreeSwitch, уста­нов­ка кон­фи­гу­ра­ци­он­ных фай­лов по-умолчанию.

Далее реко­мен­ду­ет­ся уста­но­вить стан­дарт­ные аудио­фай­лы раз­лич­но­го каче­ства в англо­языч­ном и рус­ско­языч­ном фор­ма­тах, а так­же фай­лы музы­ки в ожидании.

Так­же опци­о­наль­но аудио­фай­лы мож­но уста­но­вить в луч­шем каче­стве: HD, Ultra HD и CD<strong><br> <br> </strong>

Напри­мер:

Сле­ду­ю­щим шагом необ­хо­ди­мо создать поль­зо­ва­те­ля FreeSwitch и уста­но­вить пра­ва на фай­лы и дирек­то­рии FreeSwitch, а так­же создать дирек­то­рию для PID-файла:

А так­же необ­хо­ди­мо ско­пи­ро­вать файл юни­та для запус­ка FreeSwitch

Реко­мен­ду­ет­ся при­ве­сти его к сле­ду­ю­ще­му виду:

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

И про­пи­сать в него сле­ду­ю­щие параметры:

Далее — про­из­во­дит­ся пере­за­пуск служ­бы daemon и запус­ка­ет­ся служ­ба FreeSwitch:

Коман­дой systemctl status freeswitch.service мож­но про­ве­рить ста­тус службы

Вход в кон­соль FreeSwitch про­из­во­дит­ся командой

fs_cli

Для выхо­да из кон­со­ли исполь­зу­ет­ся соче­та­ние кла­виш Ctrl+d

======================================================================

 

Настройка

Freeswitch в систе­ме мож­но пред­ста­вить схе­ма­ти­че­ски сле­ду­ю­щим образом:

Здесь 10.200.16.215 – это IP адрес сете­во­го интер­фей­са ens32 сер­ве­ра Linux.

По умол­ча­нию в Freeswitch уже созда­ны номе­ра 1000 – 1019. У всех номе­ров задан стан­дарт­ный пароль реги­стра­ции 1234. И если Iptables про­пус­ка­ет SIP и RTP тра­фик, то на сер­ве­ре мож­но сра­зу заре­ги­стри­ро­вать­ся, исполь­зуя порт 5060 по умолчанию.
После реги­стра­ции на freeswitch с номе­ром 1000 с паро­лем по умол­ча­нию мож­но позво­нить на номер 5000 и услы­шать при­вет­ствие freeswitch. Здесь так же мож­но про­те­сти­ро­вать неко­то­рые воз­мож­но­сти freeswitch. При тести­ро­ва­нии нуж­но убе­дить­ся, что firewall про­пус­ка­ет тра­фик! (на вре­мя теста firewall мож­но вооб­ще отключить)

Вход в кон­соль freeswitch
# fs_cli

Выход из консоли
freeswitch@internal> control-D

Фай­лы конфигурации

Кон­фи­гу­ра­ция freeswitch лежит здесь
/usr/local/freeswitch/conf/

Струк­ту­ра ката­ло­га основ­ных кон­фи­гу­ра­ци­он­ных файлов:
autoload_configs – ката­лог загру­жа­е­мых при стар­те систе­мы модулей
dialplan – ката­лог пла­нов набо­ра. Здесь для каж­до­го пла­на набо­ра созда­ет­ся xml файл с общим опи­са­ни­ем и ката­лог с деталь­ным опи­са­ни­ем пла­нов набо­ров раз­лич­ных направ­ле­ний. Пла­ны набо­ра направ­ле­ний под­гру­жа­ют­ся по оче­ре­ди по алфа­ви­ту, поэто­му луч­ше пла­ны набо­ра начи­нать назы­вать циф­ра­ми, что бы обес­пе­чить пра­виль­ную после­до­ва­тель­ность загрузки.
    default
        00_in.xml
        01_in_supp.xml
    default.xml
directory – ката­лог с опи­са­ни­ем або­нент­ских номе­ров, кото­рые будут под­клю­чать­ся и рабо­тать через Freeswitch. Здесь есть файл с общим опи­са­ни­ем поль­зо­ва­те­лей и их групп и одно­имен­ная пап­ка, содер­жа­щая мно­же­ство фай­лов. Каж­дый файл соот­вет­ству­ет одно­му абоненту.
    default
        1000.xml – опи­са­ние або­нен­та с номе­ром 1000
        1001.xml – опи­са­ние або­нен­та с номе­ром 1001
        ….
        1019.xml
        default.xml
    default.xml
sip_profiles – ката­лог содер­жа­щий про­фи­ли сер­ве­ра Freeswitch. Глав­ные пара­мет­ры про­фи­ля – это то, IP адрес и порт, на кото­ром рабо­та­ет это SIP про­филь. В про­стей­шем слу­чае име­ет­ся один про­филь, рабо­та­ю­щий на всех IP адре­сах сер­ве­ра и пор­ту 5060. В кон­фи­гу­ра­ции по умол­ча­нию созда­но два про­фи­ля. Пер­вый про­филь Internal, рабо­та­ю­щий на пор­ту 5060, вто­рой про­филь external, рабо­та­ю­щий на пор­ту 5080. Дирек­то­рия, име­ю­щая тоже назва­ние, что и имя про­фи­ля содер­жит опи­са­ние внеш­них кана­лов сер­ве­ра Freeswitch – сущ­но­стей gateway.
    external
        example.xml
    external.xml
    internal.xml
vars.xml – файл, опре­де­ля­ю­щий ряд гло­баль­ных пере­мен­ных, кото­рые мож­но исполь­зо­вать при постро­е­нии кон­фи­гу­ра­ци­он­ных файлов.
Допу­стим необ­хо­ди­мо реа­ли­зо­вать следующую

схе­му, как пока­за­но на рисунке:

И або­нен­ты и внеш­ний стык рабо­та­ют на пор­ту 5060 – поэто­му необ­хо­дим толь­ко один про­филь SIP. Осталь­ные про­фи­ли в могут быть уда­ле­ны в пап­ке sip_profiles (а луч­ше пере­име­но­ва­ны для буду­ще­го под­смат­ри­ва­ния), что бы в при загруз­ке Freeswitch их «не видел». Фай­лы мож­но пере­име­но­вать таким обра­зом, что бы они не име­ли рас­ши­ре­ние xml, а име­ли рас­ши­ре­ние напри­мер такое: xml.removed.
Необ­хо­ди­мая струк­ту­ра фай­лов будет иметь вид:

Исклю­че­ние ненуж­ных про­фи­лей из кон­фи­гу­ра­ции Freeswitch:
# cd /usr/local/freeswitch/conf/sip_profiles
# mv internal-ipv6.xml internal-ipv6.xml.removed
# mv external-ipv6.xml external-ipv6.xml.removed
# mv internal.xml internal.xml.removed
# mv external.xml external.xml.removed
# mv external/example.xml external/example.xml.removed
# mv external-ipv6/example.xml external-ipv6/example.xml.removed
# mv ../directory/default/example.com.xml ../directory/default/example.com.xml.removed
# systemctl restart freeswitch
Убеж­да­ем­ся, что ни один про­филь не загружен:

fs_cli

После исклю­че­ния из кон­фи­гу­ра­ции про­фи­лей по умол­ча­нию, пор­ты 5060, 5061, 5080, 5081 более не прослушиваются.
Отклю­ча­ем модуль VERTO, кото­рый раз­ре­ша­ет рабо­тать Freeswitch с теле­фо­на­ми-бра­у­зе­ра­ми по пор­там 8081, 8082, 1337 с исполь­зо­ва­ни­ем стан­дар­та WEBRTC:
# nano /usr/local/freeswitch/conf /autoload_configs/modules.conf.xml
Ком­мен­ти­ру­ем строку:
<load module="mod_verto"/>
Долж­но получиться:
<!--<load module="mod_verto"/> -->
Настра­и­ва­ем Freeswitch на рабо­ту с систе­мой mod_event_socket на пор­ту 8021. Это необ­хо­ди­мо для управ­ле­ния Freeswitch через API. Раз­ре­ша­ем при­ни­мать запро­сы на пор­ту 8021.
# nano /usr/local/freeswitch/conf/autoload_configs/event_socket.conf.xml
Меня­ем строку
<param name="listen-ip" value="::"/>
на:
<param name="listen-ip" value="0.0.0.0"/>
Откры­ва­ем пор­ты RTP в диа­па­зоне 8000 – 32768
# nano autoload_configs/switch.conf.xml
При­во­дим блок RTP port range  к виду
<!-- RTP port range -->
<param name="rtp-start-port" value="8000"/>
<param name="rtp-end-port" value="32768"/>
Пере­за­гру­жа­ем сервис:
# systemctl restart freeswitch.service
Про­ве­ря­ем пор­ты, кото­рые слу­ша­ет Freeswitch:
# netstat -ltupn | grep freesw
tcp    0  0 0.0.0.0:8021  0.0.0.0:*   LISTEN  16208/freeswitch

Для того, что бы Freeswitch мог рабо­тать по сети вно­сим мини­маль­ные прав­ки в iptables. Напри­мер, так:
# nano /etc/sysconfig/iptables
-A INPUT -p udp -m udp --dport 5060 -j ACCEPT
-A INPUT -p udp -m udp --dport 8000:32768 -j ACCEPT
# systemctl restart iptables.service
Здесь мы откры­ва­ем всем порт 5060 для при­е­ма SIP сооб­ще­ний и пор­ты 8000 – 32768 для при­е­ма RTP трафика.

Нача­ло конфигурирования

Теперь мож­но при­сту­пить к кон­фи­гу­ри­ро­ва­нию соб­ствен­но­го про­фи­ля, кана­лов и настрой­ке систе­мы Freeswitch
При кон­фи­гу­ри­ро­ва­нии систе­мы после добав­ле­ния новых фай­лов кон­фи­гу­ра­ции необ­хо­ди­мо выполнять:
# chown -R freeswitch:freeswitch /usr/local/freeswitch/conf/
# chmod -R 770 /usr/local/freeswitch/conf/
# fs_cli
> reloadxml
или просто
# fs_cli -x "reloadxml"
При гло­баль­ный изме­не­ния (не про­сто добав­ле­нии ново­го або­нен­та), нуж­но рестар­то­вать весь Freeswitch командой:
# systemctl restart freeswitch

Сме­на паро­ля кли­ен­там по умол­ча­нию для всех кли­ен­тов freeswitch выпол­ня­ет­ся так:
# cd /usr/local/freeswitch/conf
# nano vars.xml
Меня­ем пароль 1234 в строке
<X-PRE-PROCESS cmd="set" data="default_password=1234"/>
Напри­мер на что-то более суровое:
<X-PRE-PROCESS cmd="set" data="default_password=12345678"/>
Затем при­ме­ня­ем изме­не­ния в кон­со­ли fs выполняем
> reloadxml
> sofia profile restart all

Запись собы­тий (логов) freeswitch в файл:
Под­го­тав­ли­ва­ем лог-файл:
# touch /var/log/freeswitch.log
# chown freeswitch:freeswitch /var/log/freeswitch.log
Пра­вим кон­фи­гу­ра­цию freeswitch:
# nano /usr/local/freeswitch/conf/autoload_configs/logfile.conf.xml
Ищем строку
<!--<param name="logfile" value="/var/log/freeswitch.log"/>-->
Для запи­си лог в файл стро­ку нуж­но рас­ком­мен­ти­ро­вать, а для это­го убрать xml ком­мен­та­рии <!-- и -->. Долж­но получиться:
<param name="logfile" value="/var/log/freeswitch.log"/>
Рас­ком­мен­ти­ро­вать и изме­нить стро­ку с пара­мет­ром maximum-rotate
<param name="maximum-rotate" value="5"/>
И потом вот эту строч­ку, опре­де­ля­ю­щую мак­си­маль­ный раз­мер файла::
<param name="rollover" value="10485760"/>
Пере­за­пус­ка­ем freeswitch:
# systemctl restart freeswitch.service

Ино­гда лог-фай­лы freeswitch пере­пол­ня­ют­ся и Freeswitch не может нор­маль­но рабо­тать. При этом в кон­со­ли fs_cli посто­ян­но сыпят­ся логи:
2016-05-21 19:00:25.931136 [NOTICE] mod_logfile.c:213 New log started.
2016-05-21 19:00:25.931136 [NOTICE] mod_logfile.c:213 New log started.

В этом слу­чае необ­хо­ди­мо оста­но­вить freeswitch
# systemctl stop freeswitch.service

Затем уда­лить файл логов и вновь создать его
# rm -f /var/log/freeswitch.log
# touch /var/log/freeswitch.log
# chown freeswitch:freeswitch /var/log/freeswitch.log

Затем запу­стить Freeswitch заново:
# systemctl restart freeswitch.service

Уста­нов­ка рус­ских зву­ков в freeswitch
# cd /usr/local/freeswitch/conf
# nano vars.xml

Встав­ля­ем строку
<X-PRE-PROCESS cmd="set" data="default_language=ru"/>
В кон­со­ли fs выполняем
> reloadxml

Созда­ние ново­го профиля:

# /usr/local/freeswitch/conf
# touch sip_profiles/supportsvttk.xml
# nano sip_profiles/supportsvttk.xml
Содер­жи­мое файла

[codesyntax lang="xml" blockstate="collapsed"]

[/codesyntax]

Созда­ние пап­ки для фай­лов с опи­са­ни­ем кана­лов – шлю­зов – gateway-ев
# mkdir sip_profiles/supportsvttk
Добав­ля­ем пра­ва на создан­ные фай­лы и пап­ки и перезагружаемся:
# systemctl restart freeswitch
Про­ве­ря­ем в кон­со­ли Freeswitch и убеж­да­ем­ся, что наш про­филь загрузился:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Про­ве­ря­ем пор­ты, слу­ша­ю­щие Freeswitch:

После изме­не­ния пара­мет­ров про­фи­ля, его пере­за­груз­ку мож­но выпол­нить так:
# fs_cli -x "sofia profile supportsvttk killgw samara-ast1" && sleep 30 && fs_cli -x "sofia profile supportsvttk rescan"

Созда­ние опи­са­ния абонентов

Созда­дим трех або­нен­тов – 11, 12, 50
# cd /usr/local/freeswitch/conf/directory
Созда­ем общий файл опи­са­ния абонентов
# touch supportsvttk.xml
Содер­жи­мое файла:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Домен sip.svttk.ru дол­жен быть про­пи­сан в DNS. В нашем слу­чае на Ip 10.200.16.215
Далее созда­ем пап­ку, где для каж­до­го або­нен­та будет созда­вать­ся отдель­ный файл с его описанием:
# mkdir supportsvttk
Нако­нец фай­лы або­нен­тов созда­ем по шаблону:
# touch supportsvttk/11.xml
# nano supportsvttk/11.xml
Содер­жи­мое файла:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Ана­ло­гич­но созда­ют­ся и дру­гие фай­лы 12.xml и 50.xml
Про­бу­ем заре­ги­стри­ро­вать­ся на сер­ве­ре 10.200.16.215 на пор­ту 5060 с логи­ном 11, 12 или 50 и паро­лем 12345xyz.
Настрой­ки ZoyPer:

Реги­стра­ция про­шла успешно.

ри реги­стра­ции в кон­со­ли будет писаться:
2016-05-15 18:27:39.192559 [WARNING] sofia_reg.c:1775 SIP auth challenge (REGISTER) on sofia profile 'supportsvttk' for [11@sip.svttk.ru] from ip 10.10.69.141
2016-05-15 18:27:39.212547 [DEBUG] sofia_reg.c:3002 IP [10.10.69.141] passed ACL check [10.10.69.0/24,192.168.1.0/24]

Про­вер­ка ста­ту­са реги­стра­ции абонентов
Для всех абонентов:
> sofia status profile supportsvttk reg
Для кон­крет­но­го абонента
> sofia status profile supportsvttk reg 11
Или для кон­крет­но­го або­нен­та мож­но посмот­реть и так
> sofia status profile supportsvttk reg 11@10.10.69.141

Обно­вить реги­стра­цию кон­крет­но­го абонента
> sofia profile supportsvttk flush_inbound_reg 11@10.10.69.141  reboot
Если не напи­сать, кого сбра­сы­ва­ем, то обну­лять­ся все регистрации.
> sofia profile supportsvttk flush_inbound_reg  reboot

Диа­лог SUBSCRIBE и NOTIFY.

В опи­сан­ной настрой­ке не исполь­зу­ет­ся диа­лог SUBSCRIBE и NOTIFY. Этот диа­лог раз­ре­ша­ет поль­зо­ва­те­лю под­пи­сать­ся на собы­тия сер­ве­ра и полу­чать пери­о­ди­че­ски уве­дом­ле­ния о его состо­я­нии. Вклю­че­ние это­го диа­ло­га выпол­ня­ет­ся на
- SIP кли­ен­те. В ZoyPer «Subscribe for MWI»=«both»
- На сер­ве­ре freeswitch в sip про­фи­ле пара­метр <param name="manage-presence" value="true"/>
Диа­лог SUBSCRIBE и NOTIFY выгля­дит так, как пока­за­но ниже. При этом про­вер­ка состо­я­ния кли­ен­та запро­са­ми OPTION не производиться.

Дру­гие вари­ан­ты диа­ло­га, при выклю­чен­ной воз­мож­но­сти на Freeswitch и при выклю­чен­ной воз­мож­но­сти на сто­роне клиента:

В послед­нем слу­чае Freeswitch в теку­щей кон­фи­гу­ра­ции будет про­ве­рять состо­я­ние кли­ен­та запро­са­ми OPTION.

Созда­ние внут­рен­не­го пла­на набора

Созда­дим базо­вую кон­фи­гу­ра­цию dialplan и дадим воз­мож­ность або­нен­там зво­нить друг другу.
# cd /usr/local/freeswitch/conf
# touch dialplan/supportsvttk.xml
# nano dialplan/supportsvttk.xml
Содер­жи­мое файла:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Этот файл опи­сы­ва­ет пра­ви­ла обра­бот­ки и предот­вра­ще­ния петель.
Далее созда­ем пап­ку, где будут хра­нить­ся пра­ви­ла набора:
# mkdir dialplan/supportsvttk
# touch dialplan/supportsvttk/01_internal.xml
# nano dialplan/supportsvttk/01_internal.xml
Содер­жи­мое файла:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Меня­ем пра­ва на создан­ные фай­лы и рестартуемся.
Теперь або­нен­ты 11,12 и 50 могут позво­нить друг дру­гу по корот­ким номе­рам. Вызы­ва­е­мый або­нент уви­дит в АОН корот­кий номер вызы­ва­ю­ще­го абонента.

Исхо­дя­щая и вхо­дя­щая связь. Asterisk.
Связь с внеш­ним миром (с ТфОП) будет обес­пе­чи­вать­ся через сер­вер Asterisk и стан­цию Si3000 ISKRATEL.
Соеди­не­ние с Asterisk про­ис­хо­дит с помо­щью номе­ра 2057553

Вхо­дя­щие вызо­вы на 2057553 направ­ля­ют­ся на внут­рен­ний номер 12.
Кон­фи­гу­ра­ция Asterisk:
Файл /etc/asterisk/extensions.conf:
[test-2057553]
exten => _XXXXXXX,1,Dial(${OUTTRUNKSI}/${EXTEN},120,t)
exten => _XXXXXXX,n,Hangup()
exten => _8XXXXXXXXXX,1,Dial(${OUTTRUNKSI}/${EXTEN},120,t)
exten => _8XXXXXXXXXX,n,Hangup()
;Во вхо­дя­щем кон­тек­сте со сто­ро­ны Si3000:
exten => 2057553,1,Dial(SIP/2057553gw/${EXTEN},120,t)
exten => 2057553,n,Hangup()
Файл /etc/asterisk/extensions.conf:
[2057553gw] ; тест Freeswitch
type=peer
host=10.200.16.215
port=5060
context=test-2057553
dtmfmode=rfc2833
deny=0.0.0.0/0.0.0.0
permit=10.200.16.215/255.255.255.255
insecure=port,invite
qualify=yes
disallow=all
allow=ulaw
allow=alaw

Созда­ем файл кон­фи­гу­ра­ции шлю­за на Freeswitch на номер 2057553.
# touch sip_profiles/supportsvttk/gw2057553.xml
# nano sip_profiles/supportsvttk/gw2057553.xml
Содер­жи­мое фай­ла опи­са­ние кана­лов - gateways:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Для того что бы Freeswitch уста­но­вил соеди­не­ние с IP уда­лен­но­го сер­ве­ра, как вид­но доста­точ­но ука­зать этот IP адрес в пере­мен­ной realm. Это воз­мож­но пото­му, что часть пере­мен­ных, при их отсут­ствии заме­ня­ет­ся выше­сто­я­щи­ми. На рисун­ке пока­за­на зави­си­мость зна­че­ний неко­то­рых пара­мет­ров друг от дру­га в опи­са­нии gateway:

Пара­метр gateway name – самый глав­ный, его обя­за­тель­но нуж­но ука­зы­вать. Пара­метр realm, если не ука­за­но дру­гое, при­ни­ма­ет зна­че­ние gateway name. Пара­метр from-domain, если не ука­за­но дру­гое, при­ни­ма­ет зна­че­ние realm и т.д.

Для того что бы раз­ре­шить Asterisk-у уста­нав­ли­вать соеди­не­ния с Freeswitch без реги­стра­ции необ­хо­ди­мо на Freeswitch создать спи­сок досту­па – ACL, имя кото­ро­го будет ука­за­но в пере­мен­ной apply-inbound-acl фай­ла sip-про­фи­ля sip_profiles/supportsvttk.xml. В создан­ном ранее sip-про­фи­ле имя это­го спис­ка досту­па alcgw.
<param name="apply-inbound-acl" value="alcgw"/>
Спи­сок досту­па alcgw созда­ет­ся в фай­ле autoload_configs/acl.conf.xml
# nano autoload_configs/acl.conf.xml
Добав­ля­ем меж­ду тега­ми  <network-lists> и  </network-lists> блок:
<list name="alcgw" default="deny">
<node type="allow" cidr="10.200.104.12/32"/>
</list>
При попа­да­нии вхо­дя­ще­го вызо­ва в ACL авто­ри­за­ция запра­ши­вать­ся не будет. Это спра­вед­ли­во и для фай­лов  из sip_profiles и для фай­лов из directory.
При­ме­ня­ем к создан­ным фай­лам пра­ва поль­зо­ва­те­ля freeswitch и рестар­ту­ем сер­вис Freeswitch.
# chown -R freeswitch:freeswitch /usr/local/freeswitch/conf/
# chmod -R 770 /usr/local/freeswitch/conf/
# systemctl restart freeswitch.service
Про­ве­ря­ем состо­я­ние создан­но­го канала:
Ста­тус на Asterisk:

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

После изме­не­ния пара­мет­ров опи­са­ния шлю­за (фай­ла gw2057553.xml), его рестарт мож­но выпол­нить так:
# fs_cli -x "sofia profile supptechttk stop" && sleep 30 && fs_cli -x "sofia profile supptechttk start"

Созда­ем фай­лы опи­са­ния диал­пла­нов вхо­дя­щей и исхо­дя­щей связи:
# touch dialplan/supportsvttk/10_in.xml
# touch dialplan/supportsvttk/20_out.xml
# nano dialplan/supportsvttk/10_in.xml
Содер­жи­мое файла:

<include>
<extension name="call_in">
<condition field="destination_number" expression="^(2057553)$">
<!-- Звоним -->
<action application="bridge" data="user/12@sip.svttk.ru"/>
<!-- Кла­дем трубку -->
<action application="hangup"/>
</condition>
</extension>
</include>
# nano dialplan/supportsvttk/20_out.xml
Содер­жи­мое фай­ла, раз­ре­ша­ю­ще­го зво­нить на 7ми знач­ные номера:
<include>
<extension name="call_out">
<condition field="destination_number" expression="^([2-9][0-9]{6})$">
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="continue_on_fail=true"/>
<!--Выстав­ля­ем номер и имя у вызы­ва­ю­ще­го або­нен­та через дан­ный шлюз-->
<action application="set" data="effective_caller_id_number=2057553"/>
<action application="set" data="effective_caller_id_name=2057553"/>
<action application="bridge" data="sofia/gateway/samara-ast1/$1"/>
<action application="hangup"/>
</condition>
</extension>
</include>
Теперь мож­но зво­нить в город по ТфОП и при­ни­мать вхо­дя­щие вызо­вы на номер 2057553 або­нен­том 12. При выхо­де в город в каче­стве АОН будет под­став­лять­ся номер 2057553.
При уста­нов­ле­нии вызо­ва от або­нен­та, каж­дый раз будет про­хо­дить про­це­ду­ра авто­ри­за­ции або­нен­та. При этом на Freeswitch для кли­ен­та будут ини­ци­ро­вать­ся пере­мен­ные из про­фи­ля поль­зо­ва­те­ля, кото­рым мож­но в послед­ствии мани­пу­ли­ро­вать.  Нор­маль­ная про­це­ду­ра авто­ри­за­ции при уста­нов­ле­нии вызова:

Для трас­си­ров­ки вызо­вов во Freeswitch суще­ству­ют коман­ды, вклю­ча­ю­щие трас­си­ров­ки на профиле:
Вклю­че­ние / выклю­че­ние трас­си­ров­ки в кон­со­ли Freeswitch:
> sofia profile supportsvttk siptrace on
> sofia profile supportsvttk siptrace off
При вклю­чен­ной трас­си­ров­ки в кон­соль будут вва­лить­ся SIP сооб­ще­ния вме­сте с основ­ны­ми событиями:

Изме­нить сте­пень дета­ли­за­ции логов кон­со­ли мож­но так:
> console loglevel 7 (режим DEBUG)
> console loglevel 6 (по умол­ча­нию INFO)
> console loglevel – пока­жет теку­щий режим консоли
Уров­ни логи­ро­ва­ния могут быть такие:
0 "CONSOLE",
1 "ALERT",
2 "CRIT",
3 "ERR",
4 "WARNING",
5 "NOTICE",
6 "INFO",
7 "DEBUG"

Исхо­дя­щая и вхо­дя­щая связь. Si3000.

# touch sip_profiles/supportsvttk/gw9938103.xml
# nano sip_profiles/supportsvttk/gw9938103.xml
Содер­жи­мое файла:
<gateway name="samara-si3000">
<param name="username" value="xxx"/><!--Можно ука­зать любое имя, глав­ное, что бы оно было-->
<param name="password" value="yyy"/><!--Можно ука­зать любой пароль, глав­ное, что бы он был-->
<param name="register" value="false"/>
<param name="realm" value="10.200.101.11"/>
<param name="from-domain" value="sip.svttk.ru"/>
<!-- допол­ни­тель­ные пара­мет­ры, если на уда­лен­ном сер­ве­ре нуж­но регистрироваться -->
<!-- При это нуж­но выста­вить  name="register" value="true" -->
<!--<param name="proxy" value="10.200.101.11"/>-->
<!--<param name="register-proxy" value="10.200.101.11"/>-->
<!--<param name="expire-seconds" value="3600"/>--> <!--Пери­од регистрации-->
<!--<param name="retry-seconds" value="30"/>--> <!--Коли­че­ство сек ожи­да­ния перед повтор­ной реги­стра­ци­ей, если реги­стра­ция вдруг была неудачной-->
<!--<param name="ping" value="25"/>--> <!--ОТправ­лять ping каж­дые 25 сек. При неот­ве­те счи­та­ет шлюз ава­рий­ным и реги­стра­цию прерываем -->
<param name="context" value="supportsvttk"/><!-- Кон­текст для вхо­дя­щих вызовов-->
<param name="caller-id-in-from" value="true"/> <!-- Исполь­зо­вать АОН вхо­дя­ще­го вызо­ва в поле from исх вызо­вов через этот шлюз-->
<!--<param name="contact-params" value="tport=tcp"/>--> <!--extra sip params to send in the contact-->
</gateway>
Добав­ля­ем марш­рут для вхо­дя­щей связи:
# nano dialplan/supportsvttk/10_in.xml
При­во­дим файл к виду:
<include>
<extension name="call_in">
<condition field="destination_number" expression="^(2057553)$">
<!-- Звоним -->
<action application="bridge" data="user/12@sip.svttk.ru"/>
<!-- Кла­дем трубку -->
<action application="hangup"/>
</condition>
</extension>
<extension name="call_in_si3000">
<condition field="destination_number" expression="^(9938103)$">
<!-- Звоним -->
<action application="bridge" data="user/11@sip.svttk.ru"/>
<!-- Кла­дем трубку -->
<action application="hangup"/>
</condition>
</extension>
</include>
Раз­ре­ша­ем Si3000 соеди­нять­ся с Freeswitch без регистрации:
# nano autoload_configs/acl.conf.xml
Меня­ем ACL – alcgw. Добав­ля­ем туда IP 10.200.101.11.
<list name="alcgw" default="deny">
<node type="allow" cidr="10.200.104.12/32"/>
<node type="allow" cidr="10.200.101.11/32"/>
</list>
# chown -R freeswitch:freeswitch /usr/local/freeswitch/conf/
# chmod -R 770 /usr/local/freeswitch/conf/
# systemctl restart freeswitch.service
При рабо­те со стан­ци­ей Si3000 нуж­но иметь вви­ду, что стан­ция SI3000 для обме­на сиг­наль­ны­ми сооб­ще­ни­я­ми исполь­зу­ет­ся один ip адрес (в нашем слу­чае – 10.200.101.11), а для обме­на RTP сооб­ще­ни­я­ми – дру­гие IP адре­са (в нашем слу­чае – 10.200.101.13). IP адрес 10.200.101.13 не нуж­но добав­лять в  ACL alcgw.
В опи­сан­ной кон­фи­гу­ра­ции RTP сооб­ще­ния будут про­хо­дить через Freeswitch. Исполь­зуя опцию bypass_media мож­но раз­ре­шить обмен сооб­ще­ни­я­ми RTP меж­ду конеч­ны­ми точ­ка­ми напрямую.
Диа­грам­ма рабо­ты Freswitch с Si3000 при вхо­дя­щем вызо­ве будет следующей: