Третья часть статьи. Первая находится по адресу : http://garantum.ru/content/145-dialplan_freeswitch

Примеры диалплана Freeswitch

Примечание: если вы планируете включить своё направление в отдельный XML-файл:

пожалуйста, отключите или поменяйте направление ENUM, если вы в нём не нуждаетесь

добавьте тег и закрывающий тег

Пример 1: Вычисление условия

В приведенном ниже примере конкретное расширение будет выбрано только в случае, если IP-адрес вызывающей стороны — 192.168.1.1. Во втором условии набранный номер извлекается в переменную $1 и помещается в данные приложения "bridge", чтобы набрать IP-адрес 192.168.2.2

<extension name="Test1">
    <condition field="network_addr" expression="^192.168.1.1$"/>
    <condition field="destination_number" expression="^(d+)$">
        <action application="bridge" data="sofia/profilename/$1@192.168.2.2"/>
    </condition>
</extension>

Обратите внимание, что первая из областей условия ЗАВЕРШАЕТСЯ с помощью / !!! Последняя область условия, которая содержит действия/анти-действия, завершается обычным тегом . Также обратите внимание, что приведенный выше пример не идентичен показанному ниже:

<extension name="Test1Wrong">
    <condition field="destination_number" expression="^(d+)$"/>
    <condition field="network_addr" expression="^192.168.1.1$">
        <action application="bridge" data="sofia/profilename/$1@192.168.2.2"/>
    </condition>
</extension>

В примере с Test1Wrong вызов не будет направлен правильно, потому что переменной $1 не присвоено никакого значения, так как номер назначения соответствует другой области условия.

Вы также можете решить пример с Test1Wrong, установив переменную в первое условие, а затем используя её в действии второго условия:

<extension name="Test1_2">
    <condition field="destination_number" expression="^(d+)$">
        <action application="set" data="dialed_number=$1"/>
    </condition>
    <condition field="network_addr" expression="^192.168.1.1$">
        <action application="bridge" data="sofia/profilename/${dialed_number}@192.168.2.2"/>
    </condition>
</extension>

Обратите внимание, что нельзя использовать набор переменных, внутри направления для последующих условий, так как направление принимает значение, когда вызывается действие.

Если вам нужно совершить различные действия, основанные на наборе переменных внутри направления, необходимо либо использовать execute_extension, либо должен быть установлен переход для переменной.

Пример 2: Вычисление нескольких условий (AND)

В этом примере мы должны проверить набранный номер, начинающийся с префикса 1 И одновременно проверить IP-адрес входящего вызова.

<extension name="Test2">
    <condition field="network_addr" expression="^192.168.1.1$"/>
    <condition field="destination_number" expression="^1(d+)$">
        <action application="bridge" data="sofia/profilename/$0@192.168.2.2"/>
    </condition>
</extension>

В этом примере, несмотря на соответствие с правилом 1(d+)$, не используется переменная $1, которая может содержать только последнюю часть набранного номера, отбросив первую цифру 1. Вместо неё используется переменная $0, содержащая оригинальный номер назначения.

Пример 3: Манипулирование ведущими цифрами

В этом примере мы должны проверить набранный номер, начинающийся с 00, а также убрать первые цифры. Предполагая, что FreeSWITCH™ принимает номер 00123456789, и нам надо убрать первые цифры 00, мы можем использовать следующее направление:

<extension name="Test3.1">
    <condition field="destination_number" expression="^00(d+)$">
        <action application="bridge" data="sofia/profilename/$1@192.168.2.2"/>
    </condition>
</extension>

С другой стороны, если вы ожидаете получения нецифрового кода или хотите поверить не только цифры, используйте ".+" вместо "d+", потому что последний проверяет только цифры, в то время как ".+" сопоставит все символы от текущей позиции до конца строки:

<extension name="Test3.2">
    <condition field="destination_number" expression="^00(.+)$">
     <action application="bridge" data="sofia/profilename/$1@192.168.2.2"/>
    </condition>
</extension>

