Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Как продолжить dialplan если звонящий положил трубку до ответа?

0

Уважаемые коллеги!

Если задача поймать в диалплане неотвеченные вызовы.

Пробовал так:

В Dial() указываю таймаут и тогда по истечении таймаута получаю dialstatus=noanswer, но так как требуется вызываеющей стороне сказать что "номер не отвечает", то после Playback в CDR записывается что вызов answered, что не есть гуд.

Второй вариант: В Dial() есть параметр F, но он отрабатывает по hangup-у вызывающей стороны только если вызываемый взял трубку...

Вот и встал в тупик. Как заставить Dial() продолжить выполние диалплана если вызываемый не взял трубку?

удалить закрыть спам изменить тег редактировать

спросил 2012-04-04 11:32:42 +0400

muhlik Gravatar muhlik
11 1 1 2
http://www.gard.ru/

обновил 2012-04-04 12:22:31 +0400

Comments

Мне кажется или заголовок вопроса противоположен заданному вопросу?

igorg ( 2012-04-04 11:39:38 +0400 )редактировать

Поправил заголовок ;)

muhlik ( 2012-04-04 12:22:51 +0400 )редактировать

3 Ответа

1

Если вызываемый не взял трубку, то выполнение диалплана продолжается без дополнительных опций. Если вам не нужно чтобы вызов попал в CDR как отвеченный:

  1. Можете воспользоваться опцией noanswer приложения Playback()
  2. Воспользоваться приложениями NoCDR(), ForkCDR() или ResetCDR() чтобы повлиять на содержимое CDR() записей после команды Dial()
ссылка удалить спам редактировать

ответил 2012-04-04 11:38:49 +0400

igorg Gravatar igorg flag of Russian Federation
2244 3 7 40
http://igorg.ru/

Comments

Вот кусок диалплана:

same => n,Dial(SIP/161,60,t)

same => n,NoOp(test)

Если вызывающий положил трубку не дождавшись ответа, то в NoOp мы не попадем!

Да и в хелпе написано: Dialplan executing will continue if no requested channels can be called, or if the timeout expires. This application will report normal termination if the originating channel hangs up, or if the call is bridged and either of the parties in the bridge ends the call.

Playback() с опцией noanswer работает не знаю на каких каналах, у меня с этой опцией вызывающая сторона ничего не слышит

Вот с п.2 не очень понял... просто так сделать: CDR(disposition)=NO ANSWER нельзя ибо disposition RO.

muhlik ( 2012-04-04 12:21:26 +0400 )редактировать

Что бы выполнить NoOp, когда вызывающий кладет трубку не дождавшись ответа, ее можно посадить на специальный экстеншен 'h' в том контексте, откуда вызывается Dial()

asteriskguru ( 2012-04-04 17:50:58 +0400 )редактировать

Экстеншен 'h' вызывается если команда Dial отработала, а если вызывающий положил трубку вообще ничего не происходит. Ну типа так:

-- Executing [s@macro-diallocal:12] Dial("SIP/161-000003f9", "SIP/165,30,t") in new stack

== Using SIP RTP CoS mark 5

-- Called SIP/165

== Begin MixMonitor Recording SIP/161-000003f9

-- SIP/165-000003fa is ringing
####Тут я кладу трубку

== Spawn extension (macro-diallocal, s, 12) exited non-zero on 'SIP/161-000003f9' in macro 'diallocal'

== Spawn extension (from-internal-adm, 165, 1) exited non-zero on 'SIP/161-000003f9'

== End MixMonitor Recording SIP/161-000003f9

И всё!!!

muhlik ( 2012-04-05 11:57:29 +0400 )редактировать
1

Итак отвечаю на собсвенный же вопрос! ))) Несколько дней экспериментов над Астериском дали результаты и некоторое понимание (или непонимание) его работы. По поводу:

В Dial() указываю таймаут и тогда по истечении таймаута получаю dialstatus=noanswer, но так как требуется вызываеющей стороне сказать что "номер не отвечает", то после Playback в CDR записывается что вызов answered, что не есть гуд.

3 примера диалплана: ПЕРВЫЙ:

exten => 7777,1,NoOp(EXT: test)
    same => n,NoOp(${CDR(disposition)})
    same => n,Playback(call-fwd-unconditional)
    same => n,NoOp(${CDR(disposition)})
    same => n,Hangup()

