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

Передача Calling Name из Asterisk в Panasonic TDA (QSIG)

Asterisk IP PBX 15 сообщений 26.02.2010 14:49 - 26.08.2011 07:41
#1 26.02.2010 14:49

Передача Calling Name из Asterisk в Panasonic TDA (QSIG)

Может, кто сталкивался с данной проблемой, не все АТС понимают Fasility IE 0x9f, с которым dahdi передает Calling Name?
При звонке происходит следующее:
На *
> Protocol Discriminator: Q.931 (8) len=62
> Call Ref: len= 2 (reference 62/0x3E) (Originator)
> Message type: SETUP (5)
> [04 03 80 90 a3]
> Bearer Capability (len= 5) [ Ext: 1 Q.931 Std: 0 Info transfer capability: Speech (0)
> Ext: 1 Trans mode/rate: 64kbps, circuit-mode (16)
> User information layer 1: A-Law (35)
> [18 03 a1 83 81]
> Channel ID (len= 5) [ Ext: 1 IntID: Implicit PRI Spare: 0 Preferred Dchan: 0
> ChanSel: As indicated in following octets
> Ext: 1 Coding: 0 Number Specified Channel Type: 3
> Ext: 1 Channel: 1 ]
> [1c 1c 9f aa 06 80 01 00 82 01 00 8b 01 00 a1 0e 02 01 14 02 01 00 80 06 6b 69 72 69 6c 6c]
> Facility (len=30, codeset=0) [ 0x9F, 0xAA, 0x06, 0x80, 0x01, 0x00, 0x82, 0x01, 0x00, 0x8B, 0x01, 0x00, 0xA1, 0x0E, 0x02, 0x01, 0x14, 0x02, 0x01, 0x00, 0x80, 0x06, 'kirill' ]
На TDA
L2: I SAPI:0 TEI:0
L3:
SETUP crn:003F (O)
Bearer Capability: 80 90 A3 (Speech A-Law)
Channel Identity: A1 83 81 (channel=B1 pref.)
Facility: 9F AA 06 80 01 00 82 01 00 8B 01 00 A1 0E 02 01 16 02 01 00 80 06 6B 69 72 69 6C 6C
([Inv] id= 16 op= 0(CallingName(PRI23))

Calling Party Number: 00 80 37 32 30 32 31
Type of Number= Unknown, Numbering Plan= Unknown
Number= 72021
Called Party Number: C9 37 39 35 39 31
Type of Number= Subscriber Number, Numbering Plan= Private
Number= 79591
00 01 3C 5E 08 02 00 3F 05 04 03 80 90 A3 18 03
A1 83 81 1C 1C 9F AA 06 80 01 00 82 01 00 8B 01
00 A1 0E 02 01 16 02 01 00 80 06 6B 69 72 69 6C
6C 6C 07 00 80 37 32 30 32 31 70 06 C9 37 39 35
39 31
Нарыл такую же проблему на соседнем форуме http://asterisk-support.ru/forum/topics/5097, но автор уже потерялся и секрет счастливой совместной жизни унес с собой. Моих навыков программирования не хватило, чтобы найти, что именно править в libpri. Прошу помощи!!!
asterisk-1.4.26.3
libpri-1.4.10.2
dahdi-linux-complete-2.2.0.2+2.2.0

chan_dahdi.conf

[channels]
context=from-pbx
usecallerid=yes
hidecallerid=no
;hidecalleridname=no
cidsignalling=bell
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
canpark=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=yes
relaxdtmf=yes
rxgain=0.0
txgain=0.0
group=1
callgroup=1
pickupgroup=1
immediate=no
pridialplan=private
prilocaldialplan=unknown
facilityenable=yes



; Span 1: WCT1/0 "Wildcard TE122 Card 0" (MASTER) HDB3/CCS YELLOW
group=1
context=from-pbx
switchtype = qsig
signalling = pri_cpe
channel => 1-15,17-31
context = default
#2 27.02.2010 20:35
Что-то мне кажется, что проблема хотя и не специфична, но для решения проще всего (точнее, быстрее всего) надо будет читать все понаписанное ETSI про QSIG на эту тему. Я правда поглядел, про ROSE в ECMA сходу не вьехал, но думается мне что не так там сложно - пару часов посидеть понять как оно кодируется и еще полчаса-час попатчить libpri, благо оно простое как валенок
#3 28.02.2010 13:38
если не ошибаюсь вот нужная функция в pri_facility.c

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

static int add_callername_facility_ies(struct pri *pri, q931_call *c, int cpe) { int res = 0; int i = 0; unsigned char buffer[256]; unsigned char namelen = 0; struct rose_component *comp = NULL, *compstk[10]; int compsp = 0; int mymessage = 0; static unsigned char op_tag[] = { 0x2a, /* informationFollowing 42 */ 0x86, 0x48, 0xce, 0x15, 0x00, 0x04 }; if (!strlen(c->callername)) { return -1; } buffer[i++] = (ASN1_CONTEXT_SPECIFIC | Q932_PROTOCOL_EXTENSIONS); /* Interpretation component */ if (pri->switchtype == PRI_SWITCH_QSIG) { ASN1_ADD_SIMPLE(comp, COMP_TYPE_NFE, buffer, i); ASN1_PUSH(compstk, compsp, comp); ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), buffer, i, 0); ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_2), buffer, i, 0); ASN1_FIXUP(compstk, compsp, buffer, i); } ASN1_ADD_BYTECOMP(comp, COMP_TYPE_INTERPRETATION, buffer, i, 0); ASN1_ADD_SIMPLE(comp, COMP_TYPE_INVOKE, buffer, i); ASN1_PUSH(compstk, compsp, comp); /* Invoke ID */ ASN1_ADD_BYTECOMP(comp, ASN1_INTEGER, buffer, i, get_invokeid(pri)); /* Operation Tag */ res = asn1_string_encode(ASN1_OBJECTIDENTIFIER, &buffer[i], sizeof(buffer)-i, sizeof(op_tag), op_tag, sizeof(op_tag)); if (res < 0) return -1; i += res; ASN1_ADD_BYTECOMP(comp, ASN1_ENUMERATED, buffer, i, 0); ASN1_FIXUP(compstk, compsp, buffer, i); if (!cpe) { if (pri_call_apdu_queue(c, Q931_SETUP, buffer, i, NULL, NULL)) return -1; } /* Now the APDU that contains the information that needs sent. * We can reuse the buffer since the queue function doesn't * need it. */ i = 0; namelen = strlen(c->callername); if (namelen > 50) { namelen = 50; /* truncate the name */ } buffer[i++] = (ASN1_CONTEXT_SPECIFIC | Q932_PROTOCOL_EXTENSIONS); /* Interpretation component */ if (pri->switchtype == PRI_SWITCH_QSIG) { ASN1_ADD_SIMPLE(comp, COMP_TYPE_NFE, buffer, i); ASN1_PUSH(compstk, compsp, comp); ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), buffer, i, 0); ASN1_ADD_BYTECOMP(comp, (ASN1_CONTEXT_SPECIFIC | ASN1_TAG_2), buffer, i, 0); ASN1_FIXUP(compstk, compsp, buffer, i); } ASN1_ADD_BYTECOMP(comp, COMP_TYPE_INTERPRETATION, buffer, i, 0); ASN1_ADD_SIMPLE(comp, COMP_TYPE_INVOKE, buffer, i); ASN1_PUSH(compstk, compsp, comp); /* Invoke ID */ ASN1_ADD_BYTECOMP(comp, ASN1_INTEGER, buffer, i, get_invokeid(pri)); /* Operation ID: Calling name */ ASN1_ADD_BYTECOMP(comp, ASN1_INTEGER, buffer, i, SS_CNID_CALLINGNAME); res = asn1_string_encode((ASN1_CONTEXT_SPECIFIC | ASN1_TAG_0), &buffer[i], sizeof(buffer)-i, 50, c->callername, namelen); if (res < 0) return -1; i += res; ASN1_FIXUP(compstk, compsp, buffer, i); if (cpe) mymessage = Q931_SETUP; else mymessage = Q931_FACILITY; if (pri_call_apdu_queue(c, mymessage, buffer, i, NULL, NULL)) return -1; return 0; } /* End Callername */
но откуда она берет значение первого байта не могу понять. как константа 9f не прописана ни в одном файле.

