Asterisk: Автоматическое Информирование Вызываемого Абонента Перед Подключением К Оператору

Всем привет! Я решил поделиться собственным опытом использования некоторых возможностей Диалплана.

Данная заметка не претендует на звание научного открытия, но как краткий справочный лист может кому-нибудь пригодиться.

Исходные данные: Сервер с Asterisk 1.8, без Web-интерфейса, настроенный как телефонный шлюз-маршрутизатор.

Конфигурация задается путем редактирования файлов конфигурации в каталоге /etc/asterisk/.

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

Кому интересно, добро пожаловать под кат. При входящем звонке вызывающий абонент слышит приветствие и сообщение IVR (это настраивается в большом колл-центре с веб-интерфейсом, похожим на стандартную FreePBX), включающее сообщение «сообщение записывается».

Возникла необходимость воспроизвести это же сообщение при звонке операторов колл-центра абонентам.

В веб-интерфейсе нет возможности добавить такую функцию, поэтому пришлось импровизировать.

На данный момент сервер с функциями голосового шлюза воспроизводит сообщение вызываемым абонентам, если вызывающие номера удовлетворяют заданному условию, а также уведомляет звонящего о возможности разговора.

Часть диалплана, отвечающая за сообщение: Скрытый текст

  
   

[call-centr-context] etxen => _X.,n,Macro(SayAllCallsRec) [macro-SayAllCallsRec] exten => s,1,NoOp(${CALLERID(num}) exten => s,n,GotoIf($["${CALLERID(num)}" = "123456789"]Эsay) ; Other numbers here. NO FULL if-then-else! exten => s,n(notsay),NoOp() exten => s,n,Dial(SIP/${MACRO_EXTEN}@TrunkOut,50) exten => s,n,GoTo(end) exten => s,n(say),NoOp() exten => s,n,Set(LIMIT_PLAYAUDIO_CALLER=yes) exten => s,n,Set(LIMIT_PLAYAUDIO_CALLEE=no) exten => s,n,Set(LIMIT_CONNECT_FILE=/var/lib/asterisk/sounds/beep) exten => s,n,Dial(SIP/${MACRO_EXTEN}@TrunkOut,50,L(9999999)A(/var/lib/asterisk/sounds/AllCallsRec)) exten => s,n,Goto(end) exten => s,n(end),NoOp() exten => s,n,HangUp()

Этот раздел диалплана работает и протестирован.

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

Теперь давайте пройдемся по некоторым направлениям.

В контексте, к которому принадлежит транк Колл-центра, общее расширение «Для любого номера» (_X.) передает вызов макросу, где происходит следующее: — Проверка «белого» списка.

- Возьми трубку, — Воспроизведение CPV, — Сообщение вызываемому абоненту, — Сообщение звонящему.

К сожалению, ошибка (или функция), описанная еще в 2007 году ( доказательство ) с неодновременным файловым сообщением «LIMIT_CONNECT_FILE» все еще существует в версии 1.8, и нет возможности обновить сервер.

Таким образом, если вы попытаетесь оповестить обоих участников звонка с помощью флагов LIMIT_PLAYAUDIO_CALLER=yes, LIMIT_PLAYAUDIO_CALLEE=yes, сообщение будет воспроизведено последовательно.

Сначала - абоненту Б, затем - абоненту А, а у другого абонента в этот момент будет тишина.

Теперь давайте посмотрим на диалплан.

Начнем с команды вызова, так как она самая длинная.

Dial(SIP/${MACRO_EXTEN}@TrunkOut — вызов будет маршрутизироваться с номером, переданным в макрос на магистрали «TrunkOut».

,50 — Будем ждать ответа до 50 секунд. ,L(9999999) — ограничение времени соединения в миллисекундах (не обязательно, но другого способа сообщить звонящему, что вызываемый абонент прослушал «приветствие», не было).

A(путь к файлу) — сообщение вызываемому абоненту exten => s,n,Set(LIMIT_PLAYAUDIO_CALLER=yes) — Воспроизведение для вызывающего абонента exten => s,n,Set(LIMIT_PLAYAUDIO_CALLEE=no) — Воспроизведение для вызываемого абонента exten => s,n,Set(LIMIT_CONNECT_FILE=/var/lib/asterisk/sounds/beep) — Путь к файлу для воспроизведения.

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

В нашем случае тот, кто звонит ИЗ колл-центра.

И, собственно, как пошагово выглядит сам вызов: Абонент колл-центра набирает номер.

Звонок приходит на шлюз Asterisk. Вызов попадает в макрос.

Номер А сравнивается со списком.

При несовпадении вызов продолжается без дополнительных ключей.

Если есть совпадение, ключи добавляются к вызову.

Абонент Б берет трубку и прослушивает сообщение (Клавиша А()).

В этот момент у абонента А наступит тишина (после долгих гудков).

По завершении сообщения абонент А услышит звук из файла «beep.gsm» (должен находиться в каталоге /var/lib/asterisk/sounds/).

По какой причине конкретно в формате gsm не понятно.

И только после этого каналы будут подключены.

Вы также можете заменить тишину для абонента А звуковыми сигналами CPB. Для этого нужно изменить строки:

exten => s,n(say),NoOp() exten => s,n,Answer() exten => s,n,Playtones(420) exten => s,n,Set(LIMIT_PLAYAUDIO_CALLER=yes) exten => s,n,Set(LIMIT_PLAYAUDIO_CALLEE=no) exten => s,n,Set(LIMIT_CONNECT_FILE=/var/lib/asterisk/sounds/beep) exten => s,n,Dial(SIP/${MACRO_EXTEN}@TrunkOut,50,L(9999999)A(/var/lib/asterisk/sounds/AllCallsRec))

Добавлен Answer() - канал собирается, и Playtones() - проигрывается CPV. В этом случае вызывающий абонент получит сигналы CPV, генерируемые шлюзом Asterisk. К сожалению, в этом случае сообщения RTP перед подключением от вышестоящих серверов будут заменены звуковыми сигналами.

Например, оставшееся без ответа сообщение «Абоненту нельзя позвонить» с сотовых телефонов и тому подобное, которое фактически не приводит к созданию канала (ответ 200 — ОК), будет проигнорировано, а вызывающий абонент получит звук вида (длинный гудки, длинные гудки, короткие гудки.

), но паузы молчания не будет. Также можно добавить клавишу r в Dial() - генерацию системного CPB, но она будет выбрана конкретно из системных звуков и будет (чаще всего) сильно отличаться от классического звука обратного вызова.

Вот и все.

Я надеюсь, что этот пост поможет кому-то еще сэкономить день или два, пытаясь заставить шлюз выполнить необходимую последовательность действий.

Теги: #asterisk #диалплан #asterisk

Вместе с данным постом часто просматривают: