Страница 1 из 1

Перевод звонков не работает

Добавлено: 24 ноя 2010, 03:59
shumiloff
Добрый день!
Помогите пожалуйста со следующей проблемой, а то шесть утра, а я всё ещё на работе :)

Есть шлюз d-link dvg-6004s, к которому подключена внешняя линия. Есть Siemens GIGASET C470IP с двумя трубками. На трубках заведены аккаунты 700 и 701. Для первой входящей линии длинка сделан транк dvg1.

Задумка: При звонке длинк набирает номер горячей линии 1000, после чего астериск должен соединить его с аккаунтом 701, то есть перебросить на первую трубку. Владелец трубки с номером 701 должен в случае необходимости набрать решётку, затем 700, после чего разговор должен переключиться на трубку 700.

Что имеем на данный момент: При звонке на внешний номер, длинк набирает номер 1000, в mysql благополучно создаётся запись о звонке, начинается запись разговора, после чего начинают звонить ОБА телефона - и 700 и 701, причём на обоих телефонах на экране корректно отображается callerid звонящего. А при попытке перевести на другой номер, астериск разрывает соединение.

Как заставить звонить только один внутренний телефон и переводиться звонки и почему такое может происходить?

Содержимое sip.conf:

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

[dsets](!)                                                                                                                                                                
type=friend                                                                                                                                                               
host=dynamic                                                                                                                                                              
secret=kern77                                                                                                                                                             
nat=yes                                                                                                                                                                   
context=incoming                                                                                                                                                          
disallow=all                                                                                                                                                              
allow=alaw                                                                                                                                                                
allow=ulaw                                                                                                                                                                
allow=gsm                                                                                                                                                                 
usecallerid=yes                                                                                                                                                           
hidecallerid=no                                                                                                                                                           
                                                                                                                                                                          
[dvg0](dsets)                                                                                                                                                             
username=dvg0                                                                                                                                                             
secret=passdvg                                                                                                                                                            
                                                                                                                                                                          
[dvg1](dsets)                                                                                                                                                             
username=dvg1                                                                                                                                                             
                                                                                                                                                                          
[dvg2](dsets)                                                                                                                                                             
username=dvg2                                                                                                                                                             
                                                                                                                                                                          
[dvg3](dsets)                                                                                                                                                             
username=dvg3                                                                                                                                                             
                                                                                                                                                                          
[dvg4](dsets)                                                                                                                                                             
username=dvg4

[sets](!)                                                                                                                                                                 
type=friend                                                                                                                                                               
context=office                                                                                                                                                            
host=dynamic                                                                                                                                                              
allowtransfer=yes                                                                                                                                                         
nat=yes                                                                                                                                                                   
callgroup=1                                                                                                                                                               
pickupgroup=1                                                                                                                                                             
disallow=all                                                                                                                                                              
allow=alaw                                                                                                                                                                
allow=ulaw                                                                                                                                                                
allow=gsm                                                                                                                                                                 
                                                                                                                                                                          
[700](sets)                                                                                                                                                               
username=700                                                                                                                                                              
secret=pass700                                                                                                                                                           
                                                                                                                                                                          
[701](sets)                                                                                                                                                               
username=701                                                                                                                                                              
secret=pass701 
Кусок настройки экстенжнов:

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

[incoming]
exten => 1000,1,noop("extended CDR")
exten => 1000,n,Set(CDR(hangupcause)=${HANGUPCAUSE})
exten => 1000,n,Set(CDR(peerip)=${CHANNEL(peerip)})
exten => 1000,n,Set(CDR(recvip)=${CHANNEL(recvip)})
exten => 1000,n,Set(CDR(fromuri)=${CHANNEL(from)})
exten => 1000,n,Set(CDR(uri)=${CHANNEL(uri)})
exten => 1000,n,Set(CDR(useragent)=${CHANNEL(useragent)})
exten => 1000,n,Set(CDR(codec1)=${CHANNEL(audioreadformat)})
exten => 1000,n,Set(CDR(codec2)=${CHANNEL(audiowriteformat)})
exten => 1000,n,Set(CDR(llp)=${CHANNEL(rtpqos,audio,local_lostpackets)})
exten => 1000,n,Set(CDR(rlp)=${CHANNEL(rtpqos,audio,remote_lostpackets)})
exten => 1000,n,Set(CDR(ljitt)=${CHANNEL(rtpqos,audio,local_jitter)})
exten => 1000,n,Set(CDR(rjitt)=${CHANNEL(rtpqos,audio,remote_jitter)})
exten => 1000,n,Set(fname=${STRFTIME(${EPOCH},,%Y.%m.%d-%H.%M.%S)}-${CALLERID(num)}.wav,,Tt)
exten => 1000,n,MixMonitor(/home/audio/${fname}.wav)
exten => 1000,n,Dial(SIP/701,45,Tt)

[office]

exten => 700,1,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)}-${CALLERID(num)-${EXTEN}})
exten => 700,n,MixMonitor(/home/audio/${fname}.wav)
exten => 700,n,Dial(SIP/700,10)

exten => 701,1,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)}-${CALLERID(num)-${EXTEN}})
exten => 701,n,MixMonitor(/home/audio/${fname}.wav)
exten => 701,n,Dial(SIP/701,10)
Пошёл звонок:

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

    -- Executing [1000@incoming:1] NoOp("SIP/dvg1-02865028", ""extended CDR"") in new stack
    -- Executing [1000@incoming:2] Set("SIP/dvg1-02865028", "CDR(hangupcause)=0") in new stack
[Nov 24 03:41:11] WARNING[72923]: func_channel.c:98 func_channel_read: Unknown or unavailable item requested: 'peerip'
    -- Executing [1000@incoming:3] Set("SIP/dvg1-02865028", "CDR(peerip)=") in new stack
[Nov 24 03:41:11] WARNING[72923]: func_channel.c:98 func_channel_read: Unknown or unavailable item requested: 'recvip'
    -- Executing [1000@incoming:4] Set("SIP/dvg1-02865028", "CDR(recvip)=") in new stack
[Nov 24 03:41:11] WARNING[72923]: func_channel.c:98 func_channel_read: Unknown or unavailable item requested: 'from'
    -- Executing [1000@incoming:5] Set("SIP/dvg1-02865028", "CDR(fromuri)=") in new stack
[Nov 24 03:41:11] WARNING[72923]: func_channel.c:98 func_channel_read: Unknown or unavailable item requested: 'uri'
    -- Executing [1000@incoming:6] Set("SIP/dvg1-02865028", "CDR(uri)=") in new stack
[Nov 24 03:41:11] WARNING[72923]: func_channel.c:98 func_channel_read: Unknown or unavailable item requested: 'useragent'
    -- Executing [1000@incoming:7] Set("SIP/dvg1-02865028", "CDR(useragent)=") in new stack
    -- Executing [1000@incoming:8] Set("SIP/dvg1-02865028", "CDR(codec1)=alaw") in new stack
    -- Executing [1000@incoming:9] Set("SIP/dvg1-02865028", "CDR(codec2)=alaw") in new stack
    -- Executing [1000@incoming:10] Set("SIP/dvg1-02865028", "CDR(llp)=0") in new stack
    -- Executing [1000@incoming:11] Set("SIP/dvg1-02865028", "CDR(rlp)=0") in new stack
    -- Executing [1000@incoming:12] Set("SIP/dvg1-02865028", "CDR(ljitt)=0") in new stack
    -- Executing [1000@incoming:13] Set("SIP/dvg1-02865028", "CDR(rjitt)=0") in new stack
    -- Executing [1000@incoming:14] Set("SIP/dvg1-02865028", "fname=2010.11.24-03.41.11-dvg1.wav,,Tt") in new stack
    -- Executing [1000@incoming:15] MixMonitor("SIP/dvg1-02865028", "/home/audio/2010.11.24-03.41.11-dvg1.wav,,Tt.wav") in new stack
    -- Executing [1000@incoming:16] Dial("SIP/dvg1-02865028", "SIP/701,45,Tt") in new stack
  == Begin MixMonitor Recording SIP/dvg1-02865028
    -- Called 701
    -- SIP/701-11c98028 is ringing
    -- SIP/701-11c98028 answered SIP/dvg1-02865028
А тут мы пытаемся перевести звонок на другой номер:

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

[Nov 24 03:41:27] DTMF[72923]: channel.c:2840 __ast_read: DTMF begin '#' received on SIP/701-11c98028
[Nov 24 03:41:27] DTMF[72923]: channel.c:2850 __ast_read: DTMF begin passthrough '#' on SIP/701-11c98028
[Nov 24 03:41:27] DTMF[72923]: channel.c:2768 __ast_read: DTMF end '#' received on SIP/701-11c98028, duration 100 ms
[Nov 24 03:41:27] DTMF[72923]: channel.c:2808 __ast_read: DTMF end accepted with begin '#' on SIP/701-11c98028
[Nov 24 03:41:27] DTMF[72923]: channel.c:2824 __ast_read: DTMF end passthrough '#' on SIP/701-11c98028
    -- Music class default requested but no musiconhold loaded.
    -- <SIP/701-11c98028> Playing 'pbx-transfer.gsm' (language 'en')
[Nov 24 03:41:27] DTMF[72923]: channel.c:2840 __ast_read: DTMF begin '7' received on SIP/701-11c98028
[Nov 24 03:41:27] DTMF[72923]: channel.c:2844 __ast_read: DTMF begin ignored '7' on SIP/701-11c98028
[Nov 24 03:41:28] DTMF[72923]: channel.c:2768 __ast_read: DTMF end '7' received on SIP/701-11c98028, duration 100 ms
[Nov 24 03:41:28] DTMF[72923]: channel.c:2824 __ast_read: DTMF end passthrough '7' on SIP/701-11c98028
[Nov 24 03:41:28] DTMF[72923]: channel.c:2840 __ast_read: DTMF begin '0' received on SIP/701-11c98028
[Nov 24 03:41:28] DTMF[72923]: channel.c:2844 __ast_read: DTMF begin ignored '0' on SIP/701-11c98028
[Nov 24 03:41:28] DTMF[72923]: channel.c:2768 __ast_read: DTMF end '0' received on SIP/701-11c98028, duration 100 ms
[Nov 24 03:41:28] DTMF[72923]: channel.c:2824 __ast_read: DTMF end passthrough '0' on SIP/701-11c98028
[Nov 24 03:41:28] DTMF[72923]: channel.c:2840 __ast_read: DTMF begin '0' received on SIP/701-11c98028
[Nov 24 03:41:28] DTMF[72923]: channel.c:2844 __ast_read: DTMF begin ignored '0' on SIP/701-11c98028
[Nov 24 03:41:28] DTMF[72923]: channel.c:2768 __ast_read: DTMF end '0' received on SIP/701-11c98028, duration 100 ms
[Nov 24 03:41:28] DTMF[72923]: channel.c:2824 __ast_read: DTMF end passthrough '0' on SIP/701-11c98028
    -- Executing [700@office:1] Set("SIP/dvg1-02865028", "fname=2010-11-24_03-41-28-dvg1") in new stack
    -- Executing [700@office:2] MixMonitor("SIP/dvg1-02865028", "/home/audio/2010-11-24_03-41-28-dvg1.wav") in new stack
    -- Executing [700@office:3] Dial("SIP/dvg1-02865028", "SIP/700,10") in new stack
  == Begin MixMonitor Recording SIP/dvg1-02865028
    -- Called 700
    -- Nobody picked up in 10000 ms
    -- Auto fallthrough, channel 'SIP/dvg1-02865028' status is 'NOANSWER'
  == MixMonitor close filestream
  == Executing [Tt.wav]
  == MixMonitor close filestream
  == End MixMonitor Recording SIP/dvg1-02865028
  == End MixMonitor Recording SIP/dvg1-02865028
При переводе второй телефон после возникновения в логах "Called 700", второй телефон молчит как партизан, на дисплее в это время у него отображается слово "Занято". Через 10 секунд соединение разрывается.

В какую сторону копать?

Re: Перевод звонков не работает

Добавлено: 24 ноя 2010, 10:11
ded
1) Поставить Trixbox и не мучаться;

2) У Вас в [incoming] кроме набора многих установок Set больше ничего нет, никаких действий;

3) Проверьте - есть ли на решётке Blind transfer вообще?

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

CLI> features show                                                                                                                   
Builtin Feature           Default Current                                                                                                   
---------------           ------- -------                                                                                                   
Pickup                    *8      *8                                                                                                        
Blind Transfer            #       #                                                                                                         
Attended Transfer                 *2                                                                                                        
One Touch Monitor                 *1                                                                                                        
Disconnect Call           *       **                                                                                                        
Park Call                                                                                                                                   
One Touch MixMonitor           
А буква t в строке Dial ?
4) Hotline направьте на 700, вместо 1000 (почему вообще 1000?), а ещё лучше - последовательный обзвон обеих трубок:

exten => 1000,1,Dial(SIP/700,10,tr)
exten => 1000,2,Dial(SIP/701,10,tr)
exten => 1000,3,Goto(1000,1)

Re: Перевод звонков не работает

Добавлено: 25 ноя 2010, 10:15
shumiloff
ded писал(а):1) Поставить Trixbox и не мучаться;
Не уверен, что установка трикс бокса на фрибсд не отнимет у меня бОльшего времени, нежели реализация перевода звонка, но к сведению приму.
2) У Вас в [incoming] кроме набора многих установок Set больше ничего нет, никаких действий;
Помимо установок сет, там ещё есть включение записи и "exten => 1000,n,Dial(SIP/701,45,Tt)".
3) Проверьте - есть ли на решётке Blind transfer вообще?

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

CLI> features show                                                                                                                   
Builtin Feature           Default Current                                                                                                   
---------------           ------- -------                                                                                                   
Pickup                    *8      *8                                                                                                        
Blind Transfer            #       #                                                                                                         
Attended Transfer                 *2                                                                                                        
One Touch Monitor                 *1                                                                                                        
Disconnect Call           *       **                                                                                                        
Park Call                                                                                                                                   
One Touch MixMonitor           
А буква t в строке Dial ?
Да, конечно. По features show астериск мне выдаёт совершенно идентичную картинку. Плюс ещё:

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

Dynamic Feature           Default Current
---------------           ------- -------
(none) 
 
Call parking
------------
Parking extension   :      100
Parking context     :      parkedcalls
Parked call extensions:      101-120
В диал есть tT.

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

4) Hotline направьте на 700, вместо 1000 (почему вообще 1000?), а ещё лучше - последовательный обзвон обеих трубок:

exten => 1000,1,Dial(SIP/700,10,tr)
exten => 1000,2,Dial(SIP/701,10,tr)
exten => 1000,3,Goto(1000,1)[/quote]

А если я его направлю на номер 700 сразу, то я смогу в дальнейшем выполнять со звонком различные действия в зависимости от поступающего callerid? Скажем, звонок из россии отправить на один номер, для звонка из сша включить голосовое меню, при звонке с определённого номера - переключить его на факс и т.п.? Т.е. Сейчас я в incoming явно обрабатываю поступающий звонок - заношу информацию о нём в базу, записываю его, перенаправляю на нужный номер (пытаюсь :)) и т.п..

Re: Перевод звонков не работает

Добавлено: 25 ноя 2010, 11:06
ded
трикс бокс нельзя поставить на фрибсд, триксбокс - это дистрибутив - полный набор с сухофруктами: Linux CentOS 5.3? Apache, MySQL, Asterisk - всё в одном флаконе.
По Вашему описанию скорее всего проблема в нераспознавании сигналов ДТМФ.
Включите в logger.conf дебаг ДТМФ в строке
console => warning,error,dtmf
ну и потом
CLI> logger reload
Теперь при нажатии кнопок телефона во время разговора все нажатия будут видны зелёными сообщениями в CLI.

Также вероятная причина - использование руссифицированых Панасоников, где набор по умолчанию пульсовой, но это не слышно обычным образом, потому нажатия на # ни к чему не приводят.

Re: Перевод звонков не работает

Добавлено: 25 ноя 2010, 12:56
shumiloff
ded писал(а):трикс бокс нельзя поставить на фрибсд, триксбокс - это дистрибутив - полный набор с сухофруктами: Linux CentOS 5.3? Apache, MySQL, Asterisk - всё в одном флаконе.
Тогда я точно не смогу этого сделать, ибо задача - установить астериск на сервер, на котором уже крутится ряд вещей.
По Вашему описанию скорее всего проблема в нераспознавании сигналов ДТМФ.
Очень странно, но ведь при попытке перевода звонка он на нажатие каждой кнопки реагирует, вот реакция на нажатие семёрки:
[Nov 24 03:41:27] DTMF[72923]: channel.c:2844 __ast_read: DTMF begin ignored '7' on SIP/701-11c98028
[Nov 24 03:41:28] DTMF[72923]: channel.c:2768 __ast_read: DTMF end '7' received on SIP/701-11c98028, duration 100 ms
[Nov 24 03:41:28] DTMF[72923]: channel.c:2824 __ast_read: DTMF end passthrough '7' on SIP/701-11c98028
И после того как я набираю #700, в логах астериска появляется запись:

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

    -- Called 700
То есть, при попытке перевода звонка астериск корректно принял нажатие всех кнопок.
Включите в logger.conf дебаг ДТМФ в строке
console => warning,error,dtmf
ну и потом
CLI> logger reload
Теперь при нажатии кнопок телефона во время разговора все нажатия будут видны зелёными сообщениями в CLI.
В логгер конф это и так уже включено:

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

console => notice,warning,error,dtfm
Плюс к тому, я к консоли астериска всегда на всякий случай подключаюсь с максимальным вербоузом - asterisk -rvvvvv и как уже упомянул выше, нажатие кнопок аппарата логируется.
Также вероятная причина - использование руссифицированых Панасоников, где набор по умолчанию пульсовой, но это не слышно обычным образом, потому нажатия на # ни к чему не приводят.
И как было написано в начале темы, я использую Siemens GIGASET C470IP. С панасониками я тоже знаком. На некоторых есть рычажок для смены режима tone/pulse, а на некоторых тоновый режим включается кнопкой "*", в этом случае под ней есть надпись "tone".

