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

Определение номера соединившегося абонента

Проблемы Asterisk без вэб-оболочек и их решения

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

Ответить
malamut
Сообщения: 18
Зарегистрирован: 05 май 2011, 23:13

Определение номера соединившегося абонента

Сообщение malamut »

Есть настроенный жутко разветвлённый диалплан. Задача заключается в том, что чтобы после Hangup входящего канала вычислить номер абонента, с которым он разговаривал. Вопрос, собственно, в том, как это универсально сделать?

Есть такие штуки - DIALEDPEERNUMBER и DIALEDPEERNAME. Но они устанавливаются только Dial. Есть такая штука - MEMBERNAME, но она вообще ни о чём не говорит, т.к. разговор может быть перехвачен и тогда в этой переменной будет чушь.

Есть BRIDGEPEER, но если делали Dial на, например, SIP/ext-line/NUM, то в BRIDGEPEER будет только пир, т.е. SIP/ext-line, без NUM, который собственно и нужен.

Вопрос: есть ли у кого-нибудь какое-нибудь универсальное решение, позволяющее в конце разговора определить номер абонента, с которым был соединён текущий канал? Во всех случаях (всякие очереди, перехваты, переводы и т.д. и т.п.)?
ded
Сообщения: 15618
Зарегистрирован: 26 авг 2010, 19:00

Re: Определение номера соединившегося абонента

Сообщение ded »

Универсальное решение:
1) работать только с ИП телефонами, никаких аналоговых.
2) использовть только Xfer (blind transfer)
всё видно на экране.
malamut
Сообщения: 18
Зарегистрирован: 05 май 2011, 23:13

Re: Определение номера соединившегося абонента

Сообщение malamut »

Номер нужен самому астеру, а не на экране)) И да, у нас только IP телефоны, правда, в нескольких филиалах, связанных по IAX, плюс GSM-шлюзы, плюс очереди, перехваты, ну и т.д. и т.п. Короче, почти все базовые плюшки. И звонок может кидаться между всем этим многообразием почти произвольно. А в конце надо понять - с кем же разговаривали перед тем, как повесить трубку?
ded
Сообщения: 15618
Зарегистрирован: 26 авг 2010, 19:00

Re: Определение номера соединившегося абонента

Сообщение ded »

Ну тогда у вас всё есть, только разобраться надо.
malamut
Сообщения: 18
Зарегистрирован: 05 май 2011, 23:13

Re: Определение номера соединившегося абонента

Сообщение malamut »

Я и разбираюсь)) Спросил, потому что боюсь что-то упустить. Вдруг, думаю, уже есть что-то универсальное.
Samael28
Сообщения: 1057
Зарегистрирован: 08 янв 2011, 18:32
Откуда: Киев
Контактная информация:

Re: Определение номера соединившегося абонента

Сообщение Samael28 »

Универсальный совет - сделайте DumрChan на h и проверяйте все сценарии. У меня универсальности не получилось.
Мой профайл на Upwork
malamut
Сообщения: 18
Зарегистрирован: 05 май 2011, 23:13

Re: Определение номера соединившегося абонента

Сообщение malamut »

Вдруг кому пригодится:

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

; ********************************************************************************************************
; Точный номер того, с кем соединились, можно получить только из ${DIALEDPEERNUMBER}. Однако если Dial
; не вызывался (очередь, перехват) - то можно использовать ${BRIDGEPEER}. Правда если вдруг получится,
; что соединялись с пиром вот так: SIP/peer/NUM, то NUM не будет в BRIDGEPEER. В очереди и при перехвате
; такое соединение невозможно, только при Dial. В теории может быть так, что Dial был на одного пира,
; а соединились с другим (перехват?). Тогда не будет совпадать ${DIALEDPEERNAME} и ${BRIDGEPEER}. В этом
; случае тоже нужно использовать ${BRIDGEPEER}. Форматы:
;BRIDGEPEER=SIP/4352-00000045
;DIALEDPEERNUMBER=afiyet-m5/0500 или DIALEDPEERNUMBER=0500
;DIALEDPEERNAME=SIP/4352-00000045
; ********************************************************************************************************
; В любом случае если нету BRIDGEPEER - что-то тут не то, так что возвращаем unknown
exten => s,n,GotoIf($[${SET(PEERNUM=${IF($["${BRIDGEPEER}" = ""]?unknown:"${BRIDGEPEER}")})} = unknown]?command)
; Если BRIDGEPEER не совпадает с DIALEDPEERNAME - берём номер из BRIDGEPEER
exten => s,n,GotoIf($["${BRIDGEPEER}" != "${DIALEDPEERNAME}"]?bridgepeer)
; Если совпадают - из DIALEDPEERNUMBER
exten => s,n,Set(PEERNUM=${IF($[${REGEX("/" ${DIALEDPEERNUMBER})}]?${CUT(DIALEDPEERNUMBER,/,2)}:${DIALEDPEERNUMBER})})
exten => s,n,GotoIf($["${PEERNUM}" != ""]?command)
; Или таки из BRIDGEPEER? (Если имя пира содержит '-', то эта команда вернёт только первую его часть.
; Но '-' тут не должно быть, поскольку BRIDGEPEER должен использоваться только когда пир - локальный номер, а не транк)
exten => s,n(bridgepeer),Set(PEERNUM=${CUT(CUT(BRIDGEPEER,/,2),-,1)})
; Вызываем команду постобработки
exten => s,n(command),System(blah-blah)
Не до конца оттестировал, однако вроде у меня пока что работает. Возможно, что-то я упустил. Если кто скажет что - буду безмерно благодарен))
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH