IP-телефонія на базі Asterisk. Частина 6.1: Додаткові функції Asterisk. Паркування дзвінка.
Цикл статей по розгортанню IP-телефонії на базі Asterisk. Фактично це моя проектна робота на отримання відповідного сертифікату одного з навчальних центрів. Робота була захищена, сертифікат отриманий, все написане тестувалось і є повтінстю робочою реалізацією. Інформація в статті і версії програмного забезбечення актуальні на 2017 рік.
- частина 1 - Встановлення сервера Asterisk
- частина 2 - Налаштування SIP
- частина 3 - Логіка обробки дзвінків (Dialplan)
- частина 4 - Голосове меню
- частина 5 - Деталізований звіт про виклики (Call Detail Records, CDR)
6. Додаткові функції Asterisk.
6.1 Паркування дзвінка.
Паркування виклику - це перенаправлення дзвінка абонента в спеціальний слот. Кожен слот має свій номер. Якщо перейти на інший телефон та набрати відповідний номер слота, то можна продовжити розмову з абонентом. В процесі очікування абонент ставитися на утримання і прослуховує музику.
Додаємо можливість паркувати дзвінки. Використаємо номер за замовчуванням - 700, тобто, якщо в процесі розмови набрати # 700, то почуємо номер слоту, який потім треба буде набрати з іншого телефоного апарату для з’єднання з “запаркованим” абонентом.
[manager]
include => call-local-manager
include => call-local
include => call-out-world
include => parkedcalls
[sales]
include => call-local-manager
include => call-local
include => call-out-ua
include => parkedcalls
[buyings]
include => call-local-manager
include => call-local
include => call-out-ua
include => parkedcalls
[warehouse]
include => call-local-manager
include => call-local
include => parkedcalls
[it]
include => call-local
include => parkedcalls
[reception]
include => call-local-manager
include => call-local
include => call-out-ua
include => parkedcalls
Для користувачів слід дозволити функцію переводу виклику, щоб вони могли скористатись функцією паркування, відповідно необхідно додати у виклики Dial() параметр t:
;внутрішні лінії за виключенням manager
[call-local]
exten => _[2-6],1,Set(RECORDING=0)
exten => _[2-6],n,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _[2-6]XX,n,Dial(SIP/${EXTEN},20,t)
exten => _[2-6],n,Hangup()
Перевіряємо паркування викликів:
asterisk-centos*CLI>
== Using SIP RTP CoS mark 5
-- Executing [740648@call-in:1] Set("SIP/zadarma-0000001c", "RECORDING=1") in new stack
-- Executing [740648@call-in:2] Goto("SIP/zadarma-0000001c", "ivr-mainmenu,s,1") in new stack
-- Goto (ivr-mainmenu,s,1)
-- Executing [s@ivr-mainmenu:1] Answer("SIP/zadarma-0000001c", "") in new stack
-- Executing [s@ivr-mainmenu:2] BackGround("SIP/zadarma-0000001c", "ivr/welcome") in new stack
-- <SIP/zadarma-0000001c> Playing 'ivr/welcome.slin' (language 'ru')
> 0x8da8a40 -- Probation passed - setting RTP source address to 185.45.152.162:19710
-- Executing [s@ivr-mainmenu:3] GotoIfTime("SIP/zadarma-0000001c", "19:00-9:00|mon-fri|*|*?ivr-holiday,s,1") in new stack
-- Executing [s@ivr-mainmenu:4] GotoIfTime("SIP/zadarma-0000001c", "*|sat-sun|*|*?ivr-holiday,s,1") in new stack
-- Executing [s@ivr-mainmenu:5] BackGround("SIP/zadarma-0000001c", "ivr/mainmenu") in new stack
-- <SIP/zadarma-0000001c> Playing 'ivr/mainmenu.slin' (language 'ru')
-- Executing [2@ivr-mainmenu:1] Goto("SIP/zadarma-0000001c", "ivr-buying-1,s,1") in new stack
-- Goto (ivr-buying-1,s,1)
-- Executing [s@ivr-buying-1:1] BackGround("SIP/zadarma-0000001c", "ivr/buyingmenu-1") in new stack
-- <SIP/zadarma-0000001c> Playing 'ivr/buyingmenu-1.slin' (language 'ru')
-- Executing [1@ivr-buying-1:1] Goto("SIP/zadarma-0000001c", "ivr-buying-2,s,1") in new stack
-- Goto (ivr-buying-2,s,1)
-- Executing [s@ivr-buying-2:1] BackGround("SIP/zadarma-0000001c", "ivr/buyingmenu-2") in new stack
-- <SIP/zadarma-0000001c> Playing 'ivr/buyingmenu-2.slin' (language 'ru')
-- Executing [301@ivr-buying-2:1] Dial("SIP/zadarma-0000001c", "SIP/301,20,t") in new stack
== Using SIP RTP CoS mark 5
-- Called SIP/301
-- SIP/301-0000001d is ringing
-- SIP/301-0000001d answered SIP/zadarma-0000001c
-- Channel SIP/301-0000001d joined 'simple_bridge' basic-bridge <27b52abb-6f09-4e56-8a80-8ca3202ff2a4>
> 0x919b4f8 -- Probation passed - setting RTP source address to 192.168.1.100:7078
-- Channel SIP/zadarma-0000001c joined 'simple_bridge' basic-bridge <27b52abb-6f09-4e56-8a80-8ca3202ff2a4>
-- <SIP/301-0000001d> Playing 'pbx-transfer.slin' (language 'ru')
-- Started music on hold, class 'default', on channel 'SIP/zadarma-0000001c'
-- Stopped music on hold on SIP/zadarma-0000001c
-- Channel SIP/zadarma-0000001c left 'simple_bridge' basic-bridge <27b52abb-6f09-4e56-8a80-8ca3202ff2a4>
-- Parking 'SIP/zadarma-0000001c' in 'default' at space 701
-- Channel SIP/zadarma-0000001c joined 'holding_bridge' parking-bridge <e26ea0d2-a288-40da-92e2-e45e8bf1dc5e>
-- Started music on hold, class 'default', on channel 'SIP/zadarma-0000001c'
-- <SIP/301-0000001d> Playing 'digits/7.slin' (language 'ru')
-- <SIP/301-0000001d> Playing 'digits/0.slin' (language 'ru')
-- <SIP/301-0000001d> Playing 'digits/1.slin' (language 'ru')
-- Channel SIP/301-0000001d left 'simple_bridge' basic-bridge <27b52abb-6f09-4e56-8a80-8ca3202ff2a4>
-- Executing [701@manager:1] ParkedCall("SIP/102-0000001e", "default,701") in new stack
-- Channel SIP/zadarma-0000001c left 'holding_bridge' parking-bridge <e26ea0d2-a288-40da-92e2-e45e8bf1dc5e>
-- Stopped music on hold on SIP/zadarma-0000001c
-- Channel SIP/zadarma-0000001c joined 'simple_bridge' basic-bridge <8787ac45-0b13-4760-b15f-7ad2d5f57f19>
-- Channel SIP/102-0000001e joined 'simple_bridge' basic-bridge <8787ac45-0b13-4760-b15f-7ad2d5f57f19>
> Bridge 8787ac45-0b13-4760-b15f-7ad2d5f57f19: switching from simple_bridge technology to native_rtp
> Locally RTP bridged 'SIP/102-0000001e' and 'SIP/zadarma-0000001c' in stack
> Locally RTP bridged 'SIP/102-0000001e' and 'SIP/zadarma-0000001c' in stack
> 0x919b4f8 -- Probation passed - setting RTP source address to 192.168.1.103:7078
-- Channel SIP/102-0000001e left 'native_rtp' basic-bridge <8787ac45-0b13-4760-b15f-7ad2d5f57f19>
== Spawn extension (manager, 701, 1) exited non-zero on 'SIP/102-0000001e'
-- Channel SIP/zadarma-0000001c left 'native_rtp' basic-bridge <8787ac45-0b13-4760-b15f-7ad2d5f57f19>
== Spawn extension (ivr-buying-2, 301, 1) exited non-zero on 'SIP/zadarma-0000001c'
В наступній статті поговоримо про переадресацію дзвінків в Asterisk.
- частина 1 - Встановлення сервера Asterisk
- частина 2 - Налаштування SIP
- частина 3 - Логіка обробки дзвінків (Dialplan)
- частина 4 - Голосове меню
- частина 5 - Деталізований звіт про виклики (Call Detail Records, CDR)