пятница, 25 марта 2016 г.

IVR скрипт для Cisco Call Manager

Доброго времени суток!

Сегодня разберем простейший IVR скрипт на vxml. На работе часто бывают случаи, когда нужно настроить автоответчик для правильного распределение звонка. Если у вас станция Cisco Call Manager Express, то удобнее будет это сделать на vxml. Начнём!

Voice XML - это язык XML, которая способствует взаимодействию абонента с приложением. VXML состоит из form и menuform может использоваться для сбора данных от звонящего, для проигрывания подсказки (prompt) и т.д.. menu позволяет выбрать абоненту различные меню и переводят его к другим form или menu.  Давайте попробуем кратко разобрать простой vxml скрипт:

<?xml version="1.0"?>
<vxml version="2.0" base="flash:IVR.vxml">

<var name="number"/> --------- Объявляем переменную number

<form id="main">       ---------- Создаем form с именем main
<property name="timeout" value="5s"/> 
<block> 
<prompt> 
<audio src="flash:/IVR/WelcomePromt-Alaw.wav"/> ----- Указываем расположение файла Приветствие (Приветствие говорит: Здравствуйте! Вы позвонили ...... Наберите номер абонента или ждите ответа оператора)
</prompt>
</block>
<field name="get_phone_num" type="number"> ------- Используется для сбора набранного номера от звонящего. Тип вводимых данных номер. (Может быть boolean, date)
<grammar type="application/grammar+regex">[0-9][0-9][0-9][0-9]</grammar> ---- Формат набираемого номера четырехзначный
  <filled>
   <assign expr="'phone://'+get_phone_num" name="number"/> ---- Назначаем значение
   <goto next="#TransferToDestNumber"/> ----- переводим в другой form для перевода звонка
  </filled>
</field>
<catch event="noinput">   <goto next="#sek"/>  </catch>  ---- Если абонент ничего не нажал, то переводим его в form sek.
</form>


<form id="TransferToDestNumber">  ---------- Создаем form с именем TransferToDestNumber
<transfer name="mycall" connecttimeout="20s" destexpr="number" bridge="true"> --- Звонок переводится в набранный номер
<filled>
<if cond="mycall == 'busy'">
   <prompt><audio src="flash:/IVR/busy-1.wav"/></prompt> ---- Проигрывается указанный звуковой файл, если набираемый номер занят
<elseif cond="mycall == 'noanswer'"/>
   <prompt><audio src="flash:/IVR/absent.wav"/></prompt> ------ Проигрывается указанный звуковой файл, если набираемый номер не отвечает.
</if>
</filled>
</transfer>
</form>

<form id="sek"> --------- Создаем form с именем sek
<transfer name="mycall" connecttimeout="30s" dest="phone://1010" bridge="true"> 
<filled>
<if cond="mycall == 'busy'">
   <prompt><audio src="flash:/IVR/busy-1.wav"/></prompt>
<elseif cond="mycall == 'noanswer'"/>
   <prompt><audio src="flash:/IVR/absent.wav"/></prompt>
</if>
</filled>
</transfer>
</form>

</vxml>


Вот и всё. В данном скрипте не было примера с menu. Возможно будет в следующих статьях. Удачного всем дня!

2 комментария:

  1. Нурхат, здравствуйте!
    Прошу Вашей помощи вот с какой хитрой проблемой со входящим DTMF.
    Буду безмерно благодарен за хоть какие-то мысли как побороть проблему. Своей головы уже совершенно не хватает...

    Дано:
    Cisco 2900, CME, IVR на входящем dial-peer.
    SIP транк от провайдера с вышестоящей HuaweiSoftX3000
    DTMF Payload type 97 (a=fmtp:97 0-15)

    Исходящие DTMF победил с помощью
    "rtp payload-type nte 97" и, самое важное: "voice-class sip dtmf-relay force rtp-nte" - без этой команды DTMF ходить не хотел, хоть и payload type согласованный.

    А вот со входящим DTMF беда - как только не крутил, но не проходит, хоть ты тресни. Скрипт рабочий - проверял звонком не на внешний номер, а на внутренний, на котором висит IVR. Пересмотрел уже кучу debug'ов, по-разному крутил настройки - безрезультатно.

    Единственно, что смущает, если пристально смотреть SDP, то от провайдера приходит, "a=fmtp:97 0-15", а Cisco отдаёт "a=fmtp:97 0-16".
    Насколько я понял, это лишь говорит о том, что Cisco поддерживает hook flash и никак влиять не должно. По крайней мере исходящие DTMF работают без проблем.

    Озадачил уже провайдера этим вопросом, но пока всё традиционно: "у нас всё хорошо". Может есть ещё какая скрытая команда типа "voice-class sip dtmf-relay force rtp-nte" которая поможет с входящим DTMF при нестандартном payload type?

    ОтветитьУдалить
    Ответы
    1. Добрый день! Извиняюсь за поздний ответ. Можете скинуть конфиг входящего диал-пира, где крутится IVR ?

      Удалить