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 или более звонков.
Этот аппарат поддерживает услугу АОН и услугу 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
;;; 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=
Хотя начитавшись форума и багтрекера .... вроде как особого желания нет, я про большое кол-во ошибок.
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.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=
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=
sendcalleridafter=2
| 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; } |
Значит что то приходит, но вот ума не приложу как оттрейсить ))))))
добавил в исходник 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=
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=
| 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 как я понимаю
Ну и дальше копать нужно уже тут - моих более чем скромных познаний С++ не хватает )
| abask wrote: |
| Есть ли сдвиги? |
Стоим на месте