/ #linux 

IP-телефонія на базі Asterisk. Частина 6.6: Додаткові функції Asterisk. Переведення абонента на зовнішню лінію (FollowMe).

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

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 &apos;followme/pls-hold-while-try.slin&apos; (language &apos;ru&apos;)
    -- Started music on hold, class &apos;default&apos;, on channel &apos;SIP/102-00000006&apos;
    -- 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 &apos;mymoh&apos;, on channel &apos;Local/380931111111@call-out-ua-00000002;2&apos;
[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 &apos;Local/380931111111@call-out-ua-00000002;2&apos;
  == 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 &apos;SIP/102-00000006&apos;
  == 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.

Посилання

Author

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

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