Skip to content

Opensips blog

Заметки voip инженера

  • Talant Blogs about VOIP
  • Готовые сервисы
    • PUSH NOTIFICATIONS API
  • Kamailio
  • Opensips
  • О себе и реквизиты

Asterisk. Annoucement. Dialplan. ChannelRedirect. Elastix. Part 2.

2016-02-03 yooxyman

В предыдущей заметке описал решение с когда пользователь вручную набирает номер и воспроизводит, во время разговора, заранее записанное приветствие.

В этой заметке, мы несколько изменим решение, т.к. оказывается оно еще должно работать с роботом AMI которым пользователи активно пользуются.

Итак, для начала скрипт АМИ, которым осуществляется вызов:

Action: Login
Username: admin
Secret: werkjnfgopw

 

Action: Originate
ActionID: 12345
Channel: Local/117@tapi
Context: agent-custom
Exten: 12122396200
Priority: 1

Ранее смысл решения основывался на том, чтобы сохранить внутренний номер телефона, привязать к нему имя правильного канала (то куда позвонили) и собственно воспроизвести в этот канал файлик с названием “extension_x”.

Для реализации у нас в  файле extension_custom.conf:

Этот контекст ловит определенный номер формата #*00x  и записывает приветствие в файлик “extension_x”. Тут все просто.

[custom-record] ; Context for recording voice messages
exten => _#*00X,1,Noop(${EXTEN})
same => n,Set(CHANNEL(language)=ru)
same => “”n,Set(MONITOR_FILENAME=${DIR}${CALLERID(num)}_${EXTEN:4})
same”” => n,Playback(beep)
same => n,Answer
same => n,Record(${MONITOR_FILENAME}:wav)
same => n,Playback(vm-msgsaved)
same => n,Playback(${MONITOR_FILENAME})
same => n,Playback(vm-goodbye)

этот макрос выполняется когда мы совершаем вызов вручную в функцию Dial встроен код ‘M^(testsub)’ делалось это прям через веб инфтерфейс Эластикса.

[macro-testsub]
exten => s,1,NoOp(${CHANNEL})
exten => s,n,NoOp(${MYVAR})
exten => s,n,Set(DB(br/${MYVAR})=${CHANNEL})
exten => s,n,NoOp(${DB(br/${MYVAR})})

Этот контекст должен вызываться когда с ext приходит команда ##X что означает, что ext хочет воспроизвести приветствие.

[transfer-context]
exten => “” _##X,1,NoOp(${DB(br/${CALLERID(num)})})
exten”” => “”_##X,2,Set(DB(from_ext/last_ext)=${CALLERID(num)})
exten”” => “”_##X,3,ChannelRedirect(${DB(br/${CALLERID(num)})},play-context,${EXTEN},1)
exten”” => _##X,4,Playback(${DIR}${CALLERID(num)}_${EXTEN:-1}) ;
exten => _##X,5,Hangup()

А Это вспомогательный контекст, в него мы перескакием, когда собственно случается событие приоритета 3 в transfer-context. До сих пор не понятно, почему нельзя передать переменную через channelredirect – приходит ее сохранять в DB затем извлекать…

[play-context]
exten => _##X,1,noop(${DB(from_ext/last_ext)})
exten => _##X,2,Playback(${DIR}${DB(from_ext/last_ext)}_${EXTEN:-1}) ;
exten => _##X,3,Set(DB(from_ext/last_ext)=”0″)
exten => _##X,4,Hangup()

 

Итак, при вызове функции AMI Originate как я описал выше, вызывается два пользователя: внутренний 116 например и внешний внутренний вызывается в контексте [tapi]

[tapi]

exten => 116,1,Answer
exten => 116,n,SIPAddHeader(Alert-Info: Ring Answer)
exten => 116,n,NoOp(Context: agent)
exten => 116,n,Dial(SIP/116)
exten => 116,n,hangup

а затем вызывается контекст [agent-custom]: Это все делает тот AMI скрипт. В подчеркнутых строчках сохранение переменной какой внутренний номер позвонил и вызов макроса dialer-dial, который…

exten => _1XXXXXXXXXX,1,Answer

