Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Передача callerid при переадресации (PRI REDIRECTING)

0

Добрый день, уважаемое сообщество. Asterisk 11.6.0 + dahdi-linux 2.7.1. + libpri 1.4.14 Присоединение к оператору по E1 PRI. Пытаюсь сделать корректную переадресацию с передачей всех параметров. в /etc/asterisk/chan_dahdi.conf usecallingpres = yes Диалплан:

     exten => 4812345678,1,Noop(call to forward)
same => n,Set(REDIRECTING(from-num,i)=4812345678)
same => n,Set(REDIRECTING(from-num-pres)=allowed)
same => n,Set(REDIRECTING(to-num,i)=89012345678)
same => n,Set(REDIRECTING(count,i)=$[${REDIRECTING(count)} + 1])
same => n,Set(REDIRECTING(reason,i)=cfu)
same => n,Set(CALLERID(num-pres)=allowed_passed_screen)
same => n,Dial(DAHDI/G8/89012345678,90)
same => n,Hangup

Звоню с 9033333333 на 4812345678, переадресация установлена на номер 89012345678 Дебаг pri:

PRI Span: 8 > Calling Party Number (len=14) [ Ext: 0  TON: National Number (2)  NPI: ISDN/Telephony Numbering Plan (E.164/E.163) (1)
PRI Span: 8 >                                 Presentation: Presentation allowed, Network provided (3)  '9033333333' ]
PRI Span: 8 > [70 0c a1 38 39 30 33 30 33 37 39 31 31 39]
PRI Span: 8 > Called Party Number (len=14) [ Ext: 1  TON: National Number (2)  NPI: ISDN/Telephony Numbering Plan (E.164/E.163) (1)  '89012345678' ]
PRI Span: 8 > [74 0d 0b 00 8f 34 38 37 32 37 30 30 37 37 32]
PRI Span: 8 > Redirecting Number (len=15) [ Ext: 0  TON: Unknown Number Type (0)  NPI: Unknown (11)
PRI Span: 8 >                               Ext: 0  Presentation: Presentation allowed, User-provided, not screened (0)
PRI Span: 8 >                               Ext: 1  Reason: Forwarded unconditionally (15)  '4812345678' ]
PRI Span: 8 > [a1]
PRI Span: 8 > Sending Complete (len= 1)

После общения с оператором выяснилось, что проблема в Redirecting Number, в Presentation: Presentation allowed, User-provided, not screened должно быть вроде Presentation allowed, User-provided, verified, and passed.

Какой параметр за этот отвечает? (REDIRECTING(from-num-pres)=allowed) не помогает, в документации не могу найти ничего.

UPD: Выставил значение

"REDIRECTING(from-num-pres,i)=3"

В логах вижу, что значение принялось

NoOp("DAHDI/i1/89012345678-11", "REDIRECTING(from-num-pres)=allowed") in new stack

В дебаге же всё-равно: Ext: 0 Presentation: Presentation allowed, User-provided, not screened (0) А должно быть (3)

Попробую откатиться на старые версии libpri, или придется в исходниках искать где эта переменная.

UPD cat /etc/asterisk/chan_dahdi.conf

[channels]
usecallerid=yes
hidecallerid=no
callwaiting=yes
callwaitingcallerid=yes
usecallingpres=yes
pridialplan=national
threewaycalling=yes
transfer=yes
canpark=yes
cancallforward=yes
callreturn=yes
echocancel=yes
relaxdtmf=no
rxgain=0.0
txgain=0.0
callgroup=1
pickupgroup=1
immediate=no
faxdetect=no
language=ru
useincomingcalleridondahditransfer=yes
prilocaldialplan=national
#include dahdi-channels.conf

cat /etc/asterisk/dahdi-channels.conf

; Span 1: TE4/0/1 "T4XXP (PCI) Card 0 Span 1" (MASTER) 
group=0,11
context=from-pstn
switchtype = euroisdn
signalling = pri_cpe
channel => 1-15,17-31
group = 63
удалить закрыть спам изменить тег редактировать

спросил 2013-10-23 08:49:06 +0400

gwein Gravatar gwein
267 7 1 11

обновил 2013-12-24 09:38:04 +0400

Comments

chan_dahdi.conf можете выложить?

Zavr2008 ( 2013-11-12 16:32:08 +0400 )редактировать

