AGI Asterisk Java

Olá pessoal, boa tarde.

Nesse post, gostaria de falar um pouco sobre Asterisk-Java, um assunto muito interessante. Hoje de maneira bem prática vou demonstrar como realizar a integração entre Asterisk e Java, essa integração pode trazer inúmeros benefícios ao seu servidor de telefonia.

Primeiramente, vamos criar a classe Java, eu utilizei o Netbeans, mas pode ser realizado com Eclipse sem problemas. Minha classe é simples, ela cria uma varíavel no contexto da ligação chamada “resultado” e atribui o valor “ok” para ela. Em seguida vou “printar” esse valor no console do meu Asterisk.

Vamos lá?

Classe Java “AgiJava”:


import org.asteriskjava.fastagi.AgiChannel;
import org.asteriskjava.fastagi.AgiException;
import org.asteriskjava.fastagi.AgiRequest;
import org.asteriskjava.fastagi.BaseAgiScript;

public class AgiJava extends BaseAgiScript{

 public void service(AgiRequest request, AgiChannel channel)
 throws AgiException
 {
 // Atende o canal...
 answer();

 setVariable("resultado", "ok");

 }

}

Após compilar copie o jar gerado para o Asterisk e mapeie a classe no arquivo de propriedades do FastAgi. O nome do meu AGI faz referência ao nome da minha classe Java, vejam:


--fastagi-mapping.properties
hello.agi = AgiJava

Feito isso inicie o servidor padrão do AGI com o seguinte comando:

 


--Iniciando o serviço Java
java -classpath /usr/local/asterisk-java/target/asterisk-java.jar:/usr/local/asterisk-java/target/TesteAsterisk.jar:. org.asteriskjava.fastagi.DefaultAgiServer

Para finalizar configure o seu contexto de ligação, no meu exemplo eu simplesmente

inicio o AGI e exibo o valor da variavel “resultado” que foi criada pelo Java.


