VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

"Абонент разговаривает по другой линии" возможно ли?

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модераторы: april22, Zavr2008

tonny_bennet
Сообщения: 169
Зарегистрирован: 21 дек 2011, 13:00
Откуда: Ростов-на-Дону
Контактная информация:

"Абонент разговаривает по другой линии" возможно ли?

Сообщение tonny_bennet »

Здравствуйте.

Есть Elastix с некоторым количеством абонентов. IP телефоны с несколькими линиями.

Недавно главбух рассказывала как на неё наехал финансовый директор: "Я тебе звоню звоню, а ты трубку не берёшь!". Она честно призналась, что в этот момент общалась с генеральным директором и не могла взять его звонок.

Сейчас включена услуга Call Waiting, и включена голосовая почта. Т.о. получается если человек просто не берёт трубку в течение определённого времени, ему сервер говорит следующее: "Абонент с номером XXX недоступен ...." и т.д. А если абонент в этот момент с кем-то разговаривает, у него на экране видно, что кто-то звонит и в трубке "пикает". А вот звонящий ненароком может подумать что, либо сотрудника нет на месте либо он не хочет брать его вызов, потому что срабатывает переадресация на голосовую почту с очень похожей формулировкой на ту что при не ответе: "Абонент с номером ХХХ занят..." Звонящий завершает вызов на первой гласной из сообщения... Потом конфликты.

Понятно, что можно отключить Call Waiting, и звонки будут отбиваться по состоянию BUSY, но тогда не получится узнать кто звонил.

Заставить людей слушать сообщение автоответчика голосовой почты и различать фразы "занят" и "недоступен" у меня не получается. Первым же делом мне припоминают мобильных операторов: "Вот когда я звоню, и человек занят мне сразу об этом сообщают и я уже сам решаю мне ждать или нет. И если, что он мне перезвонить может! Я же у него высветился!"

Пробовал рассказывать как переключиться на входящий вызов, переведя текущий на удержание. Безрезультатно.

Итак чего хочется? А хочется того, что уже реализовано у мобильных операторов - сообщать о том, что абонент в данный момент занят и общается по другой линии. Я долго и мучительно гуглил этот вопрос, в том числе и по этому форуму. Результатов не много.
Нашёл заметку в блоге http://albertxyc.livejournal.com/13140.html. Логика работы достаточно проста (узнали статус, если занят сообщали об этом и дали возможность подождать), но почему не работает и как сделать чтобы заработало я так и не понял.

Помогите пожалуйста с решением.
P.S. Я не знаю всей кухни системы телефонии, но почему такую, как мне кажется, нужную опцию не предусмотрели разработчики в базовой конфигурации? Быть может есть какие-то подводные камни и тонкости в её работе? Или тот случай, который я описал является слишком уж частным? Мобильные операторы тогда, что сговорились получается?
playnet
Сообщения: 2
Зарегистрирован: 17 июн 2014, 18:39

Re: "Абонент разговаривает по другой линии" возможно ли?

Сообщение playnet »

а что говорит дамп сип трафика при втором вызове?
Vlad1983
Сообщения: 4251
Зарегистрирован: 09 авг 2011, 11:51

Re: "Абонент разговаривает по другой линии" возможно ли?

Сообщение Vlad1983 »

По приведенной ссылке, решение и есть (можно доработать под проигрывание сообщения в момент вызова по второй линии, а не просто сказать и идите лесом).
Куда и как его присунуть в Elastix - отдельный вопрос.
ЛС: @rostel
Аватара пользователя
tol_iwan
Сообщения: 273
Зарегистрирован: 11 апр 2014, 11:29
Откуда: Брянск
Контактная информация:

Re: "Абонент разговаривает по другой линии" возможно ли?

Сообщение tol_iwan »

tonny_bennet писал(а):узнали статус, если занят сообщали об этом и дали возможность подождать
так и делается, все работает
tonny_bennet писал(а):но почему не работает и как сделать чтобы заработало я так и не понял
телепаты в отпуске - лето, жарко
tonny_bennet
Сообщения: 169
Зарегистрирован: 21 дек 2011, 13:00
Откуда: Ростов-на-Дону
Контактная информация:

Re: "Абонент разговаривает по другой линии" возможно ли?

Сообщение tonny_bennet »

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

 
[from-internal-custom]
include => custom-check-number

[custom-check-number]
exten => 138,1,NoOp(Enter in custom-check-number)
exten => 138,n,Set(devst=${DEVICE_STATE(SIP/${EXTEN})})
exten => 138,n,ExecIf($["${devst}" = "INUSE"]?Playback(minutes))
exten => 138,n,NoOp(Exit from custom-check-number)
Как и в приведённой мною ссылке есть комментарий о возврате в исходный контекст так и у меня вопрос: Звонок попадает в from-internal оттуда в from-internal-custom и уже оттуда в custom-check-number. И после выполнения всех пунктов в custom-check-number, как мне кажется, должен вернуться обратно в from-internal-custom и обратно в from-internal. А по выводу мне не понятно...
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: asterisk -r

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

    -- Executing [138@from-internal:1] NoOp("SIP/105-000077d8", "Enter in custom-check-number") in new stack
    -- Executing [138@from-internal:2] Set("SIP/105-000077d8", "devst=NOT_INUSE") in new stack
    -- Executing [138@from-internal:3] ExecIf("SIP/105-000077d8", "0?Playback(minutes)") in new stack
    -- Executing [138@from-internal:4] NoOp("SIP/105-000077d8", "Exit from custom-check-number") in new stack
    -- Executing [138@from-internal:5] Progress("SIP/105-000077d8", "") in new stack
    -- Executing [138@from-internal:6] Playback("SIP/105-000077d8", "silence/1&cannot-complete-as-dialed&check-number-dial-again,noanswer") in new stack
    -- <SIP/105-000077d8> Playing 'silence/1.gsm' (language 'ru')
    -- <SIP/105-000077d8> Playing 'cannot-complete-as-dialed.alaw' (language 'ru')
    -- <SIP/105-000077d8> Playing 'check-number-dial-again.alaw' (language 'ru')
    -- Executing [138@from-internal:7] Wait("SIP/105-000077d8", "1") in new stack
    -- Executing [138@from-internal:8] Congestion("SIP/105-000077d8", "20") in new stack
  == Spawn extension (from-internal, 138, 8) exited non-zero on 'SIP/105-000077d8'
    -- Executing [h@from-internal:1] Macro("SIP/105-000077d8", "hangupcall") in new stack
    -- Executing [s@macro-hangupcall:1] GotoIf("SIP/105-000077d8", "1?endmixmoncheck") in new stack
    -- Goto (macro-hangupcall,s,9)
    -- Executing [s@macro-hangupcall:9] NoOp("SIP/105-000077d8", "End of MIXMON check") in new stack
    -- Executing [s@macro-hangupcall:10] GotoIf("SIP/105-000077d8", "1?nomeetmemon") in new stack
    -- Goto (macro-hangupcall,s,28)
    -- Executing [s@macro-hangupcall:28] NoOp("SIP/105-000077d8", "End of MEETME check") in new stack
    -- Executing [s@macro-hangupcall:29] GotoIf("SIP/105-000077d8", "1?noautomon") in new stack
    -- Goto (macro-hangupcall,s,34)
    -- Executing [s@macro-hangupcall:34] NoOp("SIP/105-000077d8", "TOUCH_MONITOR_OUTPUT=") in new stack
    -- Executing [s@macro-hangupcall:35] GotoIf("SIP/105-000077d8", "1?noautomon2") in new stack
    -- Goto (macro-hangupcall,s,41)
    -- Executing [s@macro-hangupcall:41] NoOp("SIP/105-000077d8", "MONITOR_FILENAME=") in new stack
    -- Executing [s@macro-hangupcall:42] GotoIf("SIP/105-000077d8", "1?skiprg") in new stack
    -- Goto (macro-hangupcall,s,45)
    -- Executing [s@macro-hangupcall:45] GotoIf("SIP/105-000077d8", "1?skipblkvm") in new stack
    -- Goto (macro-hangupcall,s,48)
    -- Executing [s@macro-hangupcall:48] GotoIf("SIP/105-000077d8", "1?theend") in new stack
    -- Goto (macro-hangupcall,s,50)
    -- Executing [s@macro-hangupcall:50] AGI("SIP/105-000077d8", "hangup.agi") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/hangup.agi
    -- <SIP/105-000077d8>AGI Script hangup.agi completed, returning 0
    -- Executing [s@macro-hangupcall:51] Hangup("SIP/105-000077d8", "") in new stack
  == Spawn extension (macro-hangupcall, s, 51) exited non-zero on 'SIP/105-000077d8' in macro 'hangupcall'
  == Spawn extension (from-internal, h, 1) exited non-zero on 'SIP/105-000077d8'

Он сразу идёт по from-internal, проходит 4 приоритета моего самописного контекста custom-check-number, и возвращается в from-internal на 5-й приоритет.
ded
Сообщения: 15619
Зарегистрирован: 26 авг 2010, 19:00

Re: "Абонент разговаривает по другой линии" возможно ли?

Сообщение ded »

Все добавления выполнения диалплана через инклюды - это как-бы выполнение примарного диалплпна, последовательность выполнения которого разложена просто по разным местам. Родной контекст для внутреннего номера - from-internal, поэтому это поведение при выполнении его абсолютно справедливо. А если хочется чтобы
после выполнения всех пунктов в custom-check-number, как мне кажется, должен вернуться обратно в from-internal-custom и обратно в from-internal.
то надо использовать макрос (и/или gosub), именно макросы возвращают выполнение в ту же точку, откуда вызывались.

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

   [from-internal-custom]
    exten => _X.,1,Macro(check-number,${ARG1})
    exten => _X.,n,(NoOp We are the champions!)

    [macro-check-number]
    exten => s,1,NoOp(check status on-line for number ${ARG1})
    exten => s,n,Set(devst=${DEVICE_STATE(SIP/${ARG1})})
    exten => s,n,ExecIf($["${devst}" = "INUSE"]?Playback(minutes))
    exten => s,n,NoOp(Exit from macro-check-number)
tonny_bennet
Сообщения: 169
Зарегистрирован: 21 дек 2011, 13:00
Откуда: Ростов-на-Дону
Контактная информация:

Re: "Абонент разговаривает по другой линии" возможно ли?

Сообщение tonny_bennet »

ded, спасибо за подсказку. Переписал всё в виде макроса.

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

[from-internal-custom]
exten => 155,1,Macro(check-number,${EXTEN})

[macro-check-number]
exten => s,1,NoOp(Enter in macro-check-number)
exten => s,n,Set(devst=${DEVICE_STATE(SIP/${ARG1})})
exten => s,n,ExecIf($["${devst}" = "INUSE"]?Playback(minutes))
exten => s,n,NoOp(Exit from macro-check-number)
Если просто позвонить на 155 - отбивает с сигналом занято:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: asterisk -r

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

  == Using SIP RTP TOS bits 184
  == Using SIP RTP CoS mark 5
    -- Executing [155@from-internal:1] Macro("SIP/105-00007858", "check-number,155") in new stack
    -- Executing [s@macro-check-number:1] NoOp("SIP/105-00007858", "Enter in custom-check-number") in new stack
    -- Executing [s@macro-check-number:2] Set("SIP/105-00007858", "devst=NOT_INUSE") in new stack
    -- Executing [s@macro-check-number:3] ExecIf("SIP/105-00007858", "0?Playback(minutes)") in new stack
    -- Executing [s@macro-check-number:4] NoOp("SIP/105-00007858", "Exit from custom-check-number") in new stack
    -- Executing [155@from-internal:2] Goto("SIP/105-00007858", ",return,1") in new stack
    -- Goto (from-internal,return,1)
    -- Executing [h@from-internal:1] Macro("SIP/105-00007858", "hangupcall") in new stack
    -- Executing [s@macro-hangupcall:1] GotoIf("SIP/105-00007858", "1?endmixmoncheck") in new stack
    -- Goto (macro-hangupcall,s,9)
    -- Executing [s@macro-hangupcall:9] NoOp("SIP/105-00007858", "End of MIXMON check") in new stack
    -- Executing [s@macro-hangupcall:10] GotoIf("SIP/105-00007858", "1?nomeetmemon") in new stack
    -- Goto (macro-hangupcall,s,28)
    -- Executing [s@macro-hangupcall:28] NoOp("SIP/105-00007858", "End of MEETME check") in new stack
    -- Executing [s@macro-hangupcall:29] GotoIf("SIP/105-00007858", "1?noautomon") in new stack
    -- Goto (macro-hangupcall,s,34)
    -- Executing [s@macro-hangupcall:34] NoOp("SIP/105-00007858", "TOUCH_MONITOR_OUTPUT=") in new stack
    -- Executing [s@macro-hangupcall:35] GotoIf("SIP/105-00007858", "1?noautomon2") in new stack
    -- Goto (macro-hangupcall,s,41)
    -- Executing [s@macro-hangupcall:41] NoOp("SIP/105-00007858", "MONITOR_FILENAME=") in new stack
    -- Executing [s@macro-hangupcall:42] GotoIf("SIP/105-00007858", "1?skiprg") in new stack
    -- Goto (macro-hangupcall,s,45)
    -- Executing [s@macro-hangupcall:45] GotoIf("SIP/105-00007858", "1?skipblkvm") in new stack
    -- Goto (macro-hangupcall,s,48)
    -- Executing [s@macro-hangupcall:48] GotoIf("SIP/105-00007858", "1?theend") in new stack
    -- Goto (macro-hangupcall,s,50)
    -- Executing [s@macro-hangupcall:50] AGI("SIP/105-00007858", "hangup.agi") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/hangup.agi
    -- <SIP/105-00007858>AGI Script hangup.agi completed, returning 0
    -- Executing [s@macro-hangupcall:51] Hangup("SIP/105-00007858", "") in new stack
  == Spawn extension (macro-hangupcall, s, 51) exited non-zero on 'SIP/105-00007858' in macro 'hangupcall'
  == Spawn extension (from-internal, h, 1) exited non-zero on 'SIP/105-00007858'
Если позвонить с 155-го куда-нибудь и снова попробовать его набрать, макрос выполняется, проигрывается сообщение и после этого звонок отбивается с сигналом занято.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: asterisk -r

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

    -- Executing [155@from-internal:1] Macro("SIP/105-00007874", "check-number,155") in new stack
    -- Executing [s@macro-check-number:1] NoOp("SIP/105-00007874", "Enter in custom-check-number") in new stack
    -- Executing [s@macro-check-number:2] Set("SIP/105-00007874", "devst=INUSE") in new stack
    -- Executing [s@macro-check-number:3] ExecIf("SIP/105-00007874", "1?Playback(minutes)") in new stack
    -- <SIP/105-00007874> Playing 'minutes.alaw' (language 'ru')
    -- Executing [s@macro-check-number:4] NoOp("SIP/105-00007874", "Exit from custom-check-number") in new stack
    -- Executing [155@from-internal:2] Goto("SIP/105-00007874", ",return,1") in new stack
    -- Goto (from-internal,return,1)
    -- Executing [h@from-internal:1] Macro("SIP/105-00007874", "hangupcall") in new stack
    -- Executing [s@macro-hangupcall:1] GotoIf("SIP/105-00007874", "1?endmixmoncheck") in new stack
    -- Goto (macro-hangupcall,s,9)
    -- Executing [s@macro-hangupcall:9] NoOp("SIP/105-00007874", "End of MIXMON check") in new stack
    -- Executing [s@macro-hangupcall:10] GotoIf("SIP/105-00007874", "1?nomeetmemon") in new stack
    -- Goto (macro-hangupcall,s,28)
    -- Executing [s@macro-hangupcall:28] NoOp("SIP/105-00007874", "End of MEETME check") in new stack
    -- Executing [s@macro-hangupcall:29] GotoIf("SIP/105-00007874", "1?noautomon") in new stack
    -- Goto (macro-hangupcall,s,34)
    -- Executing [s@macro-hangupcall:34] NoOp("SIP/105-00007874", "TOUCH_MONITOR_OUTPUT=") in new stack
    -- Executing [s@macro-hangupcall:35] GotoIf("SIP/105-00007874", "1?noautomon2") in new stack
    -- Goto (macro-hangupcall,s,41)
    -- Executing [s@macro-hangupcall:41] NoOp("SIP/105-00007874", "MONITOR_FILENAME=") in new stack
    -- Executing [s@macro-hangupcall:42] GotoIf("SIP/105-00007874", "1?skiprg") in new stack
    -- Goto (macro-hangupcall,s,45)
    -- Executing [s@macro-hangupcall:45] GotoIf("SIP/105-00007874", "1?skipblkvm") in new stack
    -- Goto (macro-hangupcall,s,48)
    -- Executing [s@macro-hangupcall:48] GotoIf("SIP/105-00007874", "1?theend") in new stack
    -- Goto (macro-hangupcall,s,50)
    -- Executing [s@macro-hangupcall:50] AGI("SIP/105-00007874", "hangup.agi") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/hangup.agi
    -- <SIP/105-00007874>AGI Script hangup.agi completed, returning 0
    -- Executing [s@macro-hangupcall:51] Hangup("SIP/105-00007874", "") in new stack
  == Spawn extension (macro-hangupcall, s, 51) exited non-zero on 'SIP/105-00007874' in macro 'hangupcall'
  == Spawn extension (from-internal, h, 1) exited non-zero on 'SIP/105-00007874'
Странно, добавил просто exten => 155,1,NoOp(Test), убрав всё лишнее, позвонил на 155, он в консоль вывел Test и потом отбил звонок. Может нужно всё это в каком-то другом файле дописывать? Сейчас всё вношу в extensions_custom.conf
tonny_bennet
Сообщения: 169
Зарегистрирован: 21 дек 2011, 13:00
Откуда: Ростов-на-Дону
Контактная информация:

Re: "Абонент разговаривает по другой линии" возможно ли?

Сообщение tonny_bennet »

Мне не понятна эта часть в консольном выводе:

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

    -- Executing [155@from-internal:2] Goto("SIP/105-00007858", ",return,1") in new stack
    -- Goto (from-internal,return,1)
ded
Сообщения: 15619
Зарегистрирован: 26 авг 2010, 19:00

Re: "Абонент разговаривает по другой линии" возможно ли?

Сообщение ded »

Goto (from-internal,return,1) посылает в контекст from-internal и там искать экстен return, первый приоритет. То есть должна быть строка
exten => return,1,NoOp(This is return stack!)
exten => return,n,Hangup() ; or something else

а ищет он return, потому что нет ничего на выходе макроса -
[from-internal-custom]
exten => 155,1,Macro(check-number,${EXTEN})
нет второго шага!
tonny_bennet
Сообщения: 169
Зарегистрирован: 21 дек 2011, 13:00
Откуда: Ростов-на-Дону
Контактная информация:

Re: "Абонент разговаривает по другой линии" возможно ли?

Сообщение tonny_bennet »

ded писал(а):нет второго шага!
А каким должен он быть? Я так и не могу понять логику вложенных контекстов. Казалось сначала, что они аналогичны процедурам из языка Pascal: вызвал, отработал и вернул выполнение в точку, где оно было прервано. Сейчас получается, что при выполнении макроса, он выходит в контекст from-internal, а не в from-internal-custom, и начинает работу с экстеншена return.

На странице http://asterisk.ru/knowledgebase/Asterisk+cmd+Macro указанно:
Коды возврата
Команда Macro вернет значение -1, если любая из команд в макроопределении вернет -1, иначе возвращает 0.
Откуда берётся return в принципе не понятно.
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH