Переадресация- штука интересная и количество сценариев переадресации звонка очень много.
В случае описываемом мной переадресация выполняется безусловно и включатеся по желанию абонента (вообще данный пример очень просто перделывется в условную переадресацию и если дойдут руки я постараюсь раскрыть эту тему), но все осложняется тем, что сервер на котором регистрируется Asterisk с выходом в город не умеет обрабатывать SIP сообщение 302-Moved Temporarily (Используется SIP канал, но диалплан может быть применен и к другим технологиям). Недостаток метода который я опишу здесь в том, что потребуется 2 Trunk'а или 1, но многоканальный (<2 канала). Метод использует собственную базу данных Asterisk astDB, поэтому советую прочитать об этом, поскольку подробно останавливаться на этом моменте я не буду.
И так приступим: вот весь кусок диалплана, который отвечает за переадресацию вызова:
exten => #21#,1,Set(NOREDIRNUM=${DB_DELETE(REDIRECT/${CALLERID(num)})}) exten => s,1,Set(REDIRECTNUM=${DB(REDIRECT/${EXTEN})})exten => #21,1,Set(DB(REDIRECT/${CALLERID(num)})=${EXTEN})
exten => s,n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?internal:redirect)
exten => s,n(internal),Dial(SIP/${EXTEN})
exten => s,n(redirect),Dial(SIP/TRUNK/${REDIRECTNUM})
Теперь давайте разберем по частям, что за чем идет и что за что отвечает.
Как я уже сказал, переадресация выполняется по желанию клиента. То есть для того, чтобы использовать переадресацию нужно ее включить:
exten => #21,1,Set(DB(REDIRECT/${CALLERID(num)})=${EXTEN})
Эта команда запоминает набранный номер, и номер с которого он был набран, и сохраняет в базе данных Asterisk.
Здесь после набора комбинации #21 нужно донабрать номер для переадресации. Я помещаю в семейство REDIRECT набранный номер ${EXTEN}, который будет доступен по ключу ${CALLERID(num)}. То есть, проще говоря введенный номер будет храниться в таблице REDIRECT в строке ${CALLERID(num)} или доступен по адресу REDIRECT/${CALLERID(num)} базы данныx Asterisk (Команда DB). Переменная ${CALLERID(num)} хранит в себе номер, с которого присходит вызов.
Выключение переадресации происходит подобным образом:
exten => #21#,1,Set(NOREDIRNUM=${DB_DELETE(REDIRECT/${CALLERID(num)})})
Абонент, набирая комбинацию #21# с помощью утилиты DB_DELETE очищает ячейку REDIRECT/${CALLERID(num)}
Здесь я использовал переменную NOREDIRNUM чтобы просто выпонить какие-либо действия с через Set() потому как она ругалась на отсутсвие знака "=". Но вообще можно попробывать и так:
exten => #21#,1,Set(DB_DELETE(REDIRECT/${CALLERID(num)}))
Следующие несколько строк занимаются как раз самым основным — реализацией вызова. Давайте рассмотрим их подробнее:
exten => s,1,Set(REDIRECTNUM=${DB(REDIRECT/${EXTEN})})
Данная строка извлекаем содержимое ячейки REDIRECT/${EXTEN} (номер переадрисации) и присваивает ее значение переменной REDIRECTNUM, для того чтобы проверить задан ли вообще номер переадрисации для данного абонента. То есть если, скажем мы звоним абоненту по номеру 100, то данная команда присваевает значение ячейки REDIRECT/100 переменной REDIRECTNUM.
exten => s,n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?internal:redirect)
Далее производится проверка существования номера перадресации: Если переменная REDIRECTNUM ISNULL (пуста/неопределена) то мы переходим к строке с меткой internal и вызываем абонента по его основному номеру:
exten => s,n(internal),Dial(SIP/${EXTEN})
Если же переменная REDIRECTNUM не пуста, то вызываем номер, указанный в ней.
exten => s,n(redirect),Dial(SIP/TRUNK/${REDIRECTNUM})
Надеюсь кому-нибудь это поможет в освоении просторов Asterisk.
Автор: Ovoshlook