--extensions.conf
[testeAgi]
exten => 001,1,Agi(agi://localhost/bruno/hello.agi)
exten => 001,n,NoOp( resultado: ${resultado})
exten => 001,n,Hangup

O resultado disso pode ser visto no console:

ConsoleAsterisk

 

Resultado da execução do servidor AGI:

ServidorAgi

Mais links?
http://www.asterisklibre.org/arquivos/category/agi-java
http://www.asterisk-java.org/development/tutorial.html
http://www.beanizer.org/site/index.php/en/Articles/A-simple-AGI-scripting-engine-with-Asterisk-Java.html

É isso pessoal.

Confira meu perfil profissional no LinkedIn e faça parte da minha rede. https://lnkd.in/w9kyFR

Abraços,
Bruno Fernando Antognolli.

 

9 respostas em “AGI Asterisk Java

  1. Fala Bruno, boa tarde.
    Estou tentando fazer uma conexão Aterisk-java mas não estou conseguindo.
    Usando as minhas bibliotecas fiz o meu jar
    Importei ele para o mesmo diretório onde está o asterisk-java.jar e o fastagi-mapping.properties
    quando eu executo o comando
    java -classpath asterisk-java.jar:CallTace.jar:. org.asteriskjava.fastagi.DefaultAgiServer
    ele não apresenta error, porém quando eu acesso meu agi informa que não existe agi configurado.

    May 19, 2015 5:32:32 PM org.asteriskjava.fastagi.internal.AgiConnectionHandler run
    SEVERE: No script configured for URL ‘agi://localhost/hello.agi’ (script ‘hello.agi’)

    exten => s,1,Answer
    exten => s,n,AGI(agi://localhost/hello.agi)
    exten => s,n,Verbose(0, ‘RESPONSE_STATUS_CLIENT = [${OPE}] – ${RESULTADO}’)
    exten => s,n,Hangup()

    O que será que está acontecendo ?

    • Douglas, blz kra!!!

      Vamos lá, o seu script “hello.agi” está corretamente configurado no fastagi? Coloca o código do seu fastAGi pra eu ver…

      Sua classe Java está dentro de algum pacote? Se estiver, vc já revisou se o link foi feito corretamente?

      *Seu erro é comum, é meio chato de resolver mas dá pra fazer…

      abs,
      Bruno.

      • Eai valeu pela resposta, tem vários dias que eu estou com este problema.

        Vou postar os códigos dos arquivos…
        Estou usando o asterisk-java-1.0.0
        fastagi-mapping.properties -> hello.agi = CallTrace

        Minha classe java:
        package br.com.jcn.view;

        import org.asteriskjava.fastagi.AgiChannel;
        import org.asteriskjava.fastagi.AgiException;
        import org.asteriskjava.fastagi.AgiRequest;
        import org.asteriskjava.fastagi.BaseAgiScript;

        import br.com.jcn.controller.CallTraceController;
        import br.com.jcn.entities.TraceChamada;

        public class CallTrace extends BaseAgiScript {

        public void service(AgiRequest request, AgiChannel channel)
        throws AgiException {

        String uniqueId = null;
        TraceChamada traceChamada = new TraceChamada();

        if(channel.getVariable(“ID_CHAMADA”).equals(null)){
        uniqueId = traceChamada.geraID();
        }
        else{
        uniqueId = channel.getVariable(“ID_CHAMADA”);
        }

        traceChamada.setUniqueId(uniqueId);
        traceChamada.setNumCliente(channel.getVariable(“NUMCLIENTE”));
        traceChamada.setDataChamada(channel.getVariable(“DATE_ACTION”));
        traceChamada.setIdEvento(channel.getVariable(“ID_EVENT”));
        traceChamada.setResponseWs(channel.getVariable(“RESPONSE_WS”));
        traceChamada.setUraChannel(channel.getVariable(“URA_CHANNEL”));
        traceChamada.setOperadora(channel.getVariable(“OPERADORA”));
        traceChamada.setStCliente(channel.getVariable(“STATUS_CLIENT”));

        CallTraceController traceController = new CallTraceController();

        setVariable(“RESULTADO”, traceController.registraChamada(traceChamada));

        }

        }

        Gerei o Jar no Eclipse e coloquei no mesmo diretório dos asterisk-java e fastagi-mapping
        /var/lib/asterisk/agi-bin

    • Acho que é isso o problema, não configurei o Hello.agi no FastAgi, como eu faço isso, ou seria o mapeamento do fastagi-mapping.properties ?
      Fiquei meio confuso.

      • Vc vai copiar o seu JAR (java compilado) para a pasta do Asterisk, no meu caso é “/usr/local/asterisk-java/target”.

        Após o “jar” estar devidamente copiado no diretório mencionado é necessário configurar o arquivo “fastagi-mapping.properties” (que também está na pasta TARGET). Neste arquivo associa-se as classes java compiladas no “jar” com um nome de script AGI

        o conteúdo do fastagi-mapping.properties deve ser semelhante a:
        ==================
        hello.agi = ClasseJava
        Asterisk2.agi = classeJava2
        ==================
        hello.agi é o nome do agi q vc vai usar no plano de discagem
        ClasseJava é o nome da sua classe Java compilada

        Após mapear os scripts AGI com as classes Java é necessário iniciar o servidor AGI com os scripts compilados em Java

        Tenta isso

  2. Bruno, boa tarde desculpa de demora.
    Mas consegui fazer funcionar porém tive que retirar todas as minhas classes java dos pacotes.
    ou seja peguei todo o projeto que tem pacote de controller, de odbc, e de view este ultimo que era onde estava minha classe mapeada no properties.
    Coloquei tudo no pacote default compilei e agora sim funcionou.
    Mas eu não entendi como por que só assim funcionou, pode me explicar ?

    • Consegui fazer funcionar cara, era o apontamento no properties mesmo.
      Acabou ficando assim -> hello.agi = br.com.jcn.view.CallTrace
      Vlw pela força e post ajudou muito.

      • Douglas, fico feliz em ter ajudado!!!

        Esqueci de avisar que quando você tem pacotes java vc tbm tem que mapear no properties, do jeito q vc fez!

        Sempre colocando os pontos e respeitando o que criou lá no Java!

        Se precisar de mais alguma coisa que eu possa ajudar, diz aí.

        Abração e boa sorte no seu projeto

Deixe um comentário

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.