[AsteriskBrasil] ATA FXO

Tiago Durante tiagodurante em gmail.com
Quarta Maio 7 11:48:49 BRT 2008


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 ==


More information about the AsteriskBrasil mailing list