Added after 55 minutes:

судя по всему достаточно заменить

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

buffer[i++] = (ASN1_CONTEXT_SPECIFIC | Q932_PROTOCOL_EXTENSIONS); 
на

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

buffer[i++] = (ASN1_CONTEXT_SPECIFIC | 0x11); 
завтра буду пробовать
#4 01.03.2010 14:55
Так а чем кончилось?
Что, реально хватает только тип IE'шки поменять?
#5 01.03.2010 17:16
только оттестил
добавил новую константу
Q932_PROTOCOL_EXTENSIONS_CN = 0x11 в facility.h
подправил в функции static int add_callername_facility_ies в facility.c
buffer[i++] = (ASN1_CONTEXT_SPECIFIC | Q932_PROTOCOL_EXTENSIONS)
на
buffer[i++] = (ASN1_CONTEXT_SPECIFIC | Q932_PROTOCOL_EXTENSIONS_CN)

при звонке с * на ТДА все работает, в обратную сторону не хочет.

Added after 20 minutes:

было бы неплохо постараться решить вопрос с передачей и в другую сторону, но тут как-то трогать функции разбора сообщений не особо хочется...
да и * в продакшене.
#6 08.04.2010 11:03
soloma
А дальше разобраться удалось?
Я просто уже к методу научного тыка перешёл, но настроить в обратную сторону передачу не получается. :(
#7 20.04.2010 08:34
Сейчас точно не скажу, но нашел в pri_facility.c или q931.c функцию приема и декодирования сообщения, там соответственно нужно подправить, что бы фасилити 0х91 декодировалось как protocol extensions, тоесть как 0x9f.
У себя пока не пробовал, поскольку все * с платами сейчас в работе.

Added after 29 minutes:

зы по идее смотреть нужно static FUNC_RECV(receive_facility) в q931.c.
#8 18.06.2010 09:11
soloma, удалось ли Вам решить проблему?
#9 29.06.2010 15:43
к сожалению все * в продакшене. по идее в течении месяца может появиться еще один как раз с платой на панас, попробую потестить но не уверен на 100%, что будет время. если есть возможность потестить, готов высказать свои мысли более подробно.
#10 27.08.2010 10:57

сделал в обе стороны

Всем привет, мне удалось связать * и TDA-200 подробности тут http://mini-ats.info/index.php/conf/vie ... 96/#189615
пакет с пропатченной библиотекой доступен тут ftp://linvinus.ru/tda_200_facility/libp ... 1_i386.deb
патч в процессе, не решены следующие вопросы:
1) кодировка на TDA-200 CP1251 я написал конвертор но он работает на уровне контекста
[off]2) при звонке с * на ТДА, ТДА присылает имя вызываемого абонента, но оно не попадает в sip,
т.е. в pri логе я вижу имя а в sip логе никакой информации о нём нет, может есть какая нибудь опция?
получается:
*->TDA
звонок первый раз
на SIP телефоне виден только вызываемый номер, на TDA видна фамилия вызывающего
TDA->*
звонок первый раз
на TDA не видна фамилия вызываемого, только номер, на SIP телефоне видна фамилия вызывающего (фамилия обработана конвертером)
*->TDA
звонок второй раз
на SIP телефоне видна фамилия и на TDA видна фамилия вызывающего
TDA->*
звонок второй раз
на TDA не видна фамилия вызываемого, только номер, на SIP телефоне видна фамилия вызывающего (фамилия обработана конвертером)[/off]
2) Это глюк "фича" spa941

