Инструменты пользователя

Инструменты сайта


asterisk:perenapravlenie_vxodjaschix_vyzovov

Перенаправление входящих вызовов на сервере Астериск

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

Сделаем так, чтоб пользователь Астериск мог включить(и когда не нужно, то выключить) перенаправление на свой мобильный (а можно и на просто другой номер - не обязательно мобильный) и не пропускать входящие звонки. При этом будем реализовывать два вида перенаправления:

  1. безусловное - любой входящий перенаправляется на мобильник
  2. условное - перенаправление, если абонент не ответил

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

Включен или выключен редирект будет определять наличие или отсутствие в astdb записи в таблице. Для безусловного редиректа это таблица redirect, для условного backupredirect. Имя записи будет совпадать с аккаунтом(номером) пользователя Астериск, а значение записи будет содержать номер телефона, на который будет производиться перенаправление.

Часть диалплана (extensions.conf), отвечающая за включение и отключение перенаправлений:

exten => *4,1,Answer() ; включение/отключение безусловного редиректа
exten => *4,n,GotoIf($["${DB(redirect/${CALLERID(num)})}" = ""]?notexist:exist) ;проверка включен или выключен редирект в данный момент
exten => *4,n(exist),NoOp(${DB_DELETE(redirect/${CALLERID(num)})}) ; удаляем из astdb запись о перенаправлении
exten => *4,n,Playback(call-forwarding&number&removed&vm-goodbye&silence/1) ; воспроизводим сообщение об удалении записи
exten => *4,n,Hangup()
exten => *4,n(notexist),Goto(setredirect,s,1) ; переходим в контекст включения редиректа
 
exten => *6,1,Answer()  ; включение/отключение редиректа (если вызываемый не ответит)
exten => *6,n,GotoIf($["${DB(backupredirect/${CALLERID(num)})}" = ""]?notexist:exist) ;проверка включен или выключен редирект в данный момент
exten => *6,n(exist),NoOp(${DB_DELETE(backupredirect/${CALLERID(num)})}) ; удаляем из astdb запись о перенаправлении
exten => *6,n,Playback(call-forwarding&number&removed&vm-goodbye&silence/1) ; воспроизводим сообщение об удалении записи
exten => *6,n,Hangup()
exten => *6,n(notexist),Goto(setbackupredirect,s,1) ; переходим в контекст включения условного редиректа
 
[setredirect] ;Запись в базу номера для безусловного редиректа
exten => s,1,Playback(call-forwarding&privacy-prompt&beep)
exten => s,n,WaitExten(16)
exten => _8XXXXXXXXXX,1,Set(DB(redirect/${CALLERID(num)})=${EXTEN})
exten => _8XXXXXXXXXX,n,Playback(beep&number)
exten => _8XXXXXXXXXX,n,SayDigits(${EXTEN})
exten => _8XXXXXXXXXX,n,Playback(beep)
exten => _8XXXXXXXXXX,n,Hangup()
 
[setbackupredirect] ;Запись в базу номера для редиректа в случае отсутствия ответа
exten => s,1,Playback(call-forwarding&privacy-prompt&beep)
exten => s,n,WaitExten(16)
exten => _8XXXXXXXXXX,1,Set(DB(backupredirect/${CALLERID(num)})=${EXTEN})
exten => _8XXXXXXXXXX,n,Playback(beep)
exten => _8XXXXXXXXXX,n,SayDigits(${EXTEN})
exten => _8XXXXXXXXXX,n,Playback(beep)
exten => _8XXXXXXXXXX,n,Hangup()

Часть диалплана (extensions.conf), отвечающая за обработку перенаправлений при входящем звонке:

exten => _XXX,1,NoOp(New call from ${CALLERID(num)} to ${EXTEN})
exten => _XXX,n,Set(REDIRNUM=${DB(redirect/${EXTEN})}) ; Считываем из astdb значение в переменную REDIRNUM для безусловного перенаправления, если для номера задано безусловное перенаправление
exten => _XXX,n,GotoIf($[${LEN(${REDIRNUM})} > 0]?CALLMOBILE) ; Перенаправление на мобильный если задано безусловное перенаправление (переменная REDIRNUM не пустая)
exten => _XXX,n,Dial(PJSIP/${EXTEN})  ;Вызов абонента
exten => _XXX,n(gooff),Set(REDIRNUM=${DB(backupredirect/${EXTEN})}) ; ; Считываем из astdb значение в переменную REDIRNUM для перенаправления, если для номера задано безусловное перенаправление
exten => _XXX,n,GotoIf($[${LEN(${REDIRNUM})} > 0]?CALLMOBILE) ; Перенаправление на мобильный если задано условное перенаправление (переменная REDIRNUM не пустая)
exten => _XXX,n,Voicemail(${EXTEN}@voicemail,${IF($["{DIALSTATUS}" = "BUSY"]?b:u)}) ; Отправляем звонок в голосовую почту
exten => _XXX,n,Hangup()
exten => _XXX,n(CALLMOBILE),PlayBack(call-forwarding&transfer) ;Воспроизводим сообщение о перенаправлении
exten => _XXX,n,Goto(to-external,${REDIRNUM},1) ; Переход в контекст исходящих внешних вызовов для набора мобильного номера
asterisk/perenapravlenie_vxodjaschix_vyzovov.txt · Последнее изменение: 2022/04/08 13:02 — san

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki