quinta-feira, 7 de março de 2013

Tutorial - CAllBACK asterisk


Hoje precisei criar um callback na empresa que trabalho, esse callback funciona da seguinte maneira:

Ligo na empresa do meu celular(ou de qualquer número que bine) de qualquer região, o servidor pega o meu número, desliga a chamada e me retorna, após isso, digito o numero que desejo fazer a ligação e ele disca e completa para mim.
Isso foi necessário, pois nossos celulares só fazem ligação para região 43...

Então criei uma tutorial Básico para quem necessitar.

Callback para ligações externas

primeiro, criaremos a regra de entrada, nesse caso estou simulando uma ligação entrando por um
determinado DDR de um link E1, mais pode ser ligações de entrada de qualquer tipo (FXO, SIP,
Analógico, etc) bastando apenas ser alterado para cada situação.

[entrada]

exten => _3200,1,NoOp(Realizando CallBack )
exten => _3200,2,Wait(1)
exten => _3200,3,Macro(callback,)
exten => _3200,4,Hangup()

linha 1 - mostra na tela a descrição dentro dos parenteses "()"
linha 2 - espera um segundo antes de continuar
linha 3 - vai para macro callback que veremos a seguir.
linha 4 - derruba a ligação após colher as primeiras informações.

agora, criaremos uma macro callback onde criaremos o arquivo .call que fará o retorno da ligação para o número que ligou.


[macro-callback]
exten => s,1,set(CALLBACK-FILE=/var/spool/asterisk/outgoing/${MACRO_EXTEN}-${CALLERID(num)}.call)
exten => s,n,system(echo Channel: SIP/0${CALLERID(num)}@g1entrada > ${CALLBACK-FILE})
exten => s,n,system(echo Context: saida-callback >> ${CALLBACK-FILE})
exten => s,n,system(echo Extension: 1000 >> ${CALLBACK-FILE})
exten => s,n,system(echo Callerid: ${CALLERID(num)} >> ${CALLBACK-FILE})
exten => s,n,system(echo MaxRetries: 2 >> ${CALLBACK-FILE})
exten => s,n,system(echo RetryTime: 30 >> ${CALLBACK-FILE})
exten => s,n,system(echo WaitTime: 30 >> ${CALLBACK-FILE})
exten => s,n,MacroExit


linha 1 - seto uma variável com o diretório /var/spool/asterisk/outgoing/ + o nome do arquivo que será criado automaticamente.
linhas n - no restante das linhas, escrevo dentro do arquivo as opções necessárias para rodar um arquivo .call (vejam mais informações de arquivos .call para entenderem melhor caso tenham dúvidas).
linha 2 - canal que sairá a ligação, no meu caso estou enviando pela operadora da empresa em que trabalho.
linha 3 - contexto que será direcionado para que a pessoa possa digitar o numero desejado.
linha 4 - extensão que será entregue esta ligação dentro do contexto anterior.
linha 5 - callerid da chamada
linha 6 - Numero maximo de vezes que o asterisk irá  tentar chamar o originador antes de considerar que a chamada falhou.
Este parâmetro não considera a primeira tentativa, portanto se definido como 0, o asterisk tentará chamar apenas uma vez.
linha 7 - Seguntos entre as tentativas de chamar o originador. O padrão é 300 segundos.
linha 8 - Numero de segundos que o asterisk irá chamar o originador a cada tentativa. O padrão é 45.
linha 9 - sai da Macro.

após sair da macro, o asterisk dará o hangup conforme linha 4 do contexto entrada, após isso, o arquivo .call criado já será executado chamando o número que havia ligado anteriormente, quando houver o atendimento dessa chamada, jogará para o contexto descrito no arquivo .call que criamos (saida-callback).

o contexto saida-callback dará um bip e aguardará um numero ser digitado. Nesse caso dará um Bip, mais pode-se personalizar com uma gravação da maneira que desejar.

[saida-callback]

exten => 1000,1,Answer()
exten => 1000,2,PlayBack(beep)
exten => 1000,n,Read(NUMERO)
exten => 1000,n,Dial(SIP/${NUMERO}@g1telecom,40,tg)
exten => 1000,n,Macro(hangupcall,)

linha 1 - atende a chamada
linha 2 - dá um bip após o atendimento da chamada, aqui pode-se colocar uma mensagem para o usuário ouvir tipo: digite o numero que deseja, ou coisa do tipo.
linha 3 - lê os digitos e salva na variável NUMERO
linha 4 - dá um dial para o numero capturado.
linha 5 - dá um hangup ao término da ligação.

acho que é isso pessoal, desculpem qualquer coisa, mais esse é um dos meus primeiros tutoriais e fiz correndo, qualquer erro me perdoem..rsrs.

abraços.