Примечание: Пожалуйста, будьте внимательны с регулярными выражениями, содержащими (.*) или (.+). Хорошей практикой является отказ от использования общих выражений, потому что нельзя полностью доверять информации от отправителя. Почти во всех диалпланах применяются числовые обозначения, так что используйте d.

Пример 4: Добавление префикса

В этом примере мы должны убрать первые цифры, как уже делали, а также поставить новый префикс перед вызываемым номером. Предполагая, что FreeSWITCH™ принимает номер 00123456789, и нам надо заменить 00 на 011, мы можем использовать следующее направление:

<extension name="Test4">
    <condition field="destination_number" expression="^00(d+)$">
        <action application="bridge" data="sofia/profilename/011$1@x.x.x.x"/>
    </condition>
</extension>

Пример 5: Профайлы SIP (набор с разными конфигурациями)

В этом примере демонстрируется применение профилей при использовании поддерживающей профили точки FreeSWITCH, такой как mod_sofia. В случае, если мы хотим использовать различные настройки (кодеки, режимы DTMF и т.д.) для отправки вызовов на разные IP-адреса, можно создавать различные профили. Например, в конфигурации sofia.conf мы видим образец профиля с именем "test", который мы переименуем в profile1 и добавим profile2 для сравнения:

<profile name="profile1">
    <param name="debug" value="1"/>
    <param name="rfc2833-pt" value="101"/>
    <param name="sip-port" value="5060"/>
    <param name="dialplan" value="XML"/>
    <param name="dtmf-duration" value="100"/>
    <param name="codec-prefs" value="PCMU@20i"/>
    <param name="codec-ms" value="20"/>
    <param name="use-rtp-timer" value="true"/>
</profile>
<profile name="profile2">
    <param name="debug" value="1"/>
    <param name="rfc2833-pt" value="101"/>
    <param name="sip-port" value="5070"/>
    <param name="dialplan" value="XML"/>
    <param name="dtmf-duration" value="100"/>
    <param name="codec-prefs" value="PCMA@20i"/>
    <param name="codec-ms" value="20"/>
    <param name="use-rtp-timer" value="true"/>
</profile>

Разница между этими двумя профилями в кодеках. Первый используеь G.711 u-law, а второй G.711 A-law. Для продолжения приведенных выше примеров мы имеем:

<extension name="Test5ulaw">
    <condition field="network_addr" expression="^192.168.1.1$"/>
    <condition field="destination_number" expression="^1(d+)$">
        <action application="bridge" data="sofia/profile1/$0@192.168.2.2"/>
    </condition>
</extension>

чтобы послать вызов на G.711 uLaw и

<extension name="Test5alaw">
    <condition field="network_addr" expression="^192.168.1.1$"/>
    <condition field="destination_number" expression="^1(d+)$">
        <action application="bridge" data="sofia/profile2/$0@192.168.2.2"/>
     </condition>
</extension>

Пример 6: Вызов зарегистрированного пользователя

Этот пример показывает, как соединиться с устройствами, зарегистрированными на вашем сервере FreeSWITCH. В этом примере мы предположим, что вы настроили профиль sofia, который называется 'local_profile', а ваши телефоны зарегистрированы с доменом example.com. Обратите внимание на '%' вместо '@' в строке данных.

<extension name="internal">
    <condition field="source" expression="mod_sofia" />
    <condition field="destination_number" expression="^(4d+)">
        <action application="bridge" data="sofia/local_profile/$0%example.com" />
    </condition>
</extension>

Пример 7: Вызов другого действия при невыполнении текущего

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

