Настройка очередей звонков в 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 Перечисление статусов, при которых оператор покидает очередь. Возможные варианты:
  • paused: считать недоступным, если оператор на паузе;
  • penalty: считать недоступным, если пенальти оператора меньше чем QUEUE_MAX_PENALTY;
  • inuse: считать недоступным, если телефон оператора в данный момент вызывается (звонит);
  • ringing: a member is not considered available if his phone is currently ringing
  • unavailable: Касается в основном каналов Agent (заданных в agents.conf). если агент назначен в agent.conf, но не зарегистрировался(каналы Agent можно считать устаревшими)
  • invalid: Интерфейсы имеющие статус «invalid».
  • unknown: Не имеющий явного статуса оператор.
  • wrapup: Оператор на таймауте wrapuptime после вызова.
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 Использовать переменные для очереди:
  • QUEUENAME — имя очереди.
  • QUEUEMAX — максимальное кол-во вызовов разр. в очереди;
  • QUEUESTRATEGY — стратегия очереди;
  • QUEUECALLS — текущее кол-во вызовов в очереди;
  • QUEUEHOLDTIME — среднее время ожидания в очереди на данный момент;
  • QUEUECOMPLETED — кол-во обработанных вызовов;
  • QUEUEABANDONED — кол-во отвергнутых (неотвеченных) вызовов;
  • QUEUESRVLEVEL — уровень обслуживания очереди;
  • QUEUESRVLEVELPERF — процент вызовов отвечающих условию servicelevel на данный момент;
yes
setinterfacevar Использовать переменные для интерфейсов:
  • MEMBERINTERFACE — имя интерфейса оператора
  • MEMBERNAME — имя оператора
  • MEMBERCALLS — количество принятых вызовов оператором.
  • MEMBERLASTCALL — время последнего вызова.
  • MEMBERPENALTY — пенальти оператора.
  • MEMBERDYNAMIC — динамический агент или нет.
  • MEMBERREALTIME — указывает realtime конфигурация оператора или нет.
yes
setqueueentryvar Переменные среднего времени ожидания и позиции звонящего:
  • QEHOLDTIME — время ожидания вызывающего абонента.
  • QEORIGINALPOS — позиция в очереди.
yes
strategy Способ распределение входящих звонков на телефоны операторов. Возможны варианты:
  • ringall — вызываются все операторы одновременно.
  • leastrecent — вызвать того оператора, который дольше всех не принимал звонки.
  • fewestcalls — вызвать того оператора, который приниял меньше всех звонков.
  • random — в случайном порядке.
  • rrmemory — по кругу, после того, кто ответил последним.
  • linear — вызывать по очереди в порядке перечисления или в порядке добавления (динамические).
  • wrandom — случайно с учетом пенальти.
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 — задает значение переменной, в данном примере, MemberInfoAddQueueMember/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_USERIDVMAuthenticate — запрашиваем пароль для почтового ящика ${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"

# Серверы # Телефония
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет