Как я писал ранее, мы в своем офисе используем уже около года IP ATC Askozia на базе Asterisk.
Askozia — это коммерческий продукт, цена на который равна стоимости одного IP телефона.
Сегодня я хочу рассказать подробнее о редакторе маршрутов вызовов, который входит в расширенную версию Askozia.
Редактор позволяет создавать неограниченное количество диалпланов Asterisk, используя простой визуальный конструктор. Для построения маршрутов используется более 60 отдельных модулей. Каждый модуль транслируется в одну или несколько команд диалплана Asterisk, а сам маршрут формирует необходимые конфигурационные файлы, которые используются ядром телефонной системы для обработки вызовов.
Каждому маршруту назначается отдельный внутренний номер, а сама панель администрирования выглядит вот так:
Давайте подробнее рассмотрим несколько типовых шаблонов и тот код, который они генерируют:
Простой пример голосового меню
При входящем звонке система снимает трубку, проигрывает приветствие, которое можно указать в специальном блоке или сразу записать с помощью телефона, после чего ожидает 5 секунд для набора добавочного номера. Далее, в зависимости от указанного номера, происходит вызов того или иного абонента. Если ввели неправильный номер, то сработает блок с буквой i, если в течение 5-ти секунд ничего не набрали, то сработает блок t. Соответственно, в двух последних случаях абонент услышит сигнал «занято».
Этот маршрут вызова создает следующий диалплан Asterisk:
[CALLFLOW-1401202953509d662fafd39]
; Askozia call flow - CALLFLOW-1401202953509d662fafd39
exten => CALLFLOW-START,1(module-1),Answer(0)
exten => CALLFLOW-START,n(module-2),Background(/storage/usbdisk1/askoziapbx/media/sounds/cfe/cfe_uploaded_file_1358338827)
exten => CALLFLOW-START,n,WaitExten(5)
exten => 1,1(module-3),Goto(CALLFLOW-1401202953509d662fafd39-SUB-3,submodule,1)
exten => 2,1(module-4),Goto(CALLFLOW-1401202953509d662fafd39-SUB-4,submodule,1)
exten => i,1(module-5),Goto(CALLFLOW-1401202953509d662fafd39-SUB-5,submodule,1)
exten => t,1(module-12),Goto(CALLFLOW-1401202953509d662fafd39-SUB-12,submodule,1)
[CALLFLOW-1401202953509d662fafd39-SUB-3]
exten => submodule,1(module-6),Dial(SIP/101,10,go)
exten => submodule,n(module-9),Hangup()
[CALLFLOW-1401202953509d662fafd39-SUB-4]
exten => submodule,1(module-7),Dial(SIP/102,10,go)
exten => submodule,n(module-10),Hangup()
[CALLFLOW-1401202953509d662fafd39-SUB-5]
exten => submodule,1(module-8),Busy(3)
exten => submodule,n(module-11),Hangup()
[CALLFLOW-1401202953509d662fafd39-SUB-12]
exten => submodule,1(module-13),Busy(3)
exten => submodule,n(module-14),Hangup()
Пример простой очереди вызовов с 3-мя статическими агентами
Данный блок позволяет принимать большее количество звонков. Если все агенты будут заняты разговором, то абонент ставится на удержание в очередь и ожидает пока кто-либо из агентов освободится и сможет обработать звонок, если в течение 600 секунд ни один из агентов не смог обработать вызов, абонент услышит сигнал «занято».
Этот маршрут вызова создает следующий диалплан Asterisk:
[CALLFLOW-1401202953509d662fafd39]
; Askozia call flow - CALLFLOW-1401202953509d662fafd39
exten => CALLFLOW-START,1(module-1),Answer(0)
exten => CALLFLOW-START,n,QueueLog(CALLFLOW-1401202953509d662fafd39-QUEUE-2,${UNIQUEID},NONE,CALLERID,${CALLERID(all)},,${CUSTOM1},${CUSTOM2},${CUSTOM3})
exten => CALLFLOW-START,n(module-2),Queue(CALLFLOW-1401202953509d662fafd39-QUEUE-2,Ct,,,600)
exten => CALLFLOW-START,n,QueueLog(CALLFLOW-1401202953509d662fafd39-QUEUE-2,${UNIQUEID},NONE,QUEUETIMEOUT,${CDR(duration)},${CDR(billsec)})
exten => CALLFLOW-START,n(module-8),Busy(3)
exten => CALLFLOW-START,n(module-9),Hangup()
Настройка очереди:
[CALLFLOW-1401202953509d662fafd39-QUEUE-2]
music = default
strategy=ringall
timeout=10
wrapuptime=30
ringinuse=yes
periodic-announce-frequency = 20
announce-holdtime=no
joinempty=no
leavewhenempty=no
member => SIP/101
member => SIP/102
member => SIP/103
Запись и отправка разговора на электронную почту
Пример позволяет записывать все разговоры с внутренним номером и отправлять их на электронную почту указанную в настройках модуля отправки.
Этот маршрут вызова создает следующий диалплан Asterisk:
[CALLFLOW-1401202953509d662fafd39]
; Askozia call flow - CALLFLOW-1401202953509d662fafd39
exten => CALLFLOW-START,1(module-1),Answer(0)
exten => CALLFLOW-START,n(module-2),Monitor(wav,/tmp/monitor-${UNIQUEID},m)
exten => CALLFLOW-START,n(module-3),Dial(SIP/101,10,go)
exten => CALLFLOW-START,n(module-4),StopMonitor()
exten => CALLFLOW-START,n,System(sleep 1)
exten => CALLFLOW-START,n,Set(MONITOR_FILENAME=/tmp/monitor-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "Date: `date`" > /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "To: rec@mail.ru" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "Subject: AskoziaPBX Notification: Monitored call, Caller: ${CALLERID(all)}" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "From: AskoziaPBX call flow <info@miko.ru>" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "X-Mailer: AskoziaPBX" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "Content-Type: multipart/mixed; boundary="EMAIL-44c364e83c7e7fd0bb50b238094a1780"n" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "--EMAIL-44c364e83c7e7fd0bb50b238094a1780" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "Content-Type: text/plain; format=flowed; charset=UTF-8" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "Content-Disposition: inline" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "Content-Transfer-Encoding: 8bitn" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "Your Records" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "--EMAIL-44c364e83c7e7fd0bb50b238094a1780" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "Content-Type: audio/x-wav; name="monitor-${UNIQUEID}.wav"" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "Content-Transfer-Encoding: base64" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "Content-Disposition: attachment; filename="monitor-${UNIQUEID}.wav"" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(uuencode -m /tmp/monitor-${UNIQUEID}.wav monitor-${UNIQUEID}.wav >> /tmp/email-attachment-${UNIQUEID})
exten => CALLFLOW-START,n,System(cat /tmp/email-attachment-${UNIQUEID} | tail +2 >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(echo "--EMAIL-44c364e83c7e7fd0bb50b238094a1780--" >> /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(/usr/bin/msmtp -C /etc/msmtp.conf -t < /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(rm -f /tmp/email-${UNIQUEID})
exten => CALLFLOW-START,n,System(rm -f /tmp/email-attachment-${UNIQUEID})
exten => CALLFLOW-START,n,System(rm -f /tmp/.monitor-${UNIQUEID}.wav)
exten => CALLFLOW-START,n(module-5),Hangup()
Маршрутизация по расписанию
На этой схеме изображен пример маршрутизации звонка в зависимости от времени суток и дня недели. Например в рабочие часы все звонки идут на секретаря, а в нерабочее время на голосовую почту.
В данном маршруте используется механизм генерации речи, который позволяет проговаривать абоненту фразы, указанные в настройках модуля. К сожалению, только на английском языке, поэтому для русскоговорящих абонентов эти блоки можно заменить проигрыванием заранее записанных фрагментов речи.
Этот маршрут вызова создает следующий диалплан Asterisk:
; 123
[CALLFLOW-1401202953509d662fafd39]
; Askozia call flow - CALLFLOW-1401202953509d662fafd39
exten => CALLFLOW-START,1(module-2),Answer(0)
exten => CALLFLOW-START,n(module-6),NoOp(TimeSwitch module: 2))
exten => CALLFLOW-START,n,GotoIfTime(09:00-16:00,mon-fri,*,*?module-8)
exten => CALLFLOW-START,n,Goto(module-9)
exten => CALLFLOW-START,n(module-8),Playback(/storage/usbdisk1/askoziapbx/media/sounds/cfe/speech_8_CALLFLOW-1401202953509d662fafd39)
exten => CALLFLOW-START,n(module-11),Dial(SIP/101,10,go)
exten => CALLFLOW-START,n(module-13),Hangup()
exten => CALLFLOW-START,n(module-9),Playback(/storage/usbdisk1/askoziapbx/media/sounds/cfe/speech_9_CALLFLOW-1401202953509d662fafd39)
exten => CALLFLOW-START,n(module-10),Hangup()
Видео демонстрация работы с конструктором
Ролики англоязычные, но я добавил в них русские субтитры, чтобы было понятно происходящее.
Заключение
Согласитесь, что писать маршрут вызова, используя конструктор, намного удобнее простого кодирования, однако, в большинстве, случаев нужно понимать, как пишутся и работают Asterisk диалпланы, чтобы построить более-менее рабочий маршрут вызовов.
Более подробно про Askoizia можно почитать на сайте http://www.askozia.ru
Описание всех модулей доступно на http://wiki.askozia.ru
Автор: jorikfon