AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Переадресация asterisk

Newbies/FAQ Forum 8 сообщений -
#1

Астериск 1.8.15, Убунту 12.04.2.
Нашел на хабре пример:
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})?
#2

Фигня какая-то
# - обычно означает конец набора на каком либо устройстве
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.
#3

Спасибо, так работает)
Вот еще вопрос, REDIRECT/${CALLERID(num)})=${EXTEN})
редирект-семейство, коллерид-ключ
Разве можно изменять путь при присвоении его переменной, как сделали тут?
REDIRECTNUM=${DB(REDIRECT/${EXTEN}
Не правильнее ли сделать
REDIRECTNUM=${DB(REDIRECT/${CALLERID(num)}
#4

я просто показал принцип.
правильный синтаксис посмотри в описании команды, я его не помню
но суть в том, что при редиректе должна создаваться запись в бд
redirect//

при удалении должна удаляться запись
redirect/

_________________
http://zemlyakovmp.ru - Мой блог о VoIP, Linux, Asterisk.
#5

Насколько я понял кусок
Код:

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

обрабатывается при входящем вызове, соотвественно, /${CALLERID(num) - будет callerid, который к вам из города прилетел, а ${EXTEN}, - как раз Ваш внутренний.
#6

Я написал у себя в конфиге так:

Код:
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

В чем ошибка?
#7

Ошибка в логике и понимании. Кусок с проверкой ISNULL должен идти в момент ВЫЗОВА 4646, а не в момент записи переменной для редиректа
_________________
P4 3.0 + 1Gb CentOS 5.8 Aster 1.8.16
Не люблю gui-сборки: натуральный продукт вкуснее.
И еще: я ПРОФИ так как НЕ ЛЕНЮСЬ читать литературу.
#8

Да, так и есть.
Но все равно не получается.
У меня два сервера : 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 - то он туда не попадает Sad