Очереди звонков являются важным функционалом для компаний в которых телефонные звонки принимают несколько операторов. Звонки должны распределяться между операторами следуя определенной логике, операторы должны иметь возможность регистрироваться на линии и выключаться с нее без привлечения администратора сервера.
Займемся настройкой очередей, прописывать необходимые директивы будем в файле queues.conf
Просмотрим его
less /etc/asterisk/queues.conf
queues.conf как и другие конфиги Asterisk хорошо задокументированы, но применять дефолтные конфиги в функционирующей системе является плохой практикой, поэтому создаем копию файла
cp /etc/asterisk/queues.conf /etc/asterisk/queues.conf_orig
После этого открываем основной файл в текстовом редакторе
vi /etc/asterisk/queues.conf
Удаляем все комменарии
:g/^\s^*;/d
Добавляем секцию очереди support и прописываем двух операторов, которые будут принадлежать к этой очереди user1 и user2
[support]
member => SIP/user1
member => SIP/user2
Переходим в консольный режим сервера телефонии
asterisk -rvvv
Выполняем команду queue чтобы посмотреть возможные опции применительно к очереди
>queue
Очередь нужно перезагрузить
>queue reload
После нажатия Enter выдается список возможных опций
Можно перезагрузить отдельные элементы и параметры, а можно всю очередь, что и сделаем:
>queue show support
Видим статистику 'support has 0 calls', среднее время разговора и операторов, принадлежащик к очереди
Можно посмотреть информацию о приложении, которое добавляем агентов в очередь
> core show application Queue
Открываем для редактирования файл с расширениями:
mcedit extentions.conf
[incoming]
exten => 922123100,1,GotoIfTime(8:00-17:00,mon-fri,*,*?phones,100,1)
exten => 922123100,1,Playback(tt-monkeys)
exten => 922123100,n,Hangup
exten => 922123200,1,GoSub(timecheck,s,1)
exten => 922123200,n,Goto(phones,200,1)
exten => 922123300,1,GoSub(timecheck,s,1)
exten => 922123300,n,Goto(phones,300,1)
[timecheck]
exten => s,1,GotoIfTime(8:00-17:00,mon-thu,*,*?ok,1)
exten => s,n,GotoIfTime(8:00-12:00,fri-fri,*,*?ok,1)
exten => s,n,Playback(tt-monkeys)
exten => s,n,Hangup
exten => ok,1,Return
[phones]
exten => 100,1,NoOp(call for user1)
same => n,Dial(Sim/user1,5)
same => n,GotoIf($[ «${DIALSTATUS}» = «BUSY» ]?100-busy,1)
same => n,Voicemail(${EXTEN,u})
same = > n,Hangup
exten => 100-busy,1,VoiceMail(${EXTEN:0:3},b)
same => n,Hungup
exten => 200,1,NoOp(call for user2)
same => n,Dial(Sim/user2,10)
same => n,Voicemail(${EXTEN})
same = > n,Hangup
exten => 300,1,NoOp(Support Team)
same => n,Queue(support,,,,120)
same => n,Hangup
exten => *100,1,VoicemailMain(100)
same => n,Hangup
exten => 0X.,1,NoOp( ${EXTEN:1})
same => n, Goto(ougoing,${EXTEN:1},1)
[outgoing]
extent => _X.,1,Dial(SIP/outside)
В примере звонки поступают с номера 922123100, на практике здесь прописывается номер провайдера SIP телефонии
asterisk -rvvv
>dialplan reload
В диалплане заложена следующая логика: звонок поступает на расширение очереди Support, после этого звонят телефоны обоих агентов, если в течение 15 секунд на телефон никто не отвечает — звонок возвращается в очередь. Общий таймаут определяется правилом same => n,Queue(support,,,,120) и составляет 120 секунд.
Стратегии распределения звонков между агентами
Описание стратегии распределения звонков часто берется из документации и помещается в конфигурационный файл в закомментированном виде.
Asterisk позволяет использовать ряд стратегий, основные из них:
- ringall — при поступлении звонка на расширение очереди звонить будут телефоны всех операторов — часто применяется в небольших организациях
- leastrecent — каждый следующий звонок будет приходить оператору, который в последний раз положил трубку раньше всех остальных
- fewest calls — звонок будет приходить агенту, который ответил на самое меньшее количество звонков (важно, что если агент покинул очередь зарегистрировавшись вновь он будет иметь количество звонков равное 0, соответственно все входящие будут приходить только ему)
- linear option — первым будет отвечать всегда один оператор
- random — агент, которому будет приходить звонок будет выбран случайно
Чаще всего в реальных системах применяется применяется стратегия random
mcedit queues.conf
strategy = random
timeout = 15
В соответствии с этими опциями телефон оператора, выбранного случайным образом будет звонить 15 секунд, если ответа не будет, звонок вернется в очередь, затем выбор произойдет случайным образом вновь.
Переходим в консольный режим
asterisk -rvvv
Перезапускаем диалплан
>dialplan reload
Перезапускаем все очереди
queue reload all
Смотрим состояние очереди Support
>queue show support
В выводе можно увидеть внесенные изменения и заданные нами таймауты.