IP-телефонія на базі Asterisk. Частина 6.7: Додаткові функції Asterisk. Черги дзвінків.
Цикл статей по розгортанню IP-телефонії на базі Asterisk. Фактично це моя проектна робота на отримання відповідного сертифікату одного з навчальних центрів. Робота була захищена, сертифікат отриманий, все написане тестувалось і є повтінстю робочою реалізацією. Інформація в статті і версії програмного забезбечення актуальні на 2017 рік.
- частина 1 - Встановлення сервера Asterisk
- частина 2 - Налаштування SIP
- частина 3 - Логіка обробки дзвінків (Dialplan)
- частина 4 - Голосове меню
- частина 5 - Деталізований звіт про виклики (Call Detail Records, CDR)
- частина 6.1 - Додаткові функції Asterisk. Паркування дзвінка.
- частина 6.2 - Додаткові функції Asterisk. Переадресація дзвінків.
- частина 6.3 - Додаткові функції Asterisk. Музика на утриманні (music on hold).
- частина 6.4 - Додаткові функції Asterisk. Перехоплення дзвінків (call pickup).
- частина 6.5 - Додаткові функції Asterisk. Конференції (ConfBridge).
- частина 6.6 - Додаткові функції Asterisk. Переведення абонента на зовнішню лінію (FollowMe).
6. Додаткові функції Asterisk.
6.7 Черги дзвінків.
З метою більш ефективної обробки вхідних дзвінків створимо черги для різних відділів компанії. Черги описуються у файлі /etc/asterisk/queues.conf:
[sales]
timeout = 15
strategy=ringall ; викликаються всі учасники черги
ringinuse=no ; не телефонувати агенту, якщо він вже говорить по іншій лінії;
member => SIP/201,1
member => SIP/202
member => SIP/203
member => SIP/204
[sales-groupe1]
timeout = 15
strategy=rrmemory ; циклічний розподіл із пам'яттю, запам'ятовується останній учасник, який відповів на виклик
ringinuse=no
member => SIP/201
member => SIP/202
[sales-groupe2]
timeout = 15
strategy=rrmemory
ringinuse=no
member => SIP/203
member => SIP/204
[buyings]
timeout = 15
strategy=rrmemory
ringinuse=no
member => SIP/301
member => SIP/302
[warehause]
timeout = 15
strategy=fewestcalls ; викликається перший вільний учасник, який обробив найменшу кількість викликів із даної черги
ringinuse=no
member => SIP/401
member => SIP/402
Для відділу продажів номеру 201 призначено пенальті 1, для інших номерів буде встановлено значення за замовчуванням - 0. Таким чином, дзвінки на номер 201 надходитимуть тільки після того, як не відповіли номери з нижчим пенальті, тобто номери 202–204.
Змінимо голосове меню так, щоб дзвінки операторам у відділах оброблялися чергами. Замінимо рядки
exten => 1,1,Dial(SIP/201&SIP/202,20,tm)
exten => 2,1,Dial(SIP/203&SIP/204,20,tm)
exten => 3,1,Dial(SIP/201&SIP/202&SIP/203&SIP/204,20,tm)
exten => 2,1,Dial(SIP/301&SIP/302,20,tm)
exten => 2,1,Dial(SIP/401&SIP/402,20,tm)
на відповідно
exten => 1,1,Queue(sales-groupe1,tm,,,20)
exten => 2,1,Queue(sales-groupe2,tm,,,20)
exten => 3,1,Queue(sales,tm,,,20)
exten => 2,1,Queue(buying,tm,,,20)
exten => 2,1,Queue(warehouse,tm,,,20)
Перевіряємо чергу відділу закупівель:
asterisk-centos*CLI>
== Using SIP RTP CoS mark 5
-- Executing [740648@call-in:1] Set("SIP/zadarma-00000019", "RECORDING=1") in new stack
-- Executing [740648@call-in:2] Goto("SIP/zadarma-00000019", "ivr-mainmenu,s,1") in new stack
-- Goto (ivr-mainmenu,s,1)
-- Executing [s@ivr-mainmenu:1] Answer("SIP/zadarma-00000019", "") in new stack
-- Executing [s@ivr-mainmenu:2] BackGround("SIP/zadarma-00000019", "ivr/welcome") in new stack
-- <SIP/zadarma-00000019> Playing 'ivr/welcome.slin' (language 'ru')
> 0xb312c440 -- Probation passed - setting RTP source address to 185.45.152.163:18762
-- Executing [s@ivr-mainmenu:3] GotoIfTime("SIP/zadarma-00000019", "18:00-8:00|mon-fri|*|*?ivr-holiday,s,1") in new stack
-- Executing [s@ivr-mainmenu:4] GotoIfTime("SIP/zadarma-00000019", "*|sat-sun|*|*?ivr-holiday,s,1") in new stack
-- Executing [s@ivr-mainmenu:5] BackGround("SIP/zadarma-00000019", "ivr/mainmenu") in new stack
-- <SIP/zadarma-00000019> Playing 'ivr/mainmenu.slin' (language 'ru')
-- Executing [2@ivr-mainmenu:1] Goto("SIP/zadarma-00000019", "ivr-buying-1,s,1") in new stack
-- Goto (ivr-buying-1,s,1)
-- Executing [s@ivr-buying-1:1] BackGround("SIP/zadarma-00000019", "ivr/buyingmenu-1") in new stack
-- <SIP/zadarma-00000019> Playing 'ivr/buyingmenu-1.slin' (language 'ru')
-- Executing [2@ivr-buying-1:1] Queue("SIP/zadarma-00000019", "buyings,tm,,,20") in new stack
-- Started music on hold, class 'default', on channel 'SIP/zadarma-00000019'
== Using SIP RTP CoS mark 5
-- Called SIP/301
-- SIP/301-0000001a is ringing
-- Nobody picked up in 15000 ms
-- Stopped music on hold on SIP/zadarma-00000019
-- Executing [2@ivr-buying-1:2] Hangup("SIP/zadarma-00000019", "") in new stack
== Spawn extension (ivr-buying-1, 2, 2) exited non-zero on 'SIP/zadarma-00000019'
== Using SIP RTP CoS mark 5
-- Executing [740648@call-in:1] Set("SIP/zadarma-0000001b", "RECORDING=1") in new stack
-- Executing [740648@call-in:2] Goto("SIP/zadarma-0000001b", "ivr-mainmenu,s,1") in new stack
-- Goto (ivr-mainmenu,s,1)
-- Executing [s@ivr-mainmenu:1] Answer("SIP/zadarma-0000001b", "") in new stack
-- Executing [s@ivr-mainmenu:2] BackGround("SIP/zadarma-0000001b", "ivr/welcome") in new stack
-- <SIP/zadarma-0000001b> Playing 'ivr/welcome.slin' (language 'ru')
> 0xb2f00018 -- Probation passed - setting RTP source address to 185.45.152.162:18018
-- Executing [s@ivr-mainmenu:3] GotoIfTime("SIP/zadarma-0000001b", "18:00-8:00|mon-fri|*|*?ivr-holiday,s,1") in new stack
-- Executing [s@ivr-mainmenu:4] GotoIfTime("SIP/zadarma-0000001b", "*|sat-sun|*|*?ivr-holiday,s,1") in new stack
-- Executing [s@ivr-mainmenu:5] BackGround("SIP/zadarma-0000001b", "ivr/mainmenu") in new stack
-- <SIP/zadarma-0000001b> Playing 'ivr/mainmenu.slin' (language 'ru')
-- Executing [2@ivr-mainmenu:1] Goto("SIP/zadarma-0000001b", "ivr-buying-1,s,1") in new stack
-- Goto (ivr-buying-1,s,1)
-- Executing [s@ivr-buying-1:1] BackGround("SIP/zadarma-0000001b", "ivr/buyingmenu-1") in new stack
-- <SIP/zadarma-0000001b> Playing 'ivr/buyingmenu-1.slin' (language 'ru')
-- Executing [2@ivr-buying-1:1] Queue("SIP/zadarma-0000001b", "buyings,tm,,,20") in new stack
-- Started music on hold, class 'default', on channel 'SIP/zadarma-0000001b'
== Using SIP RTP CoS mark 5
-- Called SIP/302
-- SIP/302-0000001c is ringing
-- Got SIP response 603 "Decline" back from 192.168.1.102:5060
-- SIP/302-0000001c is busy
-- Nobody picked up in 15000 ms
-- Stopped music on hold on SIP/zadarma-0000001b
-- Executing [2@ivr-buying-1:2] Hangup("SIP/zadarma-0000001b", "") in new stack
== Spawn extension (ivr-buying-1, 2, 2) exited non-zero on 'SIP/zadarma-0000001b'
При першому дзвінку виклик було відправлено на номер 301, при другому - 302, оскільки встановлено стратегію rrmemory.
На цьому все. Цикл про Asterisk добіг кінця. Якщо він був корисним, то користуйтесь, якщо ж ні, то дякую хоча б за те що дочитали до цього моменту ;)
- частина 1 - Встановлення сервера Asterisk
- частина 2 - Налаштування SIP
- частина 3 - Логіка обробки дзвінків (Dialplan)
- частина 4 - Голосове меню
- частина 5 - Деталізований звіт про виклики (Call Detail Records, CDR)
- частина 6.1 - Додаткові функції Asterisk. Паркування дзвінка.
- частина 6.2 - Додаткові функції Asterisk. Переадресація дзвінків.
- частина 6.3 - Додаткові функції Asterisk. Музика на утриманні (music on hold).
- частина 6.4 - Додаткові функції Asterisk. Перехоплення дзвінків (call pickup).
- частина 6.5 - Додаткові функції Asterisk. Конференції (ConfBridge).
- частина 6.6 - Додаткові функції Asterisk. Переведення абонента на зовнішню лінію (FollowMe).
Посилання
- Photo by Hal Gatewood on Unsplash