[AsteriskBrasil] ATA FXO

Tiago Durante tiagodurante em gmail.com
Quinta Maio 8 14:52:31 BRT 2008


Nenhum comentário? rs...



[]s

2008/5/7 Tiago Durante <tiagodurante em gmail.com>:
> Olá senhores,
>
> Eu comecei a fazer essa gambiarra nível 5 essa semana... hehehe, então
> o que vou postar aqui ainda tem um pequeno defeito, que eu explico.
> Mas já funciona!!
>
> Vou explicar meu ambiente:
>
> Temos alguns Asterisks na empresa que trabalho, todos interligados via
> IAX/DUNDi. Para os sites onde temos Asterisk, beleza! Tá todo mundo
> falando via RAMAL e podendo ligar para o ramal direto.
>
> O problema está nos sites que ainda temos PBX comuns. Nesses sites
> temos ATAs conectados a portas FXO do PBX. Quando uma pessoa desse
> site FAZ uma ligação, beleza! Ela disca o ramal de destino e o ATA se
> vira com o Asterisk e entrega a chamada. A cagada está quando alguem
> de fora quer ligar para um ramal neste site. Ela não consegue, ou
> melhor, não conseguia, ligar diretamente. A chamada era atendida pela
> URA do site e ai o camarada entrava com o ramal.
>
> Antes eu usava QUEUE para entregar as chamadas nesses ramais
> conectados aos PBX comuns. Por exemplo, no PBX eu tenho conectado 2
> ATAs com um total de 4 ramais, esses ramais sempre começam no XXX99 e
> vão descendo. Sendo assim se os ramais desse site são 455XX, os dois
> ATAs teriam os ramais: 45599, 45598, 45597 e 45596. Eu colocava uma
> regra no dialplan que se o camarada chama 45599 o Asterisk jogava a
> chamada para a QUEUE com os 4 ramais e entregava em qquer um livre.
>
> LEGAL! Agora começa o POG (http://desciclo.pedia.ws/wiki/POG)
>
> =)
>
> Eu vi que não poderia usar fila, pois dependo da função M (macro) do
> comando DIAL. Mas eu preciso verificar se as linhas estão com aptas a
> receber uma ligação antes de jogar a chamada pro ATA. Confesso que
> preciso de ajuda exatamente nessa parte. Vou explicar o que fiz hoje.
>
> Cada linha no ATA pode ter uma ligação por vez (jura?). Então já
> defini isso no SIP.CONF com a opção call-limit=1. Isso é vital para o
> funcionamento do MACRO. Também deixo o qualify sempre ativo para esses
> ATAs, com isso eu posso verificar se ele está no ar e se já existe
> alguma chamada dentro dele. A macro verificar esses dois valores em
> todas a linhas, começando na primeira que eu passo para ele, por
> exemplo 45596, e terminando na ultima que sempre termina em 99, no
> caso 45599.
>
>
> Esse exemplo é de uma chamada que VAI PARA A URA:
> exten => 45599,1,Answer()
> exten => 45599,n,Macro(check-ata,45596,0,${EXTEN:1})
>
> check-ata é a minha macro
> 45596 é o primeiro ATA conectado ao PBX
> 0 é o valor que indica que ele vai para a URA, não jogando DTMF na linha
> ${EXTEN:1} é o ramal local no PBX, que nesse caso nem será usado, eu
> tiro o primeiro digito pq nos PBXs comuns nao existe esse 4, isso é um
> padrão nosso para localização geografica do ramal
>
>
> Exemplo jogando DTMF na linha com PBX
> exten => _455XX,1,Answer()
> exten => _455XX,n,Macro(check-ata,45596,1,${EXTEN:1})
>
> check-ata é a minha macro
> 45596 é o primeiro ATA conectado ao PBX
> 1 indica que tem DTMF para ser jogado na linha
> ${EXTEN:1} agora sim esse cara vai ser usado.
>
> Bom, agora que vc viu como chamar a macro, vamos ver o código.. que
> precisa ser melhorado:
>
> [macro-check-ata]
> ; Primeiro passo: Atende o canal e transforma as informacoes dos PEERS SIP
> ;                 em variaveis. Vamos usar o STATUS do canal, se ele esta
> ;                 conectado ou nao, e se existe uma CALL dentro desse canal.
> exten => s,1,Answer()
> exten => s,n,Set(channel=${ARG1})
> exten => s,n,Set(continue=yes)
> exten => s,n,Set(calls=${SIPPEER(${channel}:curcalls)})
> exten => s,n,Set(status=${SIPPEER(${channel}:status)})
> exten => s,n,Set(status=${CUT(status, ,1)})
> exten => s,n,NoOp(MACRO CHECK == Calls: ${calls} / Status: ${status})
> ; Segundo passo: Caso o canal este OK e o numero de CALLs dentro desse canal
> ;                seja igual a zero, se sim ele joga a chamada para o GOTOIF
> ;                da posicao 13, se nao vai um para baixo. No verificador de
> ;                baixo ele olha se pode seguir pela variavel CONTINUE.
> exten => s,n,GoToIf($[$["${STATUS}" = "OK"] & $["${calls}" = "0"]]?13:9)
> exten => s,n,GoToIf($["${continue}" = "yes"]?10:102)
> ; Terceiro passo: Sendo possivel continuar ele soma 1 ao numero do ramal,
> ;                 isso eh feito porque os ramais de ATA terminam sempre
> ;                 no ramal numero 99, esse eh o controlador para saber a
> ;                 hora que acabam os canais. Depois verifica se o valor
> ;                 do proximo canal eh 99, se sim avisa que eh a ultima
> ;                 volta do loop setando CONTINUE como NO.
> exten => s,n,Set(channel=$[${channel} + 1])
> exten => s,n,Set(continue=${IF($[${channel:3} = 99]?no:yes)})
> exten => s,n,GoTo(s,4)
> ; Quarto passo: Se a chamada eh possivel ele ve se deve joga-la com o DTMF
> ;               ou se a chamada deve realmente cair na URA/Telefonista.
> exten => s,n,GoToIf($["${ARG2}" = "0"]?14:17)
> exten => s,n,Dial(SIP/${channel},40,D)
> exten => s,n,Congestion(5)
> exten => s,n,HangUp()
> exten => s,n,Dial(SIP/${channel},40,DM(dial-ata,${ARG3}))
> exten => s,n,Congestion(5)
> exten => s,n,HangUp()
> ; Quinto passo: Nao sendo possivel jogar a chamada em nenhum canal, BUSY.
> exten => s,102,Congestion(5)
> exten => s,103,HangUp()
> exten => t,1,HangUp()
> exten => i,1,HangUp()
>
>
> O segredo do negocio está aqui:
> exten => s,n,Dial(SIP/${channel},40,DM(dial-ata,${ARG3}))
>
> Quando a chamada vai com DTMF para ser jogado na linha ele chama a
> macro dial-ata que é extremamente simples:
>
> [macro-dial-ata]
> ; Joga DTMF dentro de canal para forcar ATA a realizar chamada para
> dentro do PABX
> exten => s,1,NoOp(MACRO - Dial ATA)
> exten => s,n,Wait(4)
> exten => s,n,SendDTMF(${ARG1})
> exten => s,102,HangUp()
>
>
>
> PRONTO! Simples assim...
>
>
> AGORA, qual é o problema?
>
> As vezes os ATAs ficam busy... E isso não aparece nas variveis que eu
> verifico antes de jogar a chamada pra linha X do ATA. Isso faz com que
> quem disca tenha tom de ocupado imediatamente. Bom, como fiz essa
> parada na segunda-feira... acho até tá prestando bem... mas quero só
> arrumar esse detalhe... ae fica coisa linda!
>
> Se alguem tiver dicas!
>
> Espero ter ajudado! =)
>
>
> Abraços,
>
>
>
>
> --
> Tiago Durante
>
> ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,
> Perseverance is the hard work you do after you
> get tired of doing the hard work you already did.
> -- Newt Gingrich
>
>
>
>
>
>
>
>
>
> 2008/5/6 Halley Souza <aiccomti em gmail.com>:
>> Tiago, gostaria de receber seu exemplo também, pois até hoje não consegui
>> fazer isto com o meu gateway.
>>
>> Abs
>>
>> Halley
>>
>>
>>
>>
>>
>> 2008/5/6 Rafael Puga <rad.puga em gmail.com>:
>>
>> > Estou no aguardo, obrigado =)
>> >
>> >
>> > 2008/5/6 Tiago Durante <tiagodurante em gmail.com>:
>> >
>> >
>> >
>> > > Rafael, estou fazendo a mesma coisa aqui e já funcionou...
>> > >  Não estou com tempo agora, mas depois te passo como fiz.
>> > >  É bem simples, usei MACRO no DIAL e o comando SendDTMF
>> > >
>> > >
>> > >  Abraços,
>> > >
>> > >
>> > >  2008/5/6 Rafael Puga <rad.puga em gmail.com>:
>> > >
>> > >
>> > > > Olá pessoal, estou com um ATA FXO e para efetuar uma ligação, é
>> > >  >  necessário chamar o ramal logado na linha analógica PSTN, assim
>> > >  >  obtenho a linha e faço a chamada. Mas gostaria de abstrair isso ao
>> > >  >  usuário, pra ele não ter que ficar chamando um dos 4 ramais e assim
>> > >  >  efetuar a ligação. Para isso, fiz algo do tipo:
>> > >  >
>> > >  >  exten => _[7-9]XX.,1,Dial(SIP/RAMAL_DO_ATA,45,Tt,D(${EXTEN})
>> > >  >
>> > >  >  Fiz isso, pois é apenas para ligações para celular. usei a opção "D"
>> > >  >  do Dial() para que ele enviasse os digitos em DTMF assim que abrisse
>> o
>> > >  >  canal em que obtenho a linha, porém não funcionou. Estou usando
>> > >  >  Asterisk 1.4.19, alguém já fez isso e poderia me dar uma ajuda...
>> > >  >
>> > >  >
>> > >  >  --
>> > >  >  Grato,
>> > >  >  Rafael Puga
>> > >  >
>> > >
>> > >
>> > >  --
>> > >  Tiago Durante
>> > >
>> > >  ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,
>> > >  Perseverance is the hard work you do after you
>> > >  get tired of doing the hard work you already did.
>> > >  -- Newt Gingrich
>> > >  _______________________________________________
>> > >  Compre uma camiseta da AsteriskBrasil.org!
>> > >             http://www.voipmania.com.br
>> > >                 == VoIPMania.com.br ==
>> > >
>> > >  _______________________________________________
>> > >  Lista de discussões AsteriskBrasil.org
>> > >  AsteriskBrasil em listas.asteriskbrasil.org
>> > >  http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil
>> > >
>> >
>> >
>> >
>> > --
>> >
>> >
>> >
>> > Grato,
>> > Rafael Puga
>> >
>> > "Dados olhos suficientes, todos os erros são triviais."
>> > _______________________________________________
>> > Compre uma camiseta da AsteriskBrasil.org!
>> >            http://www.voipmania.com.br
>> >                == VoIPMania.com.br ==
>



-- 
Tiago Durante

,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,
Perseverance is the hard work you do after you
get tired of doing the hard work you already did.
-- Newt Gingrich


More information about the AsteriskBrasil mailing list