VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Помогите с Callthrough

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модераторы: april22, Zavr2008

ded
Сообщения: 15626
Зарегистрирован: 26 авг 2010, 19:00

Re: Помогите с Callthrough

Сообщение ded »

Вы пробовали читать литературу по Астериску? Там есть примеры.

Код: Выделить всё

exten => s,1,NoOp(Caller ID is ${CALLERID(all)})                 ; то что было
exten => s,n,Set(CALLERID(num)=0${CALLERID(num):3}) ; отрезали три символа впереди +49 и вместо них добавили 0
exten => s,n,NoOp(Caller ID is ${CALLERID(all)})                 ; то что стало 
scherkhan
Сообщения: 29
Зарегистрирован: 29 мар 2012, 16:49

Re: Помогите с Callthrough

Сообщение scherkhan »

Честно скажу, читал. Читал я Asterisk, будущее телефонии (второе издание) 2009 года и неоднократно возвращаюсь к ней. В ней имеются замечательные примеры и хорошие приложения по функциям. Кстати, там же есть пример с назойливой девушкой с использованием функции CallerID. Это все понятно. Но мой(моя) Астериск не хочет корректно обрабатывать номера со знаком "+", т.е. ругается на них (лог привел в прошлом посте). Сейчас у меня установлено 1.8.11.0. Может стоит версию обновить?

да, вот еще, что бы хотел получить:
есть алматинский провайдер, который передает номера с кодом города, но без страны: 7273333333. где 727 код города, а 3333333 номер телефона. Обрезать три символа и подставить семизначный номер не сложно. Но если поступит звонок с мобильного или другого города? Т.е. надо проверить код города. если 727, то обрезаем, если другой, то добавляем еще спереди восьмерку.
ded
Сообщения: 15626
Зарегистрирован: 26 авг 2010, 19:00

Re: Помогите с Callthrough

Сообщение ded »

+ - это символ отличный от цифры, поэтому к нему неприменимы шаблоны Z N X.
чтобы парсить плюс надо идти на сделку с совестью:

exten => _+X.,1,NoOp((Caller ID is ${CALLERID(all)})
exten => _+X.,n,Set(CALLERID(num)=0${CALLERID(num):1})
exten => _+X.,n,Goto(incoming,${EXTEN},1)

Если алматинский провайдер передает номера с кодом города, но без страны: 7273333333, то засуньте его в специальный для него контекст и делайте там трансформацию номер, специально только для него. И это не будет касаться других транков, никак.
Vlad1983
Сообщения: 4251
Зарегистрирован: 09 авг 2011, 11:51

Re: Помогите с Callthrough

Сообщение Vlad1983 »

чтоб не было "некоторых" и не плодить маршруты, нужно преобразовать все CID к одному формату своими силами

[inbound]
exten => _X!,1,GoSubIf(0${CALLERID(num)}?sub-cidlookup,s,1)
exten => _X!,n,NoOP( ${CALLERID(name)} ${CALLERID(num)} )

[sub-cidlookup]
exten => s,1,GotoIf($[ ${LEN(${CALLERID(num)})} = 10 ]?add8)
exten => s,n,GotoIf($[ $[ ${LEN(${CALLERID(num)})} = 11 ] & $[ "${CALLERID(num):0:1}" = "8" ] ]?end)
exten => s,n,ExecIf( $[${LEN(${CALLERID(num)})} = 6 ]?Set(CALLERID(num)=83532${CALLERID(num)}) )
exten => s,n,ExecIf( $[${LEN(${CALLERID(num)})} = 5 ]?Set(CALLERID(num)=835342${CALLERID(num)}) )
exten => s,n,Goto(end)
exten => s,n(add8),Set(CALLERID(num)=8${CALLERID(num)})
exten => s,n(end),Set(CALLERID(name)=${CALLERID(num)})
...
exten => s,n,Return()
ЛС: @rostel
scherkhan
Сообщения: 29
Зарегистрирован: 29 мар 2012, 16:49

Re: Помогите с Callthrough

Сообщение scherkhan »

Спасибо большое за помощь! потихоньку догоняю :)

еще один вопросик. как отсортировать входящие по маске? т.е. если телефон в диапазоне 7273130000 - 7273139999, то на одну группу локальных номеров, а остальные на другую?

Спасибо!
scherkhan
Сообщения: 29
Зарегистрирован: 29 мар 2012, 16:49

Re: Помогите с Callthrough

Сообщение scherkhan »