конвертор

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

use Asterisk::AGI; use Encode; # use http://search.cpan.org/dist/Lingua-Translit/translit use Lingua::Translit; $AGI = new Asterisk::AGI; my %input = $AGI->ReadParse(); my $callerid = $input{'callerid'}; my $calleridname = $input{'calleridname'}; Encode::from_to($calleridname, "cp1251", "utf8"); my $tr = new Lingua::Translit("ISO 9"); my $calleridname = $tr->translit($calleridname); $calleridname =~ s/ /_/g; $AGI->exec('Set', "CALLERID(name)=\"$calleridname\""); exit(0); 
span_2 - связь с TDA по E1
контекст для входящих с TDA

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

[DID_span_2] exten = _X.,1,Noop(${CALLERID(name)}) exten = _X.,n,AGI(calleridnamerecode.pl) exten = _X.,n,Noop(${CALLERID(name)})
#11 09.09.2010 16:38
сможешь кинуть сырцы? мейл в личке.
#12 10.09.2010 09:25

патч

патч доступен тут: ftp://linvinus.ru/asterisk/tda_200_faci ... est.dpatch
ftp://linvinus.ru/asterisk/tda_200_facility/

там же собранный пакет для ubuntu|debian i386
там же дебианизированные исходники с необходимыми патчами.