То есть, проблема скорее всего не в DTFM.

Ещё я убрал из настроек сип-аккаунтов, на которые приходит звонок, callgroup=1 и pickupgroup=1. На всякий случай. Поведение не изменилось.

Ещё я снял лог слмонитором с длинковского шлюза на время звонка:

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

15:06:27 [156766] 0: Fxo Ringing  //вот я звоню
15:06:28 [156767] 0: RingTime(105) First Stop
15:06:31 [156806] 0: RingTime(500) Second Ring
15:06:33 [156826] 0: ### Fxo Get Fsk CallerId [963nomer,], Len=10 //вот он получает мой номер
15:06:33 [156826] 0: CallerId=963nomer
15:06:34 [156826] 0: ==17:WaitAnswerDeviceOk
15:06:34 [156827] 0: HotLineEnabled with [1000]
15:06:34 [156827] 0: End Input Default Route [0]
15:06:34 [156827] 0: Call Proxy with [1000] //вот он набирает номер горячей линии
15:06:34 [156827] 0: ==7:Inviting
15:06:34 [156827] 0: VoIP CallOut, Invite <sip:1000@zdez_ip_address:5060;user=phone>
15:06:34 [156828] 0: dvg1=DIALING
15:06:34 [156831] 0: dvg1=PROCEEDING
15:06:35 [156842] 0: dvg1=RINGBACK
15:06:35 [156842] 0: ==8:RingBack
15:06:41 [156907] 0: dvg1=CONNECTED  //подключились
15:06:42 [156908] 0: Peer PTime=20 #2
15:06:42 [156908] 0: Peer=zdez_ip_address:19412, PT=8, RecvOnly=0
15:06:42 [156908] 0: FxoHookOff
15:06:42 [156908] 0: SetInputGain(-2)
15:06:42 [156908] 0: RtpApiTalk[0,0], Peer=zdez_ip_address:19412, PT=8, FC=2, NewOOB=1
15:06:42 [156908] QosLineCount=1, Bandwidth=86
15:06:42 [156908] 0: ==14:Talking
15:06:42 [156908] 0: SetTalkMode[1,1]
15:07:03 [157118] 0: dvg1=DISCONNECT //а вот тут я начал набирать внутренний номер
15:07:03 [157118] QosLineCount=0, Bandwidth=0
15:07:03 [157118] 0: Release Active Dlg
15:07:03 [157118] 0: ==15:PlayBusyTone
15:07:03 [157118] DSP_ch0_check=0
15:07:03 [157118] 0: FxoHookOn
15:07:03 [157118] 0: ==3:Idle
15:07:03 [157119] 0: SetInputGain(4)
15:07:03 [157119] 0: SetFax(1)=0

Re: Перевод звонков не работает

Добавлено: 25 ноя 2010, 13:50
ded
Избыточно. Не надо снимать дампы и логи.
Всё понятно написано было выше, трансфер есть -
[Nov 24 03:41:27] DTMF[72923]: channel.c:2824 __ast_read: DTMF end passthrough '#' on SIP/701-11c98028
-- <SIP/701-11c98028> Playing 'pbx-transfer.gsm' (language 'en') - вот тут сказала голосом - Трансфер!
и пошёл дозвон на 700
-- Executing [700@office:3] Dial("SIP/dvg1-02865028", "SIP/700,10") in new stack
== Begin MixMonitor Recording SIP/dvg1-02865028
-- Called 700
-- Nobody picked up in 10000 ms - тут сообщил, что никто не поднял трубку на 700.

Поэтому как выше писал -
Hotline направьте на 700, вместо 1000 (почему вообще 1000?), а ещё лучше - последовательный обзвон обеих трубок:

exten => 1000,1,Dial(SIP/700,10,tr)
exten => 1000,2,Dial(SIP/701,10,tr)
exten => 1000,3,Goto(1000,1)[/quote]
А если я его направлю на номер 700 сразу, то я смогу в дальнейшем выполнять со звонком различные действия в зависимости от поступающего callerid?
Да, сможете.
Проблема из ничего создана, просто ещё один самодельный деревянный велосипед ("Но ведь он же ездит?")

Re: Перевод звонков не работает

Добавлено: 01 дек 2010, 10:34
shumiloff
Спасибо большое за ответы, я разобрался. Проблема пропала после разнесения трубок на разные базы.