Настройка очередей звонков в Asterisk

Организация любого Call-центра начинается с правильной организации очередей. В статье рассмотрим конфигурацию и примеры необходимых настроек через командную строку (правка конфигурационных файлов). Настройку через FreePBX рассматривать не будем.
Набор базовых команд
Создание и настройка очереди
Параметры очереди
Глобальные параметры для очередей
Добавление агентов к очереди
Статические
Динамические
Аутентификация агентов
Диалплан для очереди
Отправка звонка в очередь
Приветствие
Приоритеты звонков
Системные голоса на русском
Базовые команды по работе с очередями
Команды выполняются из консоли asterisk:
asterisk -c || asterisk -r
1. Просмотр очередей и их статуса:
> queue show
Пример ответа:
support has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
Members:
SIP/102 with penalty 1 (ringinuse enabled) (Unavailable) has taken no calls yet
SIP/101 with penalty 1 (ringinuse enabled) (Not in use) has taken no calls yet
No Callers
* в данном примере в очереди зарегистрировано 2 оператора и нет звонков (No Callers)
2. Просмотр конкретной очереди:
> queue show support
3. Количество звонков в очереди.
Смотрим вышеописанной командой:
> queue show support
При наличие активных вызовов, мы увидим что-то на подобие:
...
Callers:
1. SIP/101-000000be (wait: 0:01, prio: 0)
4. Перезапуск очереди:
Синтаксис:
> queue reload <параметр> [<имя очереди>]
* возможны следующие параметры:
- members — перечитывает состав агентов.
- parameters — перезапуск параметров.
- rules — правил.
- all — всего вышеперечисленного.
* если имя очереди не указано, перезапуск выполняется для всех очередей.
Пример:
> queue reload all
Создание и настройка очереди
Очередь создается и настраивается в конфигурационном файле queues.conf:
vi /etc/asterisk/queues.conf
И добавляем:
[support]
strategy = ringall
announce-frequency = 45
* в данном примере мы создаем очередь с названием support и стратегией ringall (одновременный звонок всем операторам).
* чтобы создать очередь, достаточно определить только стратегию (strategy).
Открываем консоль Asterisk и перечитываем конфиги:
asterisk -c
> core reload
Параметры очереди
Опции, которые применяются для настройки создаваемой очереди:
Параметр | Описание | По умолчанию |
---|---|---|
announce-frequency | Как часто напоминать ожидающему в очереди абоненту, что его звонок важен для нас. | 45 |
announce-holdtime | Нужно ли объявлять, сколько времени нужно еще ждать. | yes |
announce-position | Объявлять позицию в очереди. | yes |
autofill | Способ организации очереди. Если yes — общая очередь ко всем операторам, попадаем к тому, кто первый освободиться. Если no — при постановке на очередь идет сразу закрепление за определенным оператором. | yes |
autopause | Ставить ли на паузу оператора, который не ответил на звонок. | no |
autopausebusy | Ставить ли на паузу оператора, который не ответил на звонок, так как был занят. | no |
autopausedelay | Время ожидания, после которого включается автопауза для абонента. | 0 |
autopauseunavail | Включение автопаузы, если оператор недоступен. | yes |
joinempty | Перечень статусов, при которых, все-равно, выполняется присоединение к очереди. | paused, penalty, inuse, ringing |
leavewhenempty | Перечисление статусов, при которых оператор покидает очередь. Возможные варианты:
|
no |
maxlen | Глубина очереди (ожидание). | 11 |
memberdelay | Пауза в секундах перед соединением абонента с оператором. | 0 |
monitor-type | Программа, с помощью которой идет запись разговора. | mixmonitor |
penaltymemberslimit | Не использовать пенальти, если зарегистрировано заданное количество операторов или меньше. | 5 |
periodic-announce-frequency | Не объявлять, что все операторы заняты. | 0 |
queue-callswaiting | Звуковой файл объявлений в очереди. | queue-callswaiting |
queue-thankyou | Звуковой файл «Спасибо, что позвонили». | queue-thankyou |
queue-thereare | Звуковой файл с объявлением положения в очереди. | queue-thereare |
queue-youarenext | Сообщение «Вы первый в очереди». | queue-youarenext |
reportholdtime | Не объявлять, сколько времени в очереди находился агент. | no |
retry | Время паузы в секундах перед повторным вызовом оператора. | 5 |
ringinuse | Не вызывать оператора со статусом «in use» (не звонить на канал, который уже используется). | no |
servicelevel | Процент отвеченных вызовов за указанное время (в данном примере, 20 секунд). | 20 |
setqueuevar | Использовать переменные для очереди:
|
yes |
setinterfacevar | Использовать переменные для интерфейсов:
|
yes |
setqueueentryvar | Переменные среднего времени ожидания и позиции звонящего:
|
yes |
strategy | Способ распределение входящих звонков на телефоны операторов. Возможны варианты:
|
ringall |
timeout | Время вызова, в течение которого будет считаться, что абонент не ответил на звонок. Или время вызова оператора перед retry. | 15 |
timeoutpriority | Предыдущий параметр timeout можно задать в конфигурационном файле queue.conf или как аргумент приложения Queue(). Данный параметр указывает, кому отдать предпочтение. Возможны варианты app или conf, соответственно — предпочтение за приложением или конфигурационным файлом. | app |
timeoutrestart | Сбрасывать таймаут оператора, если от него приходят ответы BUSY (занято) или CONGESTION (перегружен). | yes |
weight | Приоритет очереди (вес). | 0 |
wrapuptime | Время отдыха оператора после ответа. | 0 |
member | Добавляет статического пользователя очереди. Может быть несколько таких опций на очередь. | PJSIP/2777 |
Глобальные параметры очереди
Перечисленные выше опции имеют отношение к конкретной очереди. Также, в Asterisk можно настроить общие для всех очередей опции — они размещаются в секции [general]. Некоторые из них пересекаются с параметрами очереди — в таком случае приоритет будет за параметром последней.
Перечень глобальных опций:
Параметр | Описание | По умолчанию |
---|---|---|
persistentmembers | Хранить динамических операторов в базе astdb для возможности их автоматического подключения после перезагрузки. | yes |
autofill | Способ организации очереди. Если yes — общая очередь ко всем операторам, попадаем к тому, кто первый освободиться. Если no — при постановке на очередь идет сразу закрепление за определенным оператором. | no |
monitor-type | Программа, с помощью которой идет запись разговора. | MixMonitor |
updatecdr | Добавлять в поле dstchannel CDR имя агента. | no |
shared_lastcall | Для операторов, обслуживающих несколько очередей будут учитываться параметры паузы после завершения разговора для всех вызовов всех очередей. | no |
negative_penalty_invalid | Не отправлять звонки на операторов с отрицательным пенальти. | no |
log_membername_as_agent | Регистрировать агентов с именем, а не номером. | no |
Добавление операторов к очереди (агентов)
Пользователей, которые отвечают на звонки очереди называют агентами или операторами. Есть два типа агентов — статические и динамические. Первые прописываются в конфигурационном файле queues.conf, вторые — могут присоединятся к очереди, становясь на некоторое время оператором.
Статические агенты
Для создания статического оператора, открываем конфигурационный файл очереди:
vi /etc/asterisk/queues.conf
В настройках очереди добавляем:
[support]
strategy = ringall
member => SIP/101,1
* в данном примере, мы добавили оператора к нашей очереди. Это sip агент с именем 101. 1 на конце — пенальти (используется для выставления приоритета при использовании некоторых стратегий).
Перечитываем все конфигурационные файлы:
asterisk -x "core reload"
Динамические агенты
Динамические агенты могут присоединиться к очереди в любой момент набором специального сочетания кнопок на телефонном аппарате. Настройка сервера выполняется в конфигурационном файле диалплана:
vi /etc/asterisk/extensions.conf
exten => *999#,1,Verbose(2,Adding dynamic member to support queue)
same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
same => n,AddQueueMember(support,${MemberInfo})
same => n,Playback(agent-loginok)
same => n,Hangup()
exten => *888#,1,Verbose(2,Removing dynamic member from support queue.)
same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
same => n,RemoveQueueMember(support,${MemberInfo})
same => n,Playback(agent-loggedoff)
same => n,Hangup()
* в данном примере, если агент набирает *999#, он присоединяется к очереди и может принимать вызовы. При наборе *888# агент выходит из очереди.
* Verbose — вывод в консоль информации; Set — задает значение переменной, в данном примере, MemberInfo; AddQueueMember/RemoveQueueMember — соответственно, добавляет к очереди агента и удаляет из нее; Playback — проигрывает голосовой сигнал; Hangup — дает сигнал отбоя.
Аутентификация агентов
1. Общий пароль для всех агентов
Можно сделать так, чтобы Asterisk требовал от агентов ввод пароля для присоединения к очереди. Для этого наш диалплан приводим к такому виду:
vi /etc/asterisk/extensions.conf
exten => *999#,1,Verbose(2,Adding dynamic member to support queue)
same => n,Authenticate(1234)
same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
same => n,AddQueueMember(support,${MemberInfo})
same => n,Playback(agent-loginok)
same => n,Hangup()
* где Authenticate — запрос пароля, в данном примере, 1234.
2. Индивидуальные пароли для каждого агента
Если необходимо, чтобы каждый агент перед входом вводил свои номер и пароль, необходимо воспользоваться приложением VMAuthenticate (аутентификация по электронному почтовому ящику). Настройку начнем с правки диалплана:
vi /etc/asterisk/extensions.conf
exten => *999#,1,Verbose(2,Adding a member to the cc_ege_support queue.)
same => n,Read(AGENT_USERID,agent-user)
same => n,VMAuthenticate(${AGENT_USERID}@vmauth)
same => n,Set(MemberInfo=${CHANNEL(channeltype)}/${CHANNEL(peername)})
same => n,AddQueueMember(support,${MemberInfo})
same => n,Playback(agent-loginok)
same => n,Hangup()
* Read — запрашиваем данные у агента (agent-user — голосовой файл), и записываем в переменную AGENT_USERID; VMAuthenticate — запрашиваем пароль для почтового ящика ${AGENT_USERID} с контекстом vmauth.
Добавляем почтовые ящики:
vi /etc/asterisk/voicemail.conf
[vmauth]
1001 => 1234, dmosk, dmosk@example.com
1002 => 5678, dmosk2, dmosk2@example.com
* vmauth — контекст (его мы указали в диалплане); 1001/1002 — номера агентов; 1234/5678 — пароли.
Для применения настроек перечитываем диалплан:
asterisk -x "dialplan reload"
Настройка плана набора (dialplan)
Отправка звонка в очередь
Чтобы при звонке на нужный нам номер звонящий попадал в нашу очередь, добавляем правило в диалплане:
vi /etc/asterisk/extensions.conf
exten => 111,1,Answer()
exten => 111,n,Ringing
exten => 111,n,Wait(2)
exten => 111,n,Queue(support)
exten => 111,n,Hangup
* где:
- Answer — установка соединения. С скобках может быть задан период задержки в миллисекундах.
- Ringing — воспроизводим звонок, сигнализирующий ожидания взятие трубки.
- Wait — ждем (в данном примере 2 секунды).
- Queue — добавляем звонок в очередь.
- HangUp — отбой.
* в данном примере, при звонке на короткий номер 111 мы услышим на 2 секунды звонок, сигнализирующий, что мы дозвонились; после абонент направляется в нашу очередь support.
Перечитываем конфиг:
asterisk -x "dialplan reload"
Приветствие
Для того, чтобы проиграло приветствие, редактируем наш диалплан, добавив функцию Playback после Answer:
exten => 111,1,Answer()
exten => 111,n,Playback(queue-callswaiting)
exten => 111,n,Ringing
...
* где queue-callswaiting — название файла из каталога /var/lib/asterisk/sounds/<язык>/.
Перечитываем конфигурацию:
asterisk -x "dialplan reload"
Приоритеты звонков
Мы можем создать два входящих номера, звонки на которые обрабатываются одной и той же очередью, но с разными приоритетами. Например, внутренние номера 120 и 130 — диалплан выглядит так:
exten => 120,1,Answer()
exten => 120,1,Playback(welcome)
exten => 120,n,Ringing
exten => 120,n,Wait(2)
exten => 120,2,SetVar(QUEUE_PRIO=100)
exten => 120,3,Queue(support)
exten => 120,n,Hangup
exten => 130,1,Answer()
exten => 130,1,Playback(welcome)
exten => 130,n,Ringing
exten => 130,n,Wait(2)
exten => 130,2,SetVar(QUEUE_PRIO=50)
exten => 130,3,Queue(support)
exten => 130,n,Hangup
* в данном примере, звонки на номер 120 являются более приоритетными; QUEUE_PRIO — собственно, и является переменной, в которой хранится значение приоритета звонка.
Русификация голоса
По умолчанию, Asterisk может идти с набором голосовых записей на английском языке. Они находятся в каталоге /var/lib/asterisk/sounds/en. Для добавления русского голоса, открываем список языковых архивов и копируем ссылку на архив с нужным языком:
Используя ссылку, скачиваем архив:
wget https://downloads.asterisk.org/pub/telephony/sounds/asterisk-core-sounds-ru-wav-current.tar.gz
Создаем каталог для нашего языка:
mkdir /var/lib/asterisk/sounds/ru
Распаковываем архив в созданную папку:
tar -xvf asterisk-core-sounds-ru-wav-current.tar.gz -C /var/lib/asterisk/sounds/ru/
В конфигурационном файле sip.conf добавим:
vi /etc/asterisk/sip.conf
language=ru
Перечитаем конфигурацию:
asterisk -x "sip reload"
При необходимости, чтобы язык менялся только для определенной очереди, менять настройку нужно в диалплане:
vi /etc/asterisk/extensions.conf
...
exten => 111,n,Set(CHANNEL(language)=ru)
...
И перезапустить dialplan:
asterisk -x "dialplan reload"