14 comentários:

  1. para bloquear quem pode usar o callback, pode-se também colocar uma senha. Basta adicionar uma linha no contexto saida-callback:

    [saida-callback]

    exten => 1000,1,Answer()
    exten => 1000,n,Authenticate(123), linha adicionada que irá pedir senha.
    exten => 1000,n,PlayBack(beep)
    exten => 1000,n,Read(NUMERO)
    exten => 1000,n,Dial(SIP/${NUMERO}@g1telecom,40,tg)
    exten => 1000,n,Macro(hangupcall,)

    ResponderExcluir
  2. Boa tarde Danilo.
    Muito grata pela sua contribuição.
    Aqui necessito fazer callback para e somente para ligações à cobrar.
    Exemplo: Se a ligação entrante for à cobrar, o servidor deve desligar a chamada e retornar, no entanto, não sei como se identificar se a ligação é à cobrar ou não.
    Você tem alguma ideia?
    Desde já agradeço!

    ResponderExcluir
    Respostas
    1. olá, boa tarde!

      Nunca precisei implementar desta forma, porém, sei que tem uma maneira de fazer isto. Se a sinalização da sua operadora for mfcr2, existe uma variável chamada MFCR2_CATEGORY, que armazena a categoria da ligação, sendo assim, creio que conseguirá saber quando uma ligação é a cobrar ou não. Como disse, nunca precisei utilizá-la, creio que com alguns testes no seu asterisk pode conseguir identificar qual o valor da variável quando se trata de uma ligação a cobrar.... fico no aguardo de notícias..rsrs...
      P.S. para testes, imprima o valor da variável quando enviar ligações a cobrar ou não.

      ex:
      [from-pstn]
      exten => s,1,NoOp(--> o valor da variável é: ${MFCR2_COTEGORY} <--)
      .
      .
      .

      BOM TESTE

      Excluir
  3. Olá Danilo, muito boa sua contribuição! Tenho aqui uma necessidade um pouco diferente veja se pode ajudar, preciso implementar no site a empresa um tipo de 0800web, onde a pessoa digite seu telefone e o script faça a ligação entre o telefone da pessoa e o ramal ip do servidor asterisk, pode ajudar?

    ResponderExcluir
    Respostas
    1. blz Eduardo... Creio que terei que criar um outro tutorial para esta necessidade. Me adiciona no skype que te ajudo. Abraço

      Excluir
  4. Danilo, boa tarde

    Veja se pode me ajudar. Estou querendo fazer com que o Asterisk atenda uma chamada com uma gravação, derrube e retorne via rota de menor custo.

    No meu caso estou usando como operadora um E1, placa Dahdi da Aligera.

    Desde já agradeço.

    ResponderExcluir
  5. Olá.... criei um callback simples via web no elastix, para diminuir o custo de um 0800, ele desliga a ligação e retorna como o esperado, porém ao retornar.. Se a pessoa não atender no primeiro toque o elastix desiste da ligação. .. sabe como corrigir isso???

    ResponderExcluir
    Respostas
    1. estou com o mesmo problema, conseguiu resolver ? helio@traxxtecnologia.com.br

      Excluir
  6. Olá.... criei um callback simples via web no elastix, para diminuir o custo de um 0800, ele desliga a ligação e retorna como o esperado, porém ao retornar.. Se a pessoa não atender no primeiro toque o elastix desiste da ligação. .. sabe como corrigir isso???

    ResponderExcluir
    Respostas
    1. Cara, não conheço essas funcionalidades do elastix.. configurando manual, a variável "MaxRetries" contém a quantidade de tentativas que o asterisk vai tentar antes de descartar a ligação.. procure alguma coisa ai na configuração do elastix, deve ter algo.

      Excluir
  7. Olá Danilo. Estou com um probleminha no meu callback. e gostaria de saber como faria para que a ligação do callback saisse por uma rota de acordo com o contexto interno, pois tenho 2 rotas, uma para celular e uma para fixo então gostaria que ele encaminhasse para a rota certa. tem como fazer isso ? poderia me dar uma dica ? obrigado

    ResponderExcluir
  8. Boa tarde Danilo. Vc teria alguma dica para fazer um callback para ser utilizado para retorno no callcenter, caso a atendente esteja ocupada o callback retorna mas somente quando ela desocupar para que no retorno o cliente não fique na fila novamente, ou seja teria que analisar o status da atendente. Tem alguma dica para montar isso ? obrigado

    ResponderExcluir
  9. Muito bom o tutorial. Uso GOIP, mas ele nao está identificando o número de entrada. Pode ser alguma configuração nele ou no Asterisk?

    ResponderExcluir
  10. Danilo Boa Tarde.

    Criei um callback issabel está retornando a ligação certinha, o único problema que toca 8 segundo e encerra, poderiam me ajudar?

    ResponderExcluir