По прошествии двух недель, могу сказать, что патч работает, никаких проблем не вызывает.

2soloma, если разберёшься как адаптировать патч для libpri-1.4.11.2 сообщи пожалуйста.
я пока глубоко не копался, исходники сильно отличаются.

И ещё лучше использовать

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

my $tr = new Lingua::Translit("GOST 7.79 RUS");
для транслита, иначе некоторые буквы на spa941 выпадают.
#13 09.12.2010 20:40
Сегодня столкнулся с такой-же проблемой. Стабильно работает патч?

Не могу скачать.
#14 15.12.2010 18:15
Та же проблема, получилось ли кому нормально передать коллерайди с ТДА на *?
#15 26.08.2011 07:41
Чего в личку не писали?
У меня патч работает с тех самых пор, никаких проблем нет.

Проблема портировать на новую libpri там чёрт ногу сломит :(
Что касается доступности файла, он у меня на роутере, который периодически виснет :(

Added after 27 minutes:

Описание конфигурации для Shoogle.

связка такая
PTSN ->E1 (span1)->asterisk->E1 (span2)->TDA-200

Конфигурация астериска:
asterisk

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

# dpkg -l \*asterisk\* | grep ii ii asterisk 1:1.6.2.5-0ubuntu1.1 Open Source Private Branch Exchange (PBX) ii asterisk-config 1:1.6.2.5-0ubuntu1.1 Configuration files for Asterisk ii asterisk-sounds-main 1:1.6.2.5-0ubuntu1.1 Core Sound files for Asterisk (English) ii libasterisk-agi-perl 1.01-2 Collections of Perl modules to be used with # dpkg -l \*dahdi\* | grep ii ii dahdi 1:2.2.1-0ubuntu2 utilities for using the DAHDI kernel modules ii dahdi-dkms 1:2.2.1+dfsg-1ubuntu2 DAHDI telephony interface (dkms kernel drive ii dahdi-linux 1:2.2.1+dfsg-1ubuntu2 DAHDI telephony interface - Linux userspace ii dahdi-modules-2.6.24-24-server 1:2.1.0.4~dfsg-1.6981linvinus1+2.6.24-24.51 DAHDI modules for Linux (kernel 2.6.24-24-se ii dahdi-modules-2.6.32-24-generic-pae 1:2.2.1+dfsg-1ubuntu2+2.6.32-24.39 DAHDI modules for Linux (kernel 2.6.32-24-ge ii dahdi-source 1:2.2.1+dfsg-1ubuntu2 DAHDI telephony interface - source code for # dpkg -l \*libpri\* | grep ii ii libpri1.4 1.4.10.2-99linvinus1 Primary Rate ISDN specification library 
Конфиг dahdi

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

# Span 3: TE4/0/2 "T4XXP (PCI) Card 0 Span 2". span=2,2,0,ccs,hdb3 # termtype: te bchan=32-46,48-62 dchan=47 echocanceller=oslec,32-46,48-62 
users.conf

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

[span_2] group = 2 context = DID_span_2 trunkname = Span 2 hasexten = no callerid = fullname usecallerid=yes hidecallerid=no hidecalleridname=no cidsignalling=bell callwaiting=yes usecallingpres=yes callwaitingcallerid=yes threewaycalling=yes transfer=yes canpark=yes cancallforward=yes callreturn=yes echocancel=yes echocancelwhenbridged=yes relaxdtmf=yes rxgain=0.0 txgain=0.0 pridialplan=private prilocaldialplan=unknown facilityenable=yes trunkstyle = digital ; GUI metadata switchtype = qsig signalling=pri_cpe dahdichan = 32-46,48-62 
extensions.conf

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

 [globals] span_2 = DAHDI/g2 [DID_span_2] exten = _X.,1,Noop(${CALLERID(name)}) exten = _X.,n,AGI(calleridnamerecode.pl) exten = _X.,n,Noop(${CALLERID(name)}) exten = _X.,n,Goto(Default,${EXTEN:0},1) exten = _X.,n,hangup() 
TDA-200 настраивается по стандартной конфигурации qsig в режиме мастер
Инструкция "Соединяем две АТС по QSIG" в файле "АТС Panasonic KXT TDA100 - TDA200 - инструкция по программированию с Maintenance Console на русском языке с примерами (2 часть)" тут http://www.amitek.ru/tda-progr.php

Патч библиотеки libpri доступен выше.