Извинясь, за поздний ответ, не видел Ваш комментарий, обновил вопрос. Я ради эксперимента в разрыв поставил Eltex smg1016. Asterisk-(SIP)-Eltex-(PRI)-PSTN. Всё работает.

gwein ( 2013-12-24 09:42:00 +0400 )редактировать

Плата digium или openvox?

bolshoy_plohish ( 2013-12-24 10:19:01 +0400 )редактировать

Digium, Inc. Wildcard TE420P

gwein ( 2013-12-25 08:46:07 +0400 )редактировать

3 Ответа

1

в таких случаях помогает команда grep.

в частности я за 30 секунд нашел упоминания про то что вам нужно

[root@gwcprivate asterisk-1.8.23.1]# grep 'not screened' * -nir
apps/app_setcallerid.c:55:                                              <para>Presentation Allowed, Not Screened.</para>
apps/app_setcallerid.c:67:                                              <para>Presentation Prohibited, Not Screened.</para>

ну и дальше читаете исходники и видите что там функция SetCallerPres

ссылка удалить спам редактировать

ответил 2013-10-23 13:44:53 +0400

meral Gravatar meral flag of Ukraine
23347 24 20 177
http://pro-sip.net/

обновил 2013-10-23 13:46:07 +0400

Comments

Пришлось уехать, небыло возможности попробовать, сейчас вернулся к проблеме. Спасибо, за информацию, проверил. Функция SetCallerPres, depricated в 11-м астериске, за неё отвечает CALLERID(num-pres), но не суть, она изменяет презентацию Calling Party Number (номер абонента "А"). За изменение Redirecting Number, должна отвечать функция REDIRECTING(from-num-pres), вот тут засада. обновил вопрос.

gwein ( 2013-11-12 13:27:33 +0400 )редактировать

ничего не путаете с переменной ${RDNIS} ?

zzuz ( 2013-11-12 16:17:05 +0400 )редактировать

Да нет, наверное, в астериске ${RDNIS} , сейчас CALLERID(RDNIS) передает только номер Redirecting Number.

gwein ( 2013-11-13 09:31:30 +0400 )редактировать
0

-- Устанавливаем TON и NPI Дело в том, что это 1 байт, в котором хранятся 2 величины. Таким образом, 0-15, TON - 0 (Unknown) , 16-31 - TON -1 (International), 32+ - TON - 2 (National) В моем случае TON - national (2) , NPI - E.164/E.163 (1) , Прибавляем к 32 1 и получаем

Set(REDIRECTING(from-num-plan,i)=33)

-- Причина переадресации. Вопрос творческий, но желательно все же, чтобы удаленная сеть не терялась. Ставим "нет ответа"

Set(REDIRECTING(reason,i)=2)

-- Самое сложное - установить Presentation. Необходимо получить величину Allowed, User provided, Verified. Значение этого байта для такой композиции должно быть 00000001 И тут начинается самое интересное. Попытка установить этот байт с помощью десятичной цифры больше 1 проваливается (отображается в дебаге как 32). Мануалы говорят, что libpri не работает корректно с данной функцией (REDIRECTING(from-num-pres)). Вот что пишет про это pri.c

sr->redirecting.from.number.presentation = pres & (PRIPRESRESTRICTION | PRIPRESNUMBER_TYPE);

Чисто теоретически int 1 должна превращаться в нужный байт. Но этого по факту не происходит.
Изучение libpri.h показывает, что
PRIPRESALLOWED 0x00 - что соответствует 000XXXXX
PRIPRESRESTRICTED 0x20 - соответственно 001XXXXX
К великому сожалению, решение этой проблемы видится лишь в модификации исходного кода libpri. К слову, Presentaion для Caller id устанавливается в нужное значение, если равно 1.
В итоге, максимум что удалось REDIRECTING(from-num-pres,i)=1 дает Allowed, User provided, not screened.
Источник информации тут.
http://www.voip-info.org/wiki/view/Asterisk+cmd+CallingPres
-- О полноте изысканий. В первую очередь, стоит ответить немногочисленный характер этих вопросов и скудность материалов. Во вторую очередь, их противоречивость.
Конечно же, я перепробовал практически все возможные комбинации настроек с тем, чтобы получить нужный результат.
Но обо всем по порядку.
https://wiki.asterisk.org/wiki/display/AST/Function_REDIRECTING
Тут существует список возможных данных функции REDIRECTING.
К слову сказать, все что начинается с orig- - не распознается. Подозреваю, эта часть относится к SS7, где существует original called number.
Далее - сухое, для галочки информирование о наличии такой функции
http://www.voip-info.org/wiki/view/Asterisk+func+REDIRECTING
В обоих случаях, скудно представлен набор возможных данных и совершенно нет никакого описания. Единственное, что полезно - datatype,i означает инструкцию каналу не оверрайдить заданные значения. Впрочем, в моем случае работало и без ,i.
В одном из описаний REDIRECTING прямо сказано, что libpri некорректно работает с этой функцией. Или наоборот.
Грязные хаки вроде коррекции заголовочного файла libpri.h ни к чему не привели.
Вывод таков: для libpri это разные байты. Или что-то в самой библиотеке корректирует значение этого байта в момент инициации вызова. В любом случае, положительного эффекта достичь не представляется возможным на данный момент.

