/ #linux 

IP-телефонія на базі Asterisk. Частина 6.7: Додаткові функції Asterisk. Черги дзвінків.

Цикл статей по розгортанню IP-телефонії на базі Asterisk. Фактично це моя проектна робота на отримання відповідного сертифікату одного з навчальних центрів. Робота була захищена, сертифікат отриманий, все написане тестувалось і є повтінстю робочою реалізацією. Інформація в статті і версії програмного забезбечення актуальні на 2017 рік.

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 &apos;ivr/welcome.slin&apos; (language &apos;ru&apos;)
       > 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 &apos;ivr/mainmenu.slin&apos; (language &apos;ru&apos;)
    -- 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 &apos;ivr/buyingmenu-1.slin&apos; (language &apos;ru&apos;)
    -- Executing [2@ivr-buying-1:1] Queue("SIP/zadarma-00000019", "buyings,tm,,,20") in new stack
    -- Started music on hold, class &apos;default&apos;, on channel &apos;SIP/zadarma-00000019&apos;
  == 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 &apos;SIP/zadarma-00000019&apos;
  == 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 &apos;ivr/welcome.slin&apos; (language &apos;ru&apos;)
       > 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 &apos;ivr/mainmenu.slin&apos; (language &apos;ru&apos;)
    -- 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 &apos;ivr/buyingmenu-1.slin&apos; (language &apos;ru&apos;)
    -- Executing [2@ivr-buying-1:1] Queue("SIP/zadarma-0000001b", "buyings,tm,,,20") in new stack
    -- Started music on hold, class &apos;default&apos;, on channel &apos;SIP/zadarma-0000001b&apos;
  == 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 &apos;SIP/zadarma-0000001b&apos;

При першому дзвінку виклик було відправлено на номер 301, при другому - 302, оскільки встановлено стратегію rrmemory.

На цьому все. Цикл про Asterisk добіг кінця. Якщо він був корисним, то користуйтесь, якщо ж ні, то дякую хоча б за те що дочитали до цього моменту ;)

Посилання

Author

Олександр Бобилєв

Залишаю собі право використовувати ненормативну (але інформативну) лексику там, де звичайні слова втрачають сенс і не відображають всієї палітри почуттів, від споглядання навколишньої дійсності.