В предыдущей статье мы рассказывали, как устанавливать FreeSwitch на CentOS 6.5 , сегодня же мы расскажем, как подключить FreeSWITCH к VoIP оператору и сделать входящую и исходящую маршрутизацию.
Все конфигурационные файлы FreeSWITCH представлены в формате XML, что может отпугнуть начинающих администраторов, но, на самом деле, после первой настройки страх пропадет, и вы будете удивлены производительностью и гибкостью этой платформы.
Сильными сторонами FreeSwitch являются:
- Высокая производительность и гибкость
- SIP-стек промышленного качества
- Совместимость с обработкой широкополосного (HD) звука, в том числе, и в конференциях
- Широкий диапазон поддерживаемых кодеков
- Интеграции с языками программирования
- Поддержка Multi-tenant
- Поддержка платформы Windows
Углубляться в рассказы об архитектуре мы не будем, так как на просторах интернета есть множество книг и статей, которые помогут вам в освоении данной платформы. Приступим сразу к настройке.
Добавим пару внутренних номеров
По умолчанию в FS уже есть внутренние номера с 1000 по 1019, но мы решили завести два новых номера: 1234 и 1235 и объединить их в группу вызова voipnotes.
Пример одного из номеров:
<include>
<user id="1234">
<params>
<param name="password" value="admin!123033 "/>
<param name="vm-password" value="1234"/>
<params>
<variables>
<variable name="callgroup" value="voipnotes"/>
<variables>
<user>
<include>
Подключение SIP gateway VoIP провайдера
Первым делом нужно настроить sip gateway для подключения провайдера телефонии (в нашем случае это МТТ). По умолчанию добавление/изменение существующих шлюзов производится в /usr/local/freeswitch/conf/sip_profiles/external. Создадим файл conf/sip_profiles/external/MTT.xml и поместим туда следующие данные:
<include>
<gateway name="mtt">
<param name="username" value="74997099783"/> - SIP ID( SIP аккаунт)
<param name="password" value="***********"/> - пароль от аккаунта
<param name="realm" value="voip.mtt.ru"/>
<param name="from-user" value="74997099783"/> - имя пользователя для поля From
<param name="from-domain" value="voip.mtt.ru"/> - домен для поля From
<param name="proxy" value="voip.mtt.ru"/> - сервер регистрации
<param name="expire-seconds" value="800"/> - время регистрации в секундах
<param name="register" value="true"/> - false: не посылать запросы "Register". true: посылать запросы "Register"
<param name="register-transport" value="udp"/> - используемый транспортный протокол
<param name="context" value="office"/> - контекст диалплана, который обрабатывает вызовы для этого SIP профиля и соотнесенных с ним IP адресов и портов
<gateway>
<include>
Сохраняем наш файл, переходим в консоль FS (/usr/local/freeswitch/bin/fs_cli) .
В консоли перезагружаем XML командой reloadxml. Иногда перезагрузки XML достаточно для того, чтобы изменения вступили в силу, но иногда следует воспользоваться командой reload mod_sofia. Теперь проверяем регистрацию sofia status gateway mtt.

Если все настройки были выполнены правильно, то в консоли вы увидите, что ваш шлюз зарегистрирован. Если шлюз не зарегистрировался, то в консоли вводим sofia global siptrace on и смотрим trace с логами, в поисках решения проблемы.
Входящая маршрутизация
Теперь можно перейти к настройке диалплана в conf/dialplan/*. Номерной план делится на контексты (context), которые обрабатывают вызовы для этого SIP профиля и соотнесенных с ним IP адресов и портов.
Создадим диалплан conf/dialplan/office.xml и опишем простой контекст.
<include>
<context name="office">
<extension name="from-mtt">
<condition field="destination_number" expression="^(74997099783)$">
<action application="bridge" data="user/1234@$${domain}"/>
<action application="hangup"/>
condition>
extension>
context>
include>
Небольшое пояснение про bridge и $${domain}.С помощью bridge можно установить соединение со шлюзом или другими пользователями.
Общий вид:
$${domain} это домен FreeSwitch по умолчанию, назначенный в vars.xml.
Пример маршрутизации входящего вызова на 2 номера одновременно:
<extension name="1234 and 1235">
<condition field="destination_number" expression="^(74997099783)$">
<action application="bridge" data="user/1234@$${domain},user/1235@$${domain}"/>
<action application="hangup"/>
<
condition>
<
extension>
Пример маршрутизации входящего вызова на группу:
<extension name="group_dial_voipnotes">
<condition field="destination_number" expression="^(74997099783)$">
<action application="bridge" data="group/voipnotes@$${domain}"/>
<
condition>
<
extension>
Примеры, указанные выше, довольно простые, потому что мы не хотели делать их сложными и нагружать лишним. Если хочется сделать более сложный диалплан с ivr, с маршрутизацией в зависимости от времени суток и т.д., то можно посмотреть примеры в conf/dialplan/default.xml, а мы перейдем к настройке исходящей связи.
Исходящая маршрутизация
Продолжаем настройки нашего диалплана в conf/dialplan/office.xml.Для маршрутизации вызова через шлюз используется выражение: sofia/gateway/имя_шлюза/номер.В нашем случае исходящие вызовы будут осуществляться через созданный нами выше gateway MTT
<extension name="out-moskow">
<condition field="destination_number" expression="^(84\d{9})$">
<action application="bridge" data="sofia/gateway/mtt/$1"/>
<action application="hangup"/>
<
condition>
<
extension>
Небольшое пояснение по выражению ^(84\d{9})$
^ - Указывает на начало регулярного выражения (обязательно);
(- Свидетельствует о начале регулярного блока выражения - в блоке важно определить внутренние выражения, чтобы на них можно было ссылаться на переменные $ 1, $ 2, $ 3, и т.д.;
84 - соответствует символу '84';
\ d - соответствует любой цифре;
{9} - определяет число вхождений для предыдущего выражения, т.е. ровно 9 цифр
) - Закрывает внутренний блок;
$ - Указывает на конец регулярного выражения (обязательно);
В итоге наш контекст будет выглядеть следующим образом:
<include>
<context name="office">
<extension name="from-mtt">
<condition field="destination_number" expression="^(74997099783)$">
<action application="bridge" data="user/1234@$${domain}"/>
<action application="hangup"/>
condition>
extension>
<extension name="out-moskow">
<condition field="destination_number" expression="^(84\d{9})$">
<action application="bridge" data="sofia/gateway/mtt/$1"/>
<action application="hangup"/>
condition>
extension>
context>
include>
Нам остается отредактировать файлы наших добавочных номеров conf/directory/1234.xml и 1235.xml и вставить user_context со значением office.
Тем самым, мы укажем FS, что звонки от пользователя надо обрабатывать в соответствии с нашим созданным контекстом office.Теперь перезагружаем XML из консоли FS и наслаждаемся проделанной работой.
На этом пока всё. Если вы в статье нашли ошибки или несоответствия, мы будем благодарны, если вы напишите нам о них в комментариях.