Страница 1 из 1
Определение номера соединившегося абонента
Добавлено: 05 сен 2013, 15:14
malamut
Есть настроенный жутко разветвлённый диалплан. Задача заключается в том, что чтобы после Hangup входящего канала вычислить номер абонента, с которым он разговаривал. Вопрос, собственно, в том, как это универсально сделать?
Есть такие штуки - DIALEDPEERNUMBER и DIALEDPEERNAME. Но они устанавливаются только Dial. Есть такая штука - MEMBERNAME, но она вообще ни о чём не говорит, т.к. разговор может быть перехвачен и тогда в этой переменной будет чушь.
Есть BRIDGEPEER, но если делали Dial на, например, SIP/ext-line/NUM, то в BRIDGEPEER будет только пир, т.е. SIP/ext-line, без NUM, который собственно и нужен.
Вопрос: есть ли у кого-нибудь какое-нибудь универсальное решение, позволяющее в конце разговора определить номер абонента, с которым был соединён текущий канал? Во всех случаях (всякие очереди, перехваты, переводы и т.д. и т.п.)?
Re: Определение номера соединившегося абонента
Добавлено: 05 сен 2013, 15:16
ded
Универсальное решение:
1) работать только с ИП телефонами, никаких аналоговых.
2) использовть только Xfer (blind transfer)
всё видно на экране.
Re: Определение номера соединившегося абонента
Добавлено: 05 сен 2013, 15:21
malamut
Номер нужен самому астеру, а не на экране)) И да, у нас только IP телефоны, правда, в нескольких филиалах, связанных по IAX, плюс GSM-шлюзы, плюс очереди, перехваты, ну и т.д. и т.п. Короче, почти все базовые плюшки. И звонок может кидаться между всем этим многообразием почти произвольно. А в конце надо понять - с кем же разговаривали перед тем, как повесить трубку?
Re: Определение номера соединившегося абонента
Добавлено: 05 сен 2013, 15:39
ded
Ну тогда у вас всё есть, только разобраться надо.
Re: Определение номера соединившегося абонента
Добавлено: 05 сен 2013, 15:41
malamut
Я и разбираюсь)) Спросил, потому что боюсь что-то упустить. Вдруг, думаю, уже есть что-то универсальное.
Re: Определение номера соединившегося абонента
Добавлено: 06 сен 2013, 12:12
Samael28
Универсальный совет - сделайте DumрChan на h и проверяйте все сценарии. У меня универсальности не получилось.
Re: Определение номера соединившегося абонента
Добавлено: 06 сен 2013, 13:07
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)
Не до конца оттестировал, однако вроде у меня пока что работает. Возможно, что-то я упустил. Если кто скажет что - буду безмерно благодарен))