Чтобы услышать Playback без Answer (второй пример) можно добавить Progress() перед командой Playback. Тогда Answer не нужен будет.
Master135 ( 2012-04-08 19:56:05 +0400 )редактироватьУважаемые коллеги!
Если задача поймать в диалплане неотвеченные вызовы.
Пробовал так:
В Dial() указываю таймаут и тогда по истечении таймаута получаю dialstatus=noanswer, но так как требуется вызываеющей стороне сказать что "номер не отвечает", то после Playback в CDR записывается что вызов answered, что не есть гуд.
Второй вариант: В Dial() есть параметр F, но он отрабатывает по hangup-у вызывающей стороны только если вызываемый взял трубку...
Вот и встал в тупик. Как заставить Dial() продолжить выполние диалплана если вызываемый не взял трубку?
Итак отвечаю на собсвенный же вопрос! ))) Несколько дней экспериментов над Астериском дали результаты и некоторое понимание (или непонимание) его работы. По поводу:
В 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!
Всем спасибо!!!
Чтобы услышать Playback без Answer (второй пример) можно добавить Progress() перед командой Playback. Тогда Answer не нужен будет.
Master135 ( 2012-04-08 19:56:05 +0400 )редактироватьэкстен h, а еще можно по длительности звонка в cdr (billsec: Total time call is up, in seconds (integer))
У меня задача продолжить выполнение dialplan'а... так что вариант с billsec мне как-то ник чему, а по экстен h я уже ниже написал что: на h переходит dial, если звонок состоялся, а в моем случае это не так.
muhlik ( 2012-04-05 12:06:46 +0400 )редактироватьЕсли вызываемый не взял трубку, то выполнение диалплана продолжается без дополнительных опций. Если вам не нужно чтобы вызов попал в CDR как отвеченный:
Вот кусок диалплана:
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 )редактироватьЗадан: 2012-04-04 11:32:42 +0400
Просмотрен: 4,602 раз
Обновлен: Apr 06 '12
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.
Мне кажется или заголовок вопроса противоположен заданному вопросу?
igorg ( 2012-04-04 11:39:38 +0400 )редактироватьПоправил заголовок ;)
muhlik ( 2012-04-04 12:22:51 +0400 )редактировать