to Vlad1983
опираясь на ваш пример, подогнал под себя и оставил семизначные номер без кода и префиксов. Т.е. если провайдер передает городской семизначный номер, то так же пропускаем его дальше. если городской местный номер, но с кодом города, (такой провайдер, что может местный номер телефона передать то с кодом, то без) то обрезаем код и передаем дальше уже семь цифр как положено. если с кодом другого города или мобильного, то добавляем еще спереди 8 и передаем уже:87771234567. все работает отлично.

еще бы это все в макрос бы загнать, т.к. номеров несколько.

Код: Выделить всё

[incoming]

	exten => ${SIP9},1,GoSubIf(${CALLERID(num)}?sub-cidlookup,s,1)

[sub-cidlookup]

	exten => s,1,GotoIf($[ ${LEN(${CALLERID(num)})} = 7 ]?end)
	exten => s,n,GotoIf($[ $[ ${CALLERID(num):0:3} = 727 ] ]?del:add8) 
	exten => s,n(add8),Set(CALLERID(num)=8${CALLERID(num)})
	exten => s,n,Goto(end)
	exten => s,n(del),Set(CALLERID(num)=${CALLERID(num):3})
	exten => s,n(end),Set(CALLERID(name)=${CALLERID(num)})
	exten => s,n,Dial(.........,30)
можно ли доработать или улучшить? желательно в макросах?
scherkhan
Сообщения: 29
Зарегистрирован: 29 мар 2012, 16:49

Re: Помогите с Callthrough

Сообщение scherkhan »

еще немного доработал. в алмате и области нумерация телефонов дебильная. везде код 727, только в городе номера начинаются на двойку и тройку, а в области семерка. т.е. если из города позвонить в область, надо набрать полный код и номер, 87277хххххх. Поэтому, чтобы точно знать, что номер городской, надо проверить первую цифру семизнака на наличие двойки и тройки, иначе передать полный номер с добавлением восьмерки, если конечно не анонимный.


[incoming]

;обработка входищих алматинских номеров
exten => ${SIP9},1,GoSubIf(${CALLERID(num)}?sub-cidlookup,s,1)
exten => ${SIP9},n,NoOP( ${CALLERID(name)} ${CALLERID(num)} )
exten => ${SIP9},n,Dial(....&.....&....,60,rt)

[sub-cidlookup]

exten => s,1,GotoIf($[ ${LEN(${CALLERID(num)})} = 7 ]?end) ;если семизнак, то отправляем в конец
exten => s,n,GotoIf($[ $[ ${CALLERID(num)} = anonymous ] ]?end)
exten => s,n,GotoIf($[ $[ ${CALLERID(num):0:4} = 7272 ] ]?del)
exten => s,n,GotoIf($[ $[ ${CALLERID(num):0:4} = 7273 ] ]?del:add8)
exten => s,n(add8),Set(CALLERID(num)=8${CALLERID(num)})
exten => s,n,Goto(end)
exten => s,n(del),Set(CALLERID(num)=${CALLERID(num):3})
exten => s,n(end),Set(CALLERID(name)=${CALLERID(num)})
exten => s,n,Return()

вопрос с макросом отпадает
scherkhan
Сообщения: 29
Зарегистрирован: 29 мар 2012, 16:49

Re: Помогите с Callthrough

Сообщение scherkhan »

может кому пригодится, решил проблему с плюсами в номерах. хоть по SIP, хоть GSM/Dongle. на одном из немецких форумах получил ответ, что надо в переменную CallerID в кавычки загнать, и астериск уже будет обращаться не как номеру телефона, а как к символьной цепи:

Код: Выделить всё

[incoming]
	exten => ${SIP1},1,NoOP( ${CALLERID(name)} ${CALLERID(num)} )
	exten => ${SIP1},n,GoSubIf($["${CALLERID(num)}"]?sub-cidlookup-1und1,s,1) 
	exten => ${SIP1},n,NoOP( ${CALLERID(name)} ${CALLERID(num)} )
	...........
	exten => ${SIP1},n,Hangup()
[sub-cidlookup-1und1]

	exten => s,1,NoOp(Caller ID is ${CALLERID(all)})
	exten => s,n,GotoIf($["${CALLERID(num)}"="anonymous"]?end) 
	exten => s,n,Set(CALLERID(num)=${CALLERID(num):1})
	exten => s,n,GotoIf($[ $[ ${CALLERID(num):0:2} = 49 ] ]?del)
	exten => s,n,Set(CALLERID(num)=00${CALLERID(num)})
	exten => s,n,Goto(end)
	exten => s,n(del),Set(CALLERID(num)=0${CALLERID(num):2})
	exten => s,n(end),Set(CALLERID(name)=${CALLERID(num)})
	exten => s,n,Return()		

все работает замечательно и без ошибок!
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH