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

caller id + asterisk + chan_dahdi

Newbies/FAQ Forum 9 сообщений 10.09.2011 12:43 - 30.10.2011 14:21
#1 10.09.2011 12:43

caller id + asterisk + chan_dahdi


Доброго всем времени суток!
Понимаю что тема уже избитая, но все же, никак не могу найти решения вторая ночь до 4х утра )))), ну не в какакую не хочет определять caller id.
У оператора на меня стоит Linksys'овский шлюз, точной модели говорить не хотят, но есть мнение что это не иначе как Linksys SPA3102
На вопрос о параметрах настройки получаю : Caller ID Method: ETSI FSK | Caller ID FSK Standard: bell 202
Пробую подключить к линии факс-аппарат KX-FP218, в настройках ставлю тип определителя Caller ID, не АОН!, осуществлять все действия после второго звонка.
И этот аппарат, по крайней мере определяет номер, а asterisk не хочет. ЧТО ДЕЛАТЬ !!! ))))
Причем я пробовал и потчить dahdi для добавления cidbeforering, и в хедерах менял что бы caller id начинался со второго гудка.... неа .... не помогает.!!!!
Уважаемые, подскажите.

Asterisk 1.6.2.5-0ubuntu1.4
Dahdi-Linux-2.5.0.1


Небольшая выжимка из мануала по факсу
Услуга идентификации вызывающего абонента (AOH и Caller ID)
Этот аппарат поддерживает услугу АОН и услугу Caller ID. Для того, чтобы иметь возможность отображать телефонный номер вызывающего абонента, вы должны
активировать соответствующую услугу, предоставляемую вашей телефонной компанией.
Важно:
L Аппарат работает в соответствии со стандартом ETS 300659 и поддерживает только основные функции CLIP (Calling Line Identification Presentation - передача информации о вызывающем абоненте).
L Аппарат отображает только номер телефона вызывающего абонента и его имя.
L Аппарат не поддерживает дополнительные услуги телефонии, которые могут предоставляться в будущем.
L В зависимости от специфики услуги, предоставляемой телефонной компанией, дата/время вызова или имя вызывающего абонента могут не отображаться.
L Этот аппарат установлен на использование услуги АОН по умолчанию.
L Предварительно убедитесь, что следующее число звонков установлено на 2 или более звонков.


root@asterisk:/etc/asterisk# cat ./chan_dahdi.conf
; Span 2: WCTDM/0 "Wildcard TDM410P Board 1"
;;; line="1 WCTDM/0/0 FXSKS (SWEC: OSLEC)"
[channels]
signalling=fxs_ks ;Тип используемой каналом сигнализации
echocanceller=mg2,1 ;Тип кодека эхоподавления
echocancel=yes ;активация эхокомпенсатора Asterisk
echotraining=yes ;обучение эхоподавления (для ускорения процесса изучения эха)
usecallerid=yes ;служит для активации возможности Caller ID
cidstart=ring ;тип сигнализации определителя
cidsignalling=bell ;начало определения(на звонке или на изменении полярности)
cid_rxgain=10.0 ;усиление сигнала для определителя
callprogress=yes ;отслеживание состояния звонка
group=0
context=from-pstn
channel => 1


root@asterisk:/etc/asterisk# cat ./extensions.conf

[general]
static = yes
writeprotect = no
clearglobalvars = no

[globals]
autofallthrough=yes

[default]

[from-pstn]
;exten => fax,1,Goto(to-fax,rcvdig,1) ; В случае, если начнется передача факса, обработать его в контексте fax.
;exten => s,1,Answer
;exten => s,n,Ringing ; Имитация длинных гудков вызова.
;exten => s,n,Wait(1) ; (Имитация вызова в течение 3-х секунд).
exten => s,1,Verbose(Phone=${CALLERID(num)}) ; Возвращаем номер абонента


На выходе получаю тишину ->
*CLI> core set verbose 10


Verbosity was 1 and is now 10
*CLI> -- Starting simple switch on 'DAHDI/1-1'
Got event 18 (Ring Begin)...
Got event 2 (Ring/Answered)...
-- Executing [s@from-pstn:1] Verbose("DAHDI/1-1", "Phone=") in new stack Phone=


Иногда, причем это никак не связано с изменением настроек, вываливается еще и ->
*CLI> core set verbose 10


Verbosity was 1 and is now 10
*CLI>
-- Starting simple switch on 'DAHDI/1-1'
No start bit found in fsk data.
CallerID feed failed: Success
CallerID returned with error on channel 'DAHDI/1-1'
Got event 18 (Ring Begin)...
Got event 2 (Ring/Answered)...
-- Executing [s@from-pstn:1] Verbose("DAHDI/1-1", "Phone=") in new stack Phone=
#2 11.09.2011 14:28

А вообще....есть ли какая то разница в версиях самого астериска в виде синтаксиса написания диалпланов, просто если нет, то может обновиться до 1.8?
Хотя начитавшись форума и багтрекера .... вроде как особого желания нет, я про большое кол-во ошибок.

Added after 2 hours 31 minutes:

Отвечаю сам на свой вопрос..... нет никакой разницы ))))) ну, по крайней мере, на первый взгляд, ибо все конфиги работали
Изменилось только название в представлении ошибки с последней ревизии

Asterisk 1.6.2.20
root@asterisk:/usr/src# asterisk -vc
Asterisk 1.6.2.20, Copyright (C) 1999 - 2010 Digium, Inc. and others.
Created by Mark Spencer
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
................
................
................
Asterisk Ready.
*CLI> core set verbose 10
Verbosity was 1 and is now 10
*CLI> -- Starting simple switch on 'DAHDI/1-1'
Got event 18 (Ring Begin)...
No start bit found in fsk data.
Failed to decode CallerID on channel 'DAHDI/1-1'
CallerID returned with error on channel 'DAHDI/1-1'
-- Executing [s@from-pstn:1] Answer("DAHDI/1-1", "") in new stack
-- Executing [s@from-pstn:2] Verbose("DAHDI/1-1", "Phone=") in new stack
Phone=
*CLI> -- Starting simple switch on 'DAHDI/1-1'
Got event 18 (Ring Begin)...
Got event 2 (Ring/Answered)...
-- Executing [s@from-pstn:1] Answer("DAHDI/1-1", "") in new stack
-- Executing [s@from-pstn:2] Verbose("DAHDI/1-1", "Phone=") in new stack
Phone=


Asterisk 1.8.7.0-rc1
root@asterisk:/usr/src/asterisk-1.8.7.0-rc1# asterisk -vc
Asterisk 1.8.7.0-rc1, Copyright (C) 1999 - 2011 Digium, Inc. and others.
Created by Mark Spencer
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
................
................
................
*CLI> core set verbose 10
Verbosity was 1 and is now 10
*CLI> -- Starting simple switch on 'DAHDI/1-1'
-- Executing [s@from-pstn:1] Answer("DAHDI/1-1", "") in new stack
-- Executing [s@from-pstn:2] Verbose("DAHDI/1-1", "Phone=") in new stack
Phone=

#3 14.09.2011 18:12

народ, ну помогите хоть куда копать, проблема, я смотрю, обширная, я уже и в сырцах смотрел, ничего не высмотрел.
#4 14.09.2011 19:36

попробуйте добавить в /chan_dahdi.conf параметр
sendcalleridafter=2
#5 14.09.2011 23:30

Я, конечно, попробывал и результат был предсказуем, потому, что сдается мне канарья параметр этот для того что бы при исходящем звонке на каком гудке отсылать caller id

Code:
Got event 18 (Ring Begin)...
Got event 2 (Ring/Answered)...
-- Executing [s@from-pstn:1] Answer("DAHDI/1-1", "") in new stack
-- Executing [s@from-pstn:2] Verbose("DAHDI/1-1", "Phone=") in new stack
Phone=


Самое интересное что панас работает с caller id )))))
ума уже не приложу что делать (((

Added after 1 hours 12 minutes:

попробую углубиться иногда бывают ошибки такого вида, а иногда не бывают, но если ее разобрать то

Code:
Got event 18 (Ring Begin)...
No start bit found in fsk data.
CallerID feed failed: Success
CallerID returned with error on channel 'DAHDI/1-1'


мы придем вот к этой функции в callerid.c

Code:
int callerid_feed (struct callerid_state *cid, unsigned char *ubuf, int samples, int codec)

Read samples into the state machine.
Parameters:
cid Which state machine to act upon
ubuf containing your samples
samples number of samples contained within the buffer.
codec which codec (AST_FORMAT_ALAW or AST_FORMAT_ULAW)

Send received audio to the Caller*ID demodulator.
Returns:
Returns -1 on error, 0 for "needs more samples", and 1 if the CallerID spill reception is complete.

возвращает -1 если ошибка, 0 если нужно больше семплов, и 1 если все определили

Code:
int callerid_feed(struct callerid_state *cid, unsigned char *ubuf, int len, int codec)
{
int mylen = len;
.............
if (mylen < 0) {
ast_log(LOG_ERROR, "No start bit found in fsk data.\n");
return -1;
}


тобишь ... если длинна семплов в пределах буфера меньше нуля то и ошибка и выход из функции, потом это уходит в chan_dahdi.c , а там

Code:
res = callerid_feed(cs, buf, res, AST_LAW(p));
if (res < 0) {
ast_log(LOG_WARNING, "CallerID feed failed: %s\n", strerror(errno));
break;


ну раз из callerid.c с ошибкой то и тут то же
Т.е .... получается такая ситуация, что ничего от станции не приходит, но это случается крайне редко.
А в основном просто тишина и не определяет номер

Code:
Got event 18 (Ring Begin)...
Got event 2 (Ring/Answered)...
-- Executing [s@from-pstn:1] Answer("DAHDI/1-1", "") in new stack
-- Executing [s@from-pstn:2] Verbose("DAHDI/1-1", "Phone=") in new stack
Phone=


Значит данные в виде ответа и семплов приходят, ибо в callerid_feed при назначении переменной mylen стоит цикл while (mylen >= 160) те пока не пришло 160 или более семплов выполнять цикл
это уже в нем выход в виде

Code:
if (mylen < 0) {
ast_log(LOG_ERROR, "No start bit found in fsk data.\n");
return -1;
}


Значит что то приходит, но вот ума не приложу как оттрейсить ))))))
#6 18.09.2011 20:32

какая то прям непосильная задача )))) эх, жалко тут ded не обитает, а то хотя бы поумничал )
добавил в исходник callerid.c небольшие изменения и теперь при входящем звонке он показывает длинну семплов, но от этого лучше то не стало, получается что и данные то приходят, но почему из них номер не вытаскивается ...... вопрос

Got event 18 (Ring Begin)...
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 173
mylen is -> 160
mylen after += cid->oldlen/2 -> 273
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 225
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 234
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 164
mylen is -> 160
mylen after += cid->oldlen/2 -> 264
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 187
mylen is -> 160
mylen after += cid->oldlen/2 -> 287
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 217
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 255
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 207
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 238
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 161
mylen is -> 160
mylen after += cid->oldlen/2 -> 261
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 185
mylen is -> 160
mylen after += cid->oldlen/2 -> 285
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 209
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 225
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
mylen is -> 160
mylen after += cid->oldlen/2 -> 160
Got event 2 (Ring/Answered)...
Phone=
#7 18.10.2011 12:41

Есть ли сдвиги?
#8 18.10.2011 20:01

Вот кусок из http://www.asterisk.org/doxygen/trunk/callerid_8c.html


Code:

00321 while (mylen >= 160) {
00322 b = b2 = 0;
00323 olen = mylen;
00324 res = fsk_serial(&cid->fskd, buf, &mylen, &b);
00325
00326 if (mylen < 0) {
00327 ast_log(LOG_ERROR, "No start bit found in fsk data.\n");
00328 return -1;
00329 }
00330
00331 buf += (olen - mylen);
00332
00333 if (res < 0) {
00334 ast_log(LOG_NOTICE, "fsk_serial failed\n");
00335 return -1;
00336 }

Получается что измениться значение mylen могло только тут - res = fsk_serial(&cid->fskd, buf, &mylen, &b);
Те в fsk_serial передали указатель на mylen как я понимаю
Ну и дальше копать нужно уже тут - моих более чем скромных познаний С++ не хватает )
#9 30.10.2011 14:21

abask wrote:
Есть ли сдвиги?

Стоим на месте