Если первое действие успешно, вызов соединяется с 1111@example1.company.com и будет существовать до тех пор, пока одна из сторон не повесит трубку. После этого никакая другая обработки не производится, так как канал абонента закрыт. (т. е.: 1111@example2.company.com не подключен.

Если певоначальный вызов на 1111@example1.company.com не был успешным, то канал не закроется и будет вызвано второе действие.

<extension name="internal">
    <condition field="destination_number" expression="^1111">
        <action application="set" data="hangup_after_bridge=true"/>
        <action application="bridge" data="sofia/local_profile/1111@example1.company.com" />
        <action application="bridge" data="sofia/local_profile/1111@example2.company.com" />
    </condition>
</extension>

Примечание: если у вас больше одного действия и применение первого действия ЗАВЕРШАЕТ соединение, второе действие НЕ будет вызвано. НЕ - ЗАВЕРШАЕТ соединение, второе действие будет вызвано.

Пример 8: Проверка аутентификации пользователя

В следующем примере требуется, чтобы абонент аутентифицировался перед проведением. Пример был взят из списка почтовой рассылки.

<extension name="9191">
    <condition field="destination_number" expression="^9191$"/>
    <condition field="${sip_authorized}" expression="true">
        <anti-action application="reject" data="407"/>
    </condition>

    <condition>
        <action application="playback" data="/tmp/itworked.wav"/>
    </condition>
</extension>

Пример 9: Перевод входящего номера (DID) на внутренний

Для маршрутизации входящих вызовов которые приходят для определенного DID на фиксированное направление 1001, делается что-то вроде следующего (из списка почтовой рассылки) (где XXXxxxxxxx это номер телефона вашего входящего DID)

В public.xml:

<extension name="test_did">
    <condition field="destination_number" expression="^(XXXxxxxxxx)$">
        <action application="transfer" data="$1 XML default"/>
    </condition>
</extension>

после чего в default.xml будет нечто похожее на расположенное в контексте по умолчанию:

<extension name="Local_Extension">
    <condition field="destination_number" expression="^(XXXxxxxxxx)$">
        <action application="set" data="dialed_ext=$1"/>
    </condition>
    <condition field="destination_number" expression="^${caller_id_number}$">
        <action application="set" data="voicemail_authorized=${sip_authorized}"/>
        <action application="answer"/>
        <action application="sleep" data="1000"/>
        <action application="voicemail" data="check default $${domain} ${dialed_ext}"/>
        <anti-action application="ring_ready"/>
        <anti-action application="set" data="call_timeout=10"/>
        <anti-action application="set" data="hangup_after_bridge=true"/>
        <anti-action application="set" data="continue_on_fail=true"/>
        <anti-action application="bridge" data="USER/1001@$${domain}"/>
        <anti-action application="answer"/>
        <anti-action application="sleep" data="1000"/>
        <anti-action application="voicemail" data="default $${domain} ${dialed_ext}"/>
    </condition>
</extension>

(номер 1001 в линии "bridge" это направление, на которое мы звоним)

Для информации, "общественные" звонки идут в публичный (public) контекст, откуда они затем переводятся в другой, более дружелюбный контекст для обработки, например, default. Именно поэтому добавляется запись для публичного контекста и 'data="$1 XML PFC"' отдаёт команду на передачу номера звонящего $1 в контекст PFC с использованием XML-диалплана. Контекст по умолчанию - это то место, где на самом деле совершается звонок.

$${domain} - переменная, которая автоматически заполняет за вас название вашего домена (чаще всего ваш IP-адрес) и номер вызывающего абонента. Просто оставьте их как есть.

Пример 10: Перевод внутреннего номера через шлюз с выбранным caller id

В этом примере мы демонстрируем исходящий звонок с десятизначного номера с направления 1000, затем перенаправляем его на шлюз asterlink.com. В этом примере показано, как перевести звонок на конкретное направление и сделать доступным использование пользовательских id для этого направления.

<extension name="asterlink.com">
    <condition field="caller_id_number" expression="^1000$"/>
    <condition field="destination_number" expression="^(d{10})$">        
        <action application="set" data="effective_caller_id_number=8001231234"/>
        <action application="set" data="effective_caller_id_name=800 Number"/>
        <action application="bridge" data="sofia/gateway/asterlink.com/1208$1"/>
    </condition>
</extension>

© Внимание! Все права на перевод принадлежат фирме Гарантум. При ссылке или цитировании данной информации обязательно вставляйте ссылку на источник.