exten => _1XXXXXXXXXX,n,NoOp(Context: agent)
exten => _1XXXXXXXXXX,n,noop(CALLERID: “””${CALLERID(all)})
exten””” => _1XXXXXXXXXX,n,NoOp(EXTEN: ${EXTEN})
exten => _1XXXXXXXXXX,n,noop(SIP_to: ${SIP_HEADER(TO)})
exten => _1XXXXXXXXXX,n,noop(SIP_from: ${SIP_HEADER(FROM)})
exten => _1XXXXXXXXXX,n,Set(__FROM_EXT=${CHANNEL(name)})
exten => _1XXXXXXXXXX,n,Dial(SIP/t1/991${EXTEN},60,r^M(dialer-dial))
exten => _1XXXXXXXXXX,n,noop(DIALSTATUS= ${DIALSTATUS})
exten => _1XXXXXXXXXX,n,gotoif($[“${DIALSTATUS}”= “BUSY”]?busy-custom,s,1)
exten => _1XXXXXXXXXX,n,gotoif($[“${DIALSTATUS}”= “CONGESTION”]?congestion-custom,s,1)
exten => _1XXXXXXXXXX,n,gotoif($[“${DIALSTATUS}”= “CHANUNAVAIL”]?congestion-custom,s,1)
exten => _1XXXXXXXXXX,n,gotoif($[“${DIALSTATUS}”= “NOANSWER”]?congestion-custom,s,1)
exten => _1XXXXXXXXXX,n,hangup

 

который… сохранит для нас связку внутреннего номера и канала который мы вызываем  в базу Астериска.

[macro-dialer-dial]

exten => s,1,NoOp(${FROM_EXT:6:3})
exten => s,n,Set(MYVAR_A=${FROM_EXT:6:3})
exten => s,n,Set(DB(br/${MYVAR_A})=${CHANNEL})

Posted in Asterisk, ChannelRedirect, Готовые решения

Post navigation

Asterisk. Annoucement. Dialplan. ChannelRedirect. Elastix.
Ограничение вызовов для exten

Leave a Reply Cancel reply

You must be logged in to post a comment.

My Profile

Eremin Pavel

Voip developer

P: 79227502213

E: eremina.net@gmail.com

Hire me on Freelancer.com

Управление

  • Register
  • Log in
  • Entries feed
  • Comments feed
  • WordPress.org

Облако

AMI (4) asterisk (19) centos (7) centos 7 (5) certbot (2) certificate (2) debian (3) dispatcher (2) duplicate (2) elastix (3) error (4) events (2) fail (3) freepbx (8) g729 (3) google (2) how to (2) ilbc (2) install (2) ios (2) issabel (4) issue (2) json (2) Kamailio (12) libmicrohttpd (2) limit (2) Load (3) local (2) manual (2) Mysql (8) nat (2) opensips (18) opensips-cli (3) opus (2) PAMI (2) rtpengine (7) rtpproxy (2) SBC (3) ssh (3) timeout (3) tls (5) transcoding (2) voip (4) webrtc2sip (3) windows (3)

Recent Posts

  • TIPS for rpm, rpmbuild, yum
  • Rtpengine. Opus. Ilbc.
  • Oracle Centos 8. Rtpengine with all codecs supported.
  • Auth SIP manual
  • Update opensips 3.2.2 -> 3.2.6 centos 7

Archives

  • October 2022
  • August 2022
  • June 2022
  • May 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • May 2021
  • April 2021
  • March 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • September 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
  • January 2018
  • December 2017
  • November 2017
  • July 2017
  • June 2017
  • May 2017
  • February 2016
  • December 2015
  • August 2015
  • June 2015
  • April 2015
  • February 2015
  • November 2014
  • September 2014
  • July 2014
  • June 2014
  • May 2014
  • August 2013
  • July 2013
  • April 2013
  • September 2012

Categories

  • ansible
  • Asterisk
  • ChannelRedirect
  • freepbx_tips
  • freeswitch
  • kamailio
  • opensips
  • rtpengine
  • SQL запросы
  • ssl\tls
  • Unix вопросы
  • vmware
  • Без рубрики
  • Безопасность
  • Городские номера
  • Готовые решения
  • Общее
  • переадресация
  • Проблемы в коде
  • Проблемы при настройке
  • Эксперт

Meta

  • Register
  • Log in
  • Entries feed
  • Comments feed
  • WordPress.org

© 2023 Opensips blog

Proudly powered by WordPress | Theme: x-blog by wpthemespace.com