Переадресация вызовов в Asterisk

Приведу пример настройки переадресации вызовов в Asterisk.
К примеру на IP-телефонах Grandstream можно включить переадресацию функциями самого телефона, но если телефон находится далеко и нет возможности на нем этого сделать, а есть возможность залогинится под SIP номером этого телефона, то для активации переадресации можно сделать голосовое меню при наборе определенного номера, например *21 для активации переадресации и ввода номера телефона на который будут переадресованы звонки, а *22 для отмены переадресации.

В файле /etc/asterisk/extensions.conf я сначала описал эти два коротких номера для активации и отмены переадресации:

; Bezuslovnaya pereadresaciya
exten => *21,1,Playback(hello)
same => n,Playback(vm-enter-num-to-call)
same => n,Read(cfwd)
same => n,Playback(beep)
same => n,Set(DB(REDIRECT/${CALLERID(num)})=${cfwd})
same => n,Set(DB(REDIRTIMER/TIMER)=10)
same => n,Playback(you-entered)
same => n,SayDigits(${DB(REDIRECT/${CALLERID(num))}})
same => n,Playback(enabled)

; Otmena pereadresacii
exten => *22,1,Set(NOREDIRNUM=${DB_DELETE(REDIRECT/${CALLERID(num)})})
same => n,Playback(disabled)

Если позвонить на номер *21 и ввести номер на который нужно переадресовать звонки, то этот номер просто сохранится в базе данных Asterisk (AstDB), если набрать *22, то этот номер удалится из базы данных.

В этом же файле у меня был диалплан для локального номера 207:

exten => 207,1,Dial(SIP/207,60)
exten => 207,n,Hangup()

Который я изменил к следующему виду, а именно добавил проверку есть ли номер в базе и если есть то выполнять переадресацию на него, если номера нет — то звонить как обычно на локальный номер:

exten => 207,1,Set(REDIRECTNUM=${DB(REDIRECT/${EXTEN})})
exten => 207,n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?internal:redirect)
exten => 207,n(internal),Dial(SIP/${EXTEN})
exten => 207,n(redirect),Dial(SIP/goip4/1${REDIRECTNUM})
exten => 207,n,Hangup()

Goip4/1 это у меня шлюз с SIM картами, цифра 1 означает что звонить нужно через первую SIM карту, если первая SIM карта уже занята другим звонком, то чтобы точно дозвонится можно указать несколько шлюзов, например:

exten => 207,1,Set(REDIRECTNUM=${DB(REDIRECT/${EXTEN})})
exten => 207,n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?internal:redirect)
exten => 207,n(internal),Dial(SIP/${EXTEN})
exten => 207,n(redirect),Dial(SIP/goip4/1${REDIRECTNUM},60)
exten => 207,n(redirect),Dial(SIP/goip4/4${REDIRECTNUM},60)
exten => 207,n(redirect),Dial(SIP/goip4new/1${REDIRECTNUM},60)
exten => 207,n(redirect),Dial(SIP/goip4new/2${REDIRECTNUM},60)
exten => 207,n,Hangup()

Это всего лишь простой пример переадресации, который я быстро написал когда понадобилось часто дистанционно включать переадресацию, еще желательно записать и указать правильные звуки для номеров *21 и *22, а также можно сделать условную переадресацию, например когда вызываемый номер не отвечает 10 секунд и т.д.

Посмотреть данные в базе AstDB можно командой:

asterisk -rvv
database show
exit

Смотрите также другие мои статьи про Asterisk

Вливайтесь в общение

1 комментарий

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

  1. Добрый день, а как сделать условную переадресацию ?