И результат выполнения:

    -- Executing [7777@from-internal-adm:1] NoOp("SIP/161-0000004a", "EXT: test") in new stack
    -- Executing [7777@from-internal-adm:2] NoOp("SIP/161-0000004a", "NO ANSWER") in new stack
    -- Executing [7777@from-internal-adm:3] Playback("SIP/161-0000004a", "call-fwd-unconditional") in new stack
    -- <sip 161-0000004a=""> Playing 'call-fwd-unconditional.gsm' (language 'ru')
    -- Executing [7777@from-internal-adm:4] NoOp("SIP/161-0000004a", "ANSWERED") in new stack
    -- Executing [7777@from-internal-adm:5] Hangup("SIP/161-0000004a", "") in new stack
Видно что disposition после Playback изменился... А мне оно не надо, вариант ВТОРОЙ (добавим noawnswer для Playback):
exten => 7777,1,NoOp(EXT: test)
    same => n,NoOp(${CDR(disposition)})
    same => n,Playback(call-fwd-unconditional,noanswer)
    same => n,NoOp(${CDR(disposition)})
    same => n,Hangup()
    -- Executing [7777@from-internal-adm:1] NoOp("SIP/161-00000053", "EXT: test") in new stack
    -- Executing [7777@from-internal-adm:2] NoOp("SIP/161-00000053", "NO ANSWER") in new stack
    -- Executing [7777@from-internal-adm:3] Playback("SIP/161-00000053", "call-fwd-unconditional,noanswer") in new stack
    -- <sip 161-00000053=""> Playing 'call-fwd-unconditional.gsm' (language 'ru')
    -- Executing [7777@from-internal-adm:4] NoOp("SIP/161-00000053", "NO ANSWER") in new stack
    -- Executing [7777@from-internal-adm:5] Hangup("SIP/161-00000053", "") in new stack

Ага disposition какой мне и нужен, вот только в трубке я услышал тишину, вместо call-fwd-unconditional И вот правильный, вариант ТРЕТИЙ:

exten => 7777,1,NoOp(EXT: test)
    same => n,Answer(,nocdr)
    same => n,NoOp(${CDR(disposition)})
    same => n,Playback(call-fwd-unconditional)
    same => n,NoOp(${CDR(disposition)})
    same => n,Hangup()
    -- Executing [7777@from-internal-adm:1] NoOp("SIP/161-00000058", "EXT: test") in new stack
    -- Executing [7777@from-internal-adm:2] Answer("SIP/161-00000058", ",nocdr") in new stack
    -- Executing [7777@from-internal-adm:3] NoOp("SIP/161-00000058", "NO ANSWER") in new stack
    -- Executing [7777@from-internal-adm:4] Playback("SIP/161-00000058", "call-fwd-unconditional") in new stack
    -- <sip 161-00000058=""> Playing 'call-fwd-unconditional.gsm' (language 'ru')
    -- SIP/155-00000057 answered SIP/360-00000056
    -- Executing [7777@from-internal-adm:5] NoOp("SIP/161-00000058", "NO ANSWER") in new stack
    -- Executing [7777@from-internal-adm:6] Hangup("SIP/161-00000058", "") in new stack

Вот теперь все работает, а всего-то надо было поднять трубку (Answer) и nocdr параметр дописать!!!

Ну и самое главное, по поводу продолжения диалплана!!!

Заранее приношу извинения по поводу эксеншена h. Ибо он работает!!! Вот только кто же знал что если его использовать внутри макроса то тогда он отрабатывает только если Dial был успешный. В общем это была последняя капля и теперь мой диалплан подностью переписан под использование GoSub!

Всем спасибо!!!

ссылка удалить спам редактировать

ответил 2012-04-06 09:56:19 +0400

muhlik Gravatar muhlik
11 1 1 2
http://www.gard.ru/

Comments

1

Чтобы услышать Playback без Answer (второй пример) можно добавить Progress() перед командой Playback. Тогда Answer не нужен будет.

Master135 ( 2012-04-08 19:56:05 +0400 )редактировать
0

экстен h, а еще можно по длительности звонка в cdr (billsec: Total time call is up, in seconds (integer))

ссылка удалить спам редактировать

ответил 2012-04-04 18:57:54 +0400

svoy Gravatar svoy
1603 1 4 20
http://svoy.in.ua/

Comments

У меня задача продолжить выполнение dialplan'а... так что вариант с billsec мне как-то ник чему, а по экстен h я уже ниже написал что: на h переходит dial, если звонок состоялся, а в моем случае это не так.

muhlik ( 2012-04-05 12:06:46 +0400 )редактировать

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2012-04-04 11:32:42 +0400

Просмотрен: 4,569 раз

Обновлен: Apr 06 '12

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.