Как стать автором
Обновить

Введение в FreeSWITCH, часть вторая

Время на прочтение4 мин
Количество просмотров36K
О FreeSWITCH
Первая часть

Номерной план



Итак, у FreeSWITCH можно подкрутить множество настроек, но основное действо будет происходить в номерном плане. Номерной план располагается в conf/dialplan/*. Как обычно препроцессинг собирает все файлы из этой папки в один. Номерной план делится на контексты (context). То есть следуя настройкам в SIP профиле, настройкам пользователя, выбирается соотвествующий контекст и звонок обрабатывается в соответствии с модулями (extension, переводится на русский как «добавочный номер», но не соответствует смыслу).



Создайте conf/dialplan/simple.xml, поместим туда пример простого контекста НП:
<?xml version="1.0" encoding="utf-8"?>            
<!-- http://wiki.freeswitch.org/wiki/Dialplan_XML -->
<!-- Тег include служит для обозначения части, которую надо вставить в родительский XML -->
<include>
  <!-- Маленький, но очень функциональный контекст НП! -->
  <context name="simple">
    <!-- Модуль защиты от закольцовывания звонков, name служит просто для названия,
         полезно при отладке. -->
    <extension name="unloop">
      <!-- condition - условие, проверять можно любые переменные, не только входящий номер.
           Первой проверяется константа - включена ли защита от петель -->
      <condition field="$${unroll_loops}" expression="^true$"/>
      <!-- Есть ли петля? -->
      <condition field="${sip_looped_call}" expression="^true$">
        <!-- А вот теперь, раз условия выполнены, переходим к действиям.
             Действия это application. Например здесь используется действие deflect, которое
             сообщает источнику (originator) звонка о необходимости выбора другого маршрута. -->
        <action application="deflect" data="${destination_number}"/>
      </condition>
    </extension>

    <extension name="testplay">
      <!-- Проверяем входящий номер (destination_number). Верно если совпадает с 7878 -->
      <condition field="destination_number" expression="^7878$">
        <!-- Берем трубку -->
        <action application="answer"/>
        <!-- Выжидаем -->
        <action application="sleep" data="1000"/>
        <!-- Поем песни -->
        <action application="playback" data="/opt/freeswitch/sounds/site/nikogo_net_doma.wav"/>
        <!-- Кладем трубку -->
        <action application="hangup"/>
      </condition>
    </extension>

  </context>
</include>



Отредактируйте файл conf/directory/1000.xml, и выставьте user_context в значение simple. Этим вы скажет FreeSWITCH что звонки от пользователя 1000 надо обрабатывать в соответствии с контекстом simple. Зарегистриуйтесь на сервере с именем пользователя 1000, паролем 1234 и в качестве realm и адреса сервера выставьте IP адрес сервера. Попробуйте позвонить по номеру 7878 (файл wav надо положить по соответствующему адресу, иначе ничего не услышите).

Playback это одно из возможных приложения номерного плана. Полный список возможных действий на wiki проекта.

Bridge


Очень важным приложением является bridge. С его помощью можно установить соединение с шлюзом, другим пользователем. Общий вид:
<action application=«bridge» data=«sofia/имя профиля сип/номер@адрес или домен сервера»/>

Можно вызвать набрать несколько адресов одновременно:
<action application=«bridge» data=«sofia/internal/1000@$${domain},sofia/internal/1000@$${domain}»/>

Последовательно:
<action application=«bridge» data=«sofia/internal/1000@$${domain}|sofia/internal/1000@$${domain}»/>

При помощи приложения «set» можно выставить переменную call_timeout, которая ограничит время попытки дозвона.

Теперь, вооружившись этим знанием, можем написать еще один модуль (extension) для звонков локальным пользователям:
    <extension name="testcall">
      <condition field="destination_number" expression="^(10[01][0-9])$">
        <!-- Звоним -->
        <action application="bridge" data="user/$1@$${domain}"/>
        <!-- Кладем трубку -->
        <action application="hangup"/>
      </condition>
    </extension>


Здесь видим параметр приложения bridge — user/$1@$${domain}. Разберем подробнее, $1 это результат вычисления регулярного выражения в condition, а именно содержимое первых скобок. user — стандартная точка назначения (endpoint) служащая для вызова зарегистрированных пользователей, требует указания корректного домена.

Помимо точки назначения user основная точка это sofia. Синтаксис выглядит так: sofia/профиль/номер@адрес_узла. Параметр профиль задает тот виртуальный SIP сервер, с адреса и порта которого будет произведен вызов.

Второй вариант использования sofia это посыл вызова через шлюз: sofia/gateway/имя_шлюза/номер. Например модуль для звонка в Москву через sipnet:

    <extension name="moskow">
      <condition field="destination_number" expression="^(8495\d{7})])$">
        <!-- Звоним -->
        <action application="bridge" data="sofia/gateway/sipnet/$1"/>
        <!-- Кладем трубку -->
        <action application="hangup"/>
      </condition>
    </extension>


На этом пока всё. Исследуйте номерной план идущий в комплекте, читайте wiki, а я пока подумаю над продолжением.
Теги:
Хабы:
Всего голосов 4: ↑2 и ↓20
Комментарии10

Публикации