====== Перенаправление входящих вызовов на сервере Астериск ====== Если приходит звонок, а вызываемого абонента нет на месте, то что происходит? Вызывающий ждет, ждет, после чего либо вызов заканчивается, либо вызывающий перенаправляется в голосовую почту. Сделаем так, чтоб пользователь Астериск мог включить(и когда не нужно, то выключить) перенаправление на свой мобильный (а можно и на просто другой номер - не обязательно мобильный) и не пропускать входящие звонки. При этом будем реализовывать два вида перенаправления: - безусловное - любой входящий перенаправляется на мобильник - условное - перенаправление, если абонент не ответил Включении и отключение безусловного перенаправления будем делать по набору номера *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) ; Переход в контекст исходящих внешних вызовов для набора мобильного номера {{tag>asterisk}}