ссылка удалить спам редактировать

ответил 2014-04-03 11:05:11 +0400

gostelecom Gravatar gostelecom
1 1

обновил 2014-04-05 18:55:55 +0400

Comments

м. и зачем вы это пишите если вывод "не могу разобратся"? к тому же вы не топикстартер. в чем соль то? нам разобраться за вас?

meral ( 2014-04-03 14:24:51 +0400 )редактировать

причины как минимум три. 1 - указаны ссылки на все, что может пролить свет на решение проблемы (экономим время), 2 - полученный в итоге результат позволяет пропускать вызовы в ТФОП. 3 - локализована проблема до уровня методов в libpri. Если у кого-то есть желание и необходимость, то до путь до патча укорачивается.

gostelecom ( 2014-04-07 11:32:53 +0400 )редактировать

ну ок,че. только врядли ему надо будут эти ссылки. ибо уровень знаний необходимый для патча подрозумевает что человек это знает наизусть.

meral ( 2014-04-07 11:59:28 +0400 )редактировать

в принципе, пара часов в исходниках, базовое знание С и понимание желаемого результата позволит сделать этот патч. Впрочем, спор не об этом. Я потратил несколько часов на изучение этой проблемы и достижение приемлемого результата. Данной репликой хочу сэкономить время другим.

gostelecom ( 2014-04-07 14:01:45 +0400 )редактировать

ваша оценка времени неверна.спора никакого нету.

meral ( 2014-04-08 03:55:20 +0400 )редактировать
0

Попробуй как в примере сделать :-)

exten => 1000,1,NoOp

; For Q.SIG or ISDN point-to-point we should determine the COLR for this

; extension and send it if the call was redirected here.

exten => 1000,n,GotoIf($[${REDIRECTING(count)}>0]?redirected:notredirected)

exten => 1000,n(redirected),Set(REDIRECTING(to-num,i)=${CALLERID(dnid)})

exten => 1000,n,Set(REDIRECTING(to-num-pres)=allowed)

exten => 1000,n(notredirected),NoOp

; Determine that the destination has forwarded the call.

; ...

exten => 1000,n,Set(REDIRECTING(from-num,i)=1000)

exten => 1000,n,Set(REDIRECTING(from-num-pres,i)=allowed)

exten => 1000,n,Set(REDIRECTING(to-num,i)=2000)

; The DivertingLegInformation3 message is needed because at this point

; we do not know the presentation (COLR) setting of the redirecting-to

; party.

exten => 1000,n,Set(REDIRECTING(count,i)=$[${REDIRECTING(count)} + 1])

exten => 1000,n,Set(REDIRECTING(reason,i)=cfu)

; The call will update the redirecting-to presentation (COLR) when it

; becomes available with a redirecting update.

exten => 1000,n,Dial(DAHDI/g1/2000,20)

exten => 1000,n,Hangup

ссылка удалить спам редактировать

ответил 2013-12-25 11:06:29 +0400

bolshoy_plohish Gravatar bolshoy_plohish
1388 25 20 38

Comments

а чем пример принципиально отличается от того, что у меня ? Просто проверка был ли вызов до этого переадресован и всё, Я попробывал, конечно )) Результат ожидаемый. Думаю написать в саппорт диджиума, почему переменная не принимает значение

gwein ( 2013-12-26 11:01:21 +0400 )редактировать

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку
1 закладка

подписаться на rss ленту новостей

Статистика

Задан: 2013-10-23 08:49:06 +0400

Просмотрен: 4,470 раз

Обновлен: Apr 05 '14

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.