среда, 25 января 2012 г.

VXML IVR на IOS гейтвее

Ниже я покажу как создать простенькое голосовое меню на маршрутизаторе с помощью vxml-скрипта. Сам скрипт можно писать в любом текстовом редакторе, а сохранять с расширением *.vxml. Под катом подробнее..


<?xml version="1.0"?>
<vxml version="2.0" base="flash:/kit-ivr/KFB-RU.vxml">

<var name="number" expr="100"/>


<menu id="main" dtmf="false">
<property name="timeout" value="4s"/>
<prompt><audio src="flash:/kit-ivr/Rus-Woman.au"/></prompt>
<catch event="com.cisco.fax.cng"><goto next="#fax"/></catch>
<catch event="noinput"><goto next="#sek"/>  </catch>
<catch event="nomatch"><prompt bargein="false"><audio src="flash:/vxml-ivr/absent_number.wav"/></prompt><goto next="#sek"/></catch>
<choice dtmf="0" next="#eng"/>
<choice dtmf="1" next="#cash"/>
<choice dtmf="2" next="#edu"/>
<choice dtmf="3" next="#sup"/>
<choice dtmf="4" next="#nm1"/>
<choice dtmf="5" next="#sek"/>
<choice dtmf="6" next="#nm3"/>
</menu>

<menu id="eng" dtmf="false">
<property name="timeout" value="4s"/>
<prompt><audio src="flash:/kit-ivr/Eng-Man.wav"/></prompt>
<catch event="com.cisco.fax.cng"><goto next="#fax"/></catch>
<catch event="noinput"><goto next="#sek"/>  </catch>
<catch event="nomatch"><prompt bargein="false"><audio src="flash:/vxml-ivr/absent_number.wav"/></prompt><goto next="#sek"/></catch>
<choice dtmf="1" next="#cash"/>
<choice dtmf="2" next="#edu"/>
<choice dtmf="3" next="#sup"/>
<choice dtmf="4" next="#nm1"/>
<choice dtmf="6" next="#nm3"/>
</menu>

<form id="nm1">
<catch event="noinput">   <goto next="#sek"/>  </catch>
<field name="num">
<grammar type="application/grammar+regex">[0-9][0-9][0-9][0-9]</grammar>
  <filled>
   <assign name="number" expr="'phone://4'+num"/>
   <goto next="#main_nm"/>
  </filled>
</field>
</form>

<form id="nm2">
<catch event="noinput">   <goto next="#sek"/>  </catch>
<field name="num">
<grammar type="application/grammar+regex">[0-9][0-9][0-9][0-9]</grammar>
  <filled>
   <assign name="number" expr="'phone://5'+num"/>
   <goto next="#main_nm"/>
  </filled>
</field>
</form>

<form id="nm3">
<catch event="noinput">   <goto next="#sek"/>  </catch>
<field name="num">
<grammar type="application/grammar+regex">[0-9][0-9][0-9][0-9]</grammar>
  <filled>
   <assign name="number" expr="'phone://6'+num"/>
   <goto next="#main_nm"/>
  </filled>
</field>
</form>


<form id="main_nm">
<transfer connecttimeout="15s" name="mycall"  destexpr="number" bridge="true">
<catch event="error.connection.noroute error.connection.baddestination error.connection.noauthorization ">
<prompt><audio src="flash:/vxml-ivr/absent_number.wav"/></prompt>
<goto next="#sek"/>
</catch>
<filled>
<if cond="mycall == 'busy'">
   <prompt><audio src="flash:/vxml-ivr/number_busy.wav"/></prompt>
   <goto next="#sek"/>
<elseif cond="mycall == 'noanswer'"/>
   <prompt><audio src="flash:/vxml-ivr/no_answer.wav"/></prompt>
   <goto next="#sek"/>
</if>
</filled>
</transfer>
</form>     


<form id="sek">
<transfer name="mycall"  dest="phone://44002" bridge="false"> </transfer>
</form> 

<form id="sup">
<transfer name="mycall"  dest="phone://44020" bridge="true"> </transfer>
</form> 

<form id="cash">
<transfer name="mycall"  dest="phone://44013" bridge="true"> </transfer>
</form>

<form id="edu">
<transfer name="mycall"  dest="phone://44725" bridge="false"> </transfer>
</form>  

<form id="fax">
<transfer name="mycall"  dest="phone://44352" bridge="true"> </transfer>
</form>

<form id="esp">
<transfer name="mycall"  dest="phone://44729" bridge="true"> </transfer>
</form>                                                                                             
                                                                                             
                                                                                             
</vxml> 
Логика этого скрипта простая: звонит клиент и слышит приветствие Rus-Woman.au. Далее он может нажатиями кнопок заставить скрипт выполнить ряд действий. Сами dtmf-сигналы скрипт слушает в конструкциях <choice dtmf="0" next="#eng"/>, где #abc - это имя формы, на которую скрипт переходит при выборе соответствующей цифры.
После создания скрипта необходимо его вместе со всеми звуковыми файлами скопировать во флэш маршрутизатора. Затем в конфиге создать новый service и привязать его к нужному диал-пиру:
application
 service KITBroker flash:kit-ivr/KFB-RU.vxml

!
dial-peer voice 1009 pots
 description ### ISDN-IVR ###
 service kitbroker
 incoming called-number ХХХХХХХ
 direct-inward-dial
 no sip-register
!
Следует помнить, что подобные сервисы висят в памяти роутера и при каких-либо изменениях в скрипте и его повторной заливке во флэш изменения произойдут только либо после перезагрузки, либо после выполнения:
application
  no service бла-бла
  service бла-бла



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

  1. Добрый день,

    а в Вашем скрипте нет такой проблемы, что не работает consult transfer, когда секретарь пытается перевести на кого-либо?

    ОтветитьУдалить
    Ответы
    1. Здравствуйте.
      Извините за долгий ответ, был в отпуске.
      нет, на моих двух маршрутизаторах, где крутятся подобные скрипты, такой проблемы нет..собственно, данная статья - своего рода шаблон, который не претендует на идеальность..в каждом конкретном случае при возникновении каких-то проблем нужно смотреть индивидуально

      Удалить
  2. Доброго времени суток. Есть задача поставленная руководством реализовать "автосекретарь" на sip-шлюзе. Замысел такой, при входящем звонке проигрывается: "...Если знаете внутренний номер абонента, наберите. Если не знаете, оставайтесь на линии". Т.е. при наборе внутреннего номера, звонок должен передаться на callmanager, далее адресату, а при бездействии переводится также на callmanager с номером телефона секретаря. Подскажете пожалуйста, что необходимо дополнить/переделать в вашем скрипте?

    ОтветитьУдалить

Примечание. Отправлять комментарии могут только участники этого блога.