+ Responder ao Tópico



  1. #1

    Padrão Asterisk 1.6.1 - Ramal ocupado n+101 não funciona

    Bom dia galera de Under-Linux!

    Estou com dificuldades para conseguir tratar as ligações para ramais ocupados no Asterisk 1.6.1 ,estou usando como guia de referencia o livro "Asterisk o futuro da telefonia" e nesse livro é dito que para tratar uma chamada para um ramal ocupado deve-se usar a prioridade n+101 onde n é a prioridade onde o Dial() foi executado, dessa forma montei um plano de discagem para as ligações vindas PSTN, de forma que quando o ramal chamado estiver ocupado a pessoa que está chamando deveria ouvir a mensagem "O ramal encontra-se ocupado", porém não está funcionando.
    Meu conexto de entrada é o seguinte:

    [entrada] ; Entrada de chamadas pela PSTN
    exten => s,1,Answer() ;atende a chamada
    exten => s,2,Wait(1) ;reten 1 segundo
    exten => s,3,BackGround(entrada) ; Toca o arquivo de som entre () e interrompe a gravação caso algum numero seja discado
    exten => s,4,WaitExten(5) ; Aguarda os segundos entre () para o usuario digitar

    exten => 3001,1,Dial(IAX2/3001,30,tT) ; Chama os ramal 3001
    exten => 3001,2,Hangup() ; deliga a chamada
    exten => 3001,102,playback(ocupado) ; toca o arquivo de som entre ()
    exten => 3001,103,Hangup() ; desliga a chamada

    exten => i,1,playback(ramal_invalido) ; toca o arquivo de som entre () "a extensão i é chamada caso o ramal seja invalido"
    exten => i,2,goto(s,3) ; volta pra extensão s na prioridade 3
    exten => t,1,playback(ramal_invalido) ; toca o arquivo de som entre () "a extensão t é chamada caso nada seja discado"
    exten => t,2,goto(s,3) ; volta para a extensão s na prioridade 3


    A saida gerada pela console do asterisk é a seguinte:

    VOIP-SC*CLI>
    -- Starting simple switch on 'DAHDI/1-1'
    [Jan 12 18:39:19] NOTICE[4297]: chan_dahdi.c:7505 ss_thread: Got event 18 (Ring Begin)...
    [Jan 12 18:39:19] NOTICE[4297]: chan_dahdi.c:7669 ss_thread: MWI: Channel 1 message waiting!
    -- Executing [s@entrada:1] Answer("DAHDI/1-1", "") in new stack
    -- Executing [s@entrada:2] Wait("DAHDI/1-1", "1") in new stack
    -- Executing [s@entrada:3] BackGround("DAHDI/1-1", "entrada") in new stack
    -- <DAHDI/1-1> Playing 'entrada.gsm' (language 'br')
    == CDR updated on DAHDI/1-1
    -- Executing [3001@entrada:1] Dial("DAHDI/1-1", "IAX2/3001,30,tT") in new stack
    -- Called 3001
    [Jan 12 18:39:27] WARNING[1825]: chan_iax2.c:9018 socket_process: Call rejected by 192.234.56.220: not found available chan.
    -- Hungup 'IAX2/3001-10405'
    == Everyone is busy/congested at this time (1:0/0/1)
    -- Executing [3001@entrada:2] Hangup("DAHDI/1-1", "") in new stack
    == Spawn extension (entrada, 3001, 2) exited non-zero on 'DAHDI/1-1'
    -- Hungup 'DAHDI/1-1'
    VOIP-SC*CLI>



    Pela console pode-se ver que o ramal estava ocupado e que ao invés do Dial() pular para a prioridade 102 ele vai para a 2 e dá o Hangup.

    No asterisk 1.6.1 esse tratamento é feito de forma diferente? Talvês com alguma extensão especial assim como a "i" ou a "t"... procurei bastante na net e não achei nada que fosse diferente do n+101

    Espero que alguém possa me ajudar pois pelo que vi isso é o basico para tornar possivel o funcionamento do voicemail.

    Valew galera!

  2. #2

    Padrão Resolvido

    Galera, peço desculpas por postar a duvida e resolver logo em seguida, mas é que realmente passei 3 dias tentando descobrir isso e não encontrava material.
    De qualquer forma vou responder minha propria pergunta na esperança de ser útil para mais alguém.


    O esquema de n+101 morreu, não é mais utilizado, não ficou bem claro para mim a partir de que versão isso ocorreu, porém agora para tratar as chamadas ocupadas é usada a aplicação Gotoif(), que é um Goto() condicional.

    Para entender essa solução antes tenho que comentar que desde a primeira versão 1.4 do Asterisk as prioridades não precisam mais ser numeradas e usamos um "n" no lugar delas, apenas a primeira que tem de ser "1", outro detalhe é que é possivel anexar um texto identificador nas prioridades, esse texto deve ser colocado entre parenteses logo apos a prioridade.ex:

    exten => 100,n(texto),Dial(SIP/100)

    A solução completa ficou da seguinte maneira:

    [entrada] ; Entrada de chamadas pela PSTN
    exten => s,1,Answer() ;atende a chamada
    exten => s,n,Wait(1) ;reten 1 segundo
    exten => s,n(entrada),BackGround(entrada) ; Toca o arquivo de som entre () e interrompe a gravação caso algum numero seja discado
    exten => s,n,WaitExten(5) ; Aguarda os segundos entre () para o usuario digitar

    exten => 3001,1,Dial(IAX2/3001,30,tT) ; Chama os ramal 3001
    exten => 3001,n,GotoIf($["${DIALSTATUS}" = "CHANUNAVAIL"]?busy
    exten => 3001,n,Hangup() ; desliga a chamada
    exten => 3001,n(busy),playback(ocupado) ; toca o arquivo de som entre ()
    exten => 3001,n,Hangup() ; desliga a chamada


    Expicação:

    Após a aplicação Dial() terminar ela irá atribuir um valor à varialvel ${DIALSTATUS}, esse valor poderá ser CHANUNAVAIL, CONGESTION, NOANSWER, BUSY, ANSWER, CANCEL, DONTCALL, TORTURE ou INVALIDARGS. Para saber o que significa da um deles você pode executar "core show application dial" a partir da CLI do Asterisk. Também é possivel verificar qual o valor da variavel diretamente, executando a aplicação UserEvent() logo apos a dial() de forma que ela escreverá na CLI o valor da varial ${DIALSTATUS}, assim é possivel verificar na pratica quais valores ela pode assumir em diversas situações, isso pode ser feito da seguinte forma:

    exten => 3001,1,Dial(IAX2/3001,30,tT)
    exten => 3001,n,UserEvent(O status é : ${DIALSTATUS})


    Na CLI aparece da seguinte forma:

    -- Executing [3001@entrada:2] UserEvent("DAHDI/1-1", "O status é : CHANUNAVAIL") in new stack

    Ou seja, no meu caso o status retornado foi "CHANUNAVAIL"

    Sabendo-se isso então logo após o Dial() vamos usar a plicação Gotoif() para testar o valor da variavel ${DIALSTATUS} e executar um goto baseando-se no resultado.
    A sintaxe da aplicação Gotoif() é a seguinte:

    exten => extensão,prioridade,Gotoif($[$(VARIAVEL) = "VALOR"]?verdadeiro:falso)

    Sendo nesse caso a VARIAVEL ${DIALSTATUS} e o VALOR "CHANUNAVAIL", após o ? temos mais 2 campos separados por ":" , o primeiro é executado se a comparação for verdadeira e o segundo se for falsa, esses campos podem assumir valores de prioridades ou no caso de se usar a prioridade "n" o valor do texto anexado a ela entre (), caso qualquer um dos campos seja omitido a ação tomada será passar para a proxima prioridade.
    No meu exemplo, caso a comparação de certo ele ira fazer um goto para a prioridade que tem o texto anexo (busy), assim tocando um arquivo de som(ocupado) que diz que o ramal está ocupado e em seguida cai no Hangup, se a comparação der errado, ou seja, se o status que voltar for diferente de "CHANUNAVAIL" ele passa pra proxima prioridade e cai no Hangup.
    Ainda não possuo grande dominio sobre o Asterisk, mas a cada dia que estudo estou me surpreendendo mais com ele e essa aplicação Gotoif() realmente é super útil e poderá ser usada para tratar varias situações e não somente essa que descrevi aki.

    Espero que isso ajude mais alguém.

    Abraços!