Нашел на хабре пример:
exten => #21,1,Set(DB(REDIRECT/${CALLERID(num)})=${EXTEN})
exten => #21#,1,Set(NOREDIRNUM=${DB_DELETE(REDIRECT/${CALLERID(num)})})
exten => s,1,Set(REDIRECTNUM=${DB(REDIRECT/${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})
Как написанно в мануале про ${EXTEN}
Asterisk сохраняет набранный номер в переменной канала ${EXTEN}
Так же на хабре был задан вопрос:
"Есть маленький вопрос. Насколько я понял, для активации переадресации на номер 555555 абонент набирает #21555555. Как система отфильтровывает "#21" от номера 555555. Или в базу так и пойдет "#21555555"?"
К нему объяснение:
#21 — это extension. астериска после каждого ввода цифры проверяет ранее введенную последовательность цифр на соответствие какому-нибудь extension'ов dialplana в пределах некоего контекста.
Алгоритм выглядит очень грубо так:
После ввода определенной последовательности цифр система посимвольно начинает искать соответствие с extensionами. Пользователь дал DTMF команду "#21555555"
У астериски начался проход:
SELECT * FROM DIALPLAN WHERE EXTEN='#*' — Result 5 (есть какие-то команды в dialplanе, которые начинаются с решетки)
SELECT * FROM DIALPLAN WHERE EXTEN='#2*' Result 1 (есть команда, которая начинается на "#2", но выглядит она как exten => #21, значит не интересно)
SELECT * FROM DIALPLAN WHERE EXTEN='#21*' Result 1 (ага, а вот extension #21 есть, значит переходим к его исполнению.
Соответственно все, что дальше было введено, а это 555555 передается в качестве входного аргумента
Что правильно? При попытке реализовать у себя, астериск пишет что объект "#21555555" не найден в контексте, т.е. как я понимаю он не ищет соответствие, а тупо записывает эти цифры в переменную EXTEN. Получается он запишет #21 и всё, может быть сделать так exten => _#21XXXXXX,1,Set(DB(REDIRECT/${CALLERID(num)})=${EXTEN:3})?
# - обычно означает конец набора на каком либо устройстве
exten => 21,1,.... действительно сработает только на 21 и никак не на 215555
правильнее сделать так
_21XXXXXX - создать запись в бд:
exten => _21XXXXXX,1,Set(DB(REDIRECT/${CALLERID(num)})=${EXTEN:2})
_22XXXXXX - убить запись в бд:
exten => _22,1,Set(DB_DELETE(REDIRECT/${CALLERID(num)})
_________________
http://zemlyakovmp.ru - Мой блог о VoIP, Linux, Asterisk.
Вот еще вопрос, REDIRECT/${CALLERID(num)})=${EXTEN})
редирект-семейство, коллерид-ключ
Разве можно изменять путь при присвоении его переменной, как сделали тут?
REDIRECTNUM=${DB(REDIRECT/${EXTEN}
Не правильнее ли сделать
REDIRECTNUM=${DB(REDIRECT/${CALLERID(num)}
правильный синтаксис посмотри в описании команды, я его не помню
но суть в том, что при редиректе должна создаваться запись в бд
redirect//
при удалении должна удаляться запись
redirect/
_________________
http://zemlyakovmp.ru - Мой блог о VoIP, Linux, Asterisk.
| Код: |
| exten => s,1,Set(REDIRECTNUM=${DB(REDIRECT/${EXTEN})}) exten => s,n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?internal:redirect) |
обрабатывается при входящем вызове, соотвественно, /${CALLERID(num) - будет callerid, который к вам из города прилетел, а ${EXTEN}, - как раз Ваш внутренний.
| Код: |
| exten => _*21XXXX,1,Set(DB(REDIRECT/${CALLERID(num)})=${EXTEN:3}) exten => s,1,Set(REDIRECTNUM=${DB(REDIRECT/${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 => _*22,1,Set(DB_DELETE(REDIRECT/${CALLERID(num)}) |
Набираю на телефоне *214555
| Код: |
| -- Executing [*214555@default:1] Set("SIP/4646-00000075", "DB(REDIRECT/4646)=4555") in new stack -- Auto fallthrough, channel 'SIP/4646-00000075' status is 'UNKNOWN' |
Звоню на 4646 - должен по идее переадресовывать на 4555, но нет:
| Код: |
| -- Executing [4646@default:1] Dial("SIP/lst10-00000076", "SIP/4646") in new stack == Using SIP RTP TOS bits 184 == Using SIP RTP CoS mark 5 -- Called SIP/4646 -- SIP/4646-00000077 is ringing |
В чем ошибка?
_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
Но все равно не получается.
У меня два сервера : lst10 c внешними номерами (4150 4149) и lst252 c внутренними номерами (4646).
Нужно сделать переадресацию с 4646 на 4149.
Если делать переадресацию на номера с lst252 - то все работает.
На lst252 в extensions.сonf пишу:
| Код: |
| exten => _*21XXXX,1,Set(DB(REDIRECT/${CALLERID(num)})=${EXTEN:3}) exten => *22#,1,Set(NOREDIRNUM=${DB_DELETE(REDIRECT/${CALLERID(num)})}) |
| Код: |
| exten => 4646,1,Set(REDIRECTNUM=${DB(REDIRECT/${EXTEN})}) exten => 4646,n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?internal:redirect) exten => 4646,n(internal),Dial(SIP/${EXTEN}) exten => 4646,n(redirect),Dial(SIP/${REDIRECTNUM}) |
| Код: |
| exten => _41XX,1,Dial(SIP/lst10/${EXTEN},30,r,t); |
на телефоне набираю *214149
| Код: |
| -- Executing [*214149@default:1] Set("SIP/4646-000147af", "DB(REDIRECT/4646)=4149") in new stack |
Звоню с 4150 на 4646:
| Код: |
| == Using SIP RTP CoS mark 5 -- Executing [4646@default:1] Set("SIP/lst10-000147f4", "REDIRECTNUM=4149") in new stack -- Executing [4646@default:2] GotoIf("SIP/lst10-000147f4", "0?internal:redirect") in new stack -- Goto (default,4646,4) -- Executing [4646@default:4] Dial("SIP/lst10-000147f4", "SIP/4149") in new stack [Dec 4 19:20:46] WARNING[23407][C-00000032]: chan_sip.c:6159 create_addr: Purely numeric hostname (4149), and not a peer--rejecting! [Dec 4 19:20:46] WARNING[23407][C-00000032]: app_dial.c:2437 dial_exec_full: Unable to create channel of type 'SIP' (cause 20 - Subscriber absent) |
А если exten написать через s - то он туда не попадает