Встречается ситуация когда сотрудники находясь в командировках звонят с сотовых по межгороду в головной офис, хотя в офисе стоит АТС на которую заведет отличный дешевый оператор связи со вкусными ценами, или просто звонят на внутренний номер абонента, через внешний номер, да кучу ситуаций можно придумать общая проблема которых — обратный звонок. Именно для этих целей я и реализовал очередной сценарий, при котором сотруднику достаточно позвонить на номер, а потом АТС сама ему перезвонит и уже вызываемый абонент сможет сделать через АТС то, что ему необходимо не за счет своего баланса на сотовом, городском операторе или каком либо другом операторе предоставления телекоммуникационных услуг, а, например, за счет более дешевых услуг, подключенных к АТС.
Частный случай такой ситуации реализован в сегодняшнем примере диалплана:
Дозванивается на внешний номер -> АТС перезванивает обратно -> набираем внутренний номер абонента -> общаемся за через исходящий с транка на АТС.
что нам потребуется:
Пара строчек диалплана, которые будут обрабатывать входящее соединение и исходящее соединение
Скрипт генерации .call файла.
И так. Первым шагом нам нужно… закончить звонок:
[callback-context]
exten => _7XXXXX.,1,Hangup
Далее вся обработка (какое слово громкое- обработка… Так… Обработочка) будет происходить в ексеншне «h» этого же контекста, так как трубку мы уже положили.
Запускаем скрипт по созданию .call файла.
exten => h,1,System(/usr/local/scripts/callback.sh ${CALLERID(num)})
Сам скрипт выглядит вот так:
#!/bin/bash
callee=$1
Channel="SIP/"$callee
MaxRetries=10
RetryTime=10
WaitTime=20
Context="call-to"
Extension="callback"
Priority=1
DATA=`date`
echo "Channel: $Channel
CallerId: EXTERNAL_PBX_NUM <EXTERNAL_PBX_NUM>
MaxRetries: $MaxRetries
RetryTime: $RetryTime
WaitTime: $WaitTime
Context: $Context
Extension: $Extension
Priority: $Priority" > /var/spool/asterisk/outgoing/$callee.call
Скрипт перезвонит тому кто вызывал АТС и после того как он поднимет трубку переведет канал в контекст call-to на extension callback для обработки:
В данном контексте мы проиграем файл приветствия и приглашения к вводу номера (для тех кто будет заниматься капипастой — имя файла кастомное. По умолчанию в Asterisk этого файла нет. Запишите свой или используйте стандартный ) будем ожидать ввода номера на который необходимо позвонить который должен состоять из — Максимум 4, ожидать мы будем 5 секунд и дадим только 1 попытку на ввод.
После ввода номера звоним на него и соединяем 2 канала в бридж функцией Dial.
[call-to]
exten => callback,1,Read(NUM,input-number,4,n,1,5)
exten => callback,n,DIAL(PJSIP/${NUM})
Таким образом мы звоним на внутренний номер не за свой счет, а за счет АТС.
P.S.
1. Для перфекционистов: Да, я не поставил ввод пинкода. сами сделайте если вам нужно (подскажу — Надо ще раз использовать функцию Read ).
1. Да, АТС не дозвонится до абонента если он сам звонил с транка за которым не закреплен номер (которому выдается динамический номер).
Автор: Ovoshlook