IP-телефонія на базі Asterisk. Частина 6.6: Додаткові функції Asterisk. Переведення абонента на зовнішню лінію (FollowMe).
Цикл статей по розгортанню 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. Додаткові функції Asterisk.
6.6 Переведення абонента на зовнішню лінію (FollowMe).
Налаштовуємо переведення абонента на зовнішній номер, якщо його виклик на внутрішній номер лишився без відповіді певну кількість часу.
Списки відповідності локальних та зовнішніх номерів задаються у файлі /etc/asterisk/followme.conf:
[101]
number=>380931111111,15
context=>call-out-ua
[102]
number=>380500000000,15
context=>call-out-ua
В даному випадку клієнт, якому на лінії 101 не відповіли протягом 15 секунд, буде з’єднаний з мобільним номером 380931111111, для лінії 102 це буде відповідно зовнішній номер 380500000000. Про контекст call-out-ua можна пригадати в розділі про Dialplan.
Перевіряємо що все працює як очікуємо:
asterisk-centos*CLI>
== Using SIP RTP CoS mark 5
-- Executing [101@manager:1] Set("SIP/102-00000006", "RECORDING=1") in new stack
-- Executing [101@manager:2] Macro("SIP/102-00000006", "recording,102,101") in new stack
-- Executing [s@macro-recording:1] GotoIf("SIP/102-00000006", "1?yes:no") in new stack
-- Goto (macro-recording,s,2)
-- Executing [s@macro-recording:2] Set("SIP/102-00000006", "fname=2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101") in new stack
-- Executing [s@macro-recording:3] Set("SIP/102-00000006", "fname=2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101") in new stack
-- Executing [s@macro-recording:4] Set("SIP/102-00000006", "DIR_RECORDS=/var/spool/asterisk/monitor/") in new stack
-- Executing [s@macro-recording:5] NoOp("SIP/102-00000006", "Dir - 2017/2017-05/2017-05-09") in new stack
-- Executing [s@macro-recording:6] Set("SIP/102-00000006", "monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.wav" "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.mp3" && rm -f "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.wav" && chmod o+r "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.mp3"") in new stack
-- Executing [s@macro-recording:7] Set("SIP/102-00000006", "CDR(filename)=2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.mp3") in new stack
-- Executing [s@macro-recording:8] Set("SIP/102-00000006", "CDR(realdst)=") in new stack
[2017-05-09 07:44:38] WARNING[1207]: func_cdr.c:383 cdr_write_callback: CDR requires a value (CDR(variable)=value)
-- Executing [s@macro-recording:9] MixMonitor("SIP/102-00000006", "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.wav,b,nice -n 19 /usr/local/bin/lame -b 32 --silent "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.wav" "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.mp3" && rm -f "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.wav" && chmod o+r "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.mp3"") in new stack
-- Executing [s@macro-recording:10] Verbose("SIP/102-00000006", "Exit record") in new stack
Exit record
-- Executing [101@manager:3] Dial("SIP/102-00000006", "SIP/101,30,t") in new stack
== Begin MixMonitor Recording SIP/102-00000006
== Using SIP RTP CoS mark 5
-- Called SIP/101
-- SIP/101-00000007 is ringing
-- Nobody picked up in 30000 ms
-- Executing [101@manager:4] FollowMe("SIP/102-00000006", "101") in new stack
> 0xb31f3a58 -- Probation passed - setting RTP source address to 192.168.1.102:7078
-- <SIP/102-00000006> Playing 'followme/pls-hold-while-try.slin' (language 'ru')
-- Started music on hold, class 'default', on channel 'SIP/102-00000006'
-- calling Local/380931111111@call-out-ua/m
-- Executing [380931111111@call-out-ua:1] Set("Local/380931111111@call-out-ua-00000002;2", "RECORDING=1") in new stack
-- Executing [380931111111@call-out-ua:2] Macro("Local/380931111111@call-out-ua-00000002;2", "recording,102,380931111111") in new stack
-- Executing [s@macro-recording:1] GotoIf("Local/380931111111@call-out-ua-00000002;2", "1?yes:no") in new stack
-- Goto (macro-recording,s,2)
-- Executing [s@macro-recording:2] Set("Local/380931111111@call-out-ua-00000002;2", "fname=2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111") in new stack
-- Executing [s@macro-recording:3] Set("Local/380931111111@call-out-ua-00000002;2", "fname=2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111") in new stack
-- Executing [s@macro-recording:4] Set("Local/380931111111@call-out-ua-00000002;2", "DIR_RECORDS=/var/spool/asterisk/monitor/") in new stack
-- Executing [s@macro-recording:5] NoOp("Local/380931111111@call-out-ua-00000002;2", "Dir - 2017/2017-05/2017-05-09") in new stack
-- Executing [s@macro-recording:6] Set("Local/380931111111@call-out-ua-00000002;2", "monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.wav" "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.mp3" && rm -f "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.wav" && chmod o+r "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.mp3"") in new stack
-- Executing [s@macro-recording:7] Set("Local/380931111111@call-out-ua-00000002;2", "CDR(filename)=2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.mp3") in new stack
-- Executing [s@macro-recording:8] Set("Local/380931111111@call-out-ua-00000002;2", "CDR(realdst)=") in new stack
[2017-05-09 07:45:12] WARNING[1207]: func_cdr.c:383 cdr_write_callback: CDR requires a value (CDR(variable)=value)
-- Executing [s@macro-recording:9] MixMonitor("Local/380931111111@call-out-ua-00000002;2", "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.wav,b,nice -n 19 /usr/local/bin/lame -b 32 --silent "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.wav" "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.mp3" && rm -f "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.wav" && chmod o+r "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.mp3"") in new stack
-- Executing [s@macro-recording:10] Verbose("Local/380931111111@call-out-ua-00000002;2", "Exit record") in new stack
Exit record
-- Executing [380931111111@call-out-ua:3] Set("Local/380931111111@call-out-ua-00000002;2", "CHANNEL(musicclass)=mymoh") in new stack
-- Executing [380931111111@call-out-ua:4] Dial("Local/380931111111@call-out-ua-00000002;2", "SIP/380931111111@zadarma,20,m") in new stack
== Begin MixMonitor Recording Local/380931111111@call-out-ua-00000002;2
== Using SIP RTP CoS mark 5
-- Called SIP/380931111111@zadarma
-- Started music on hold, class 'mymoh', on channel 'Local/380931111111@call-out-ua-00000002;2'
[2017-05-09 07:45:12] WARNING[2802][C-00000002]: translate.c:407 framein: no samples for ulawtolin
-- Local/380931111111@call-out-ua-00000002;1 is making progress
-- SIP/zadarma-00000008 is making progress passing it to Local/380931111111@call-out-ua-00000002;2
-- Local/380931111111@call-out-ua-00000002;1 is making progress
-- SIP/zadarma-00000008 is ringing
-- Got SIP response 486 "Busy here" back from 185.45.152.161:5060
-- SIP/zadarma-00000008 is busy
== Everyone is busy/congested at this time (1:1/0/0)
-- Stopped music on hold on Local/380931111111@call-out-ua-00000002;2
-- Executing [380931111111@call-out-ua:5] Hangup("Local/380931111111@call-out-ua-00000002;2", "") in new stack
== Spawn extension (call-out-ua, 380931111111, 5) exited non-zero on 'Local/380931111111@call-out-ua-00000002;2'
== MixMonitor close filestream (mixed)
== Executing [nice -n 19 /usr/local/bin/lame -b 32 --silent "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.wav" "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.mp3" && rm -f "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.wav" && chmod o+r "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305112.21-2017-05-09-07_45-102-380931111111.mp3"]
-- No live channels left for this step.
-- No more steps left.
-- Stopped music on hold on SIP/102-00000006
-- Executing [101@manager:5] Hangup("SIP/102-00000006", "") in new stack
== Spawn extension (manager, 101, 5) exited non-zero on 'SIP/102-00000006'
== MixMonitor close filestream (mixed)
== Executing [nice -n 19 /usr/local/bin/lame -b 32 --silent "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.wav" "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.mp3" && rm -f "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.wav" && chmod o+r "/var/spool/asterisk/monitor/2017/2017-05/2017-05-09/1494305078.18-2017-05-09-07_44-102-101.mp3"]
== End MixMonitor Recording SIP/102-00000006
== End MixMonitor Recording Local/380931111111@call-out-ua-00000002;2
В наступній статті навчимося працювати з чергами викликів в 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).
Посилання
- Photo by John Barkiple on Unsplash