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:
Resultado da execução do servidor AGI:
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.
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
Posta o código do seu FastAGI
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
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