Всем привет! Я решил поделиться собственным опытом использования некоторых возможностей Диалплана.
Данная заметка не претендует на звание научного открытия, но как краткий справочный лист может кому-нибудь пригодиться.
Исходные данные: Сервер с 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
-
Функционализм В Лингвистике
19 Oct, 24 -
Открытый Исходный Код Для (Почти) Всего
19 Oct, 24 -
Китай В Который Раз Блокирует Youtube
19 Oct, 24 -
Не Нужно Начинать Стартап, Начните Бизнес
19 Oct, 24