Автодозвон через обратный вызов из Elastix

от автора

Так как не все sip-телефоны умеют автодозвон, а иногда хочется его иметь, я попробовал его реализовать средствами *. Сам собой напрашивается вариант через call-файлы, но тут есть одна неприятность: при соединении у обоих абонентов аппараты звонят одновременно, и когда адресат автодозвона снимает трубку и слышит гудок ожидания, он иногда пугается и вешает трубку (хотя, у меня в офисе все довольно быстро привыкли). Я опробовал 2 варианта, второй показался мне более универсальным и логичным. Различаются они необходимостью править (переназначать) дефолтный контекст from-internal.

Итак, общее для всех:
в файл /etc/asterisk/extensions_custom.conf добавляем:

[macro-autodial] ;проверим длину внутреннего номера (у меня 3), на всякий случай exten => s,1,ExecIf($["${ARG1:0:1}" = "*" | ${LEN(${ARG2})} != 3 ],Hangup) ;формируем .call-файл exten => s,n,System(echo "Channel: Local/${ARG1}@from-internal" > /tmp/${ARG2}${UNIQUEID}.call) exten => s,n,System(echo "MaxRetries: 10" >> /tmp/${ARG2}${UNIQUEID}.call) exten => s,n,System(echo "RetryTime: 20" >> /tmp/${ARG2}${UNIQUEID}.call) exten => s,n,System(echo "WaitTime: 40" >> /tmp/${ARG2}${UNIQUEID}.call) exten => s,n,System(echo -e "Callerid: \\x22CallBack ${ARG1}\\x22 \\x3C${ARG2}\\x3E" >> /tmp/${ARG2}${UNIQUEID}.call) ;звонить будем в контексте, который ниже exten => s,n,System(echo "Context: autodial-internal" >> /tmp/${ARG2}${UNIQUEID}.call) exten => s,n,System(echo "Extension: ${ARG2}" >> /tmp/${ARG2}${UNIQUEID}.call) exten => s,n,System(echo "Priority: 1" >> /tmp/${ARG2}${UNIQUEID}.call) ;кладем на вход астериску exten => s,n,System(sleep 15 && mv -f /tmp/${ARG2}${UNIQUEID}.call /var/spool/asterisk/outgoing/ &) ;говорим пользователю что-нибудь жизнеутверждающее exten => s,n,Playback(ozhidajte-soedinenija)  [autodial-internal] exten => _XXX,1,Dial(SIP/${EXTEN}) exten => _XXX,2,Hangup() 

А вот дальше начинаются различия.
В первом варианте мы продолжаем в файле /etc/asterisk/extensions_custom.conf.
В конец контекста [from-internal-custom] добавляем:

; *20<номер> автодозваниваемся на <номер> exten => _*20X.,1,Macro(autodial,${EXTEN:3},${CALLERID(number)}) exten => _*20X.,2,Hangup() 

Во втором же варианте переходим в файл /etc/asterisk/extensions_override_elastix.conf, который позволяет переназначать дефолтные контексты, не теряя при этом возможности менять настройки через веб-интерфейс.
В нем:

[from-internal] ; сохраняем последний набранный номер exten => _[0-9*#]X.,1,Set(DB(LASTCALLED/${CALLERID(number)})=${EXTEN}) ; дальше в обработку exten => _[0-9*#]X.,2,Goto(from-internal-my,${EXTEN},1)  ; *20 автодозваниваемся на последний набранный номер exten => *20,1,Macro(autodial,${DB(LASTCALLED/${CALLERID(number)})},${CALLERID(number)}) exten => *20,2,Hangup()  ; *20<номер> автодозваниваемся на <номер> exten => _*20X.,1,Macro(autodial,${EXTEN:3},${CALLERID(number)}) exten => _*20X.,2,Hangup()  ; цепляем [from-internal] в том виде, в котором он по дефолту, но под другим именем, для того, чтобы вызывать его после сохранения последнего номера [from-internal-my] include => from-internal-xfer include => bad-number 

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

ссылка на оригинал статьи http://habrahabr.ru/post/214093/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *