[AsteriskBrasil] Asterisk Manager API - AMI - Asterisk-Java
Silvio Netto
silvionetto em hotmail.com
Quinta Janeiro 18 10:42:19 BRST 2007
Bom dia,
Estive tentando acessar um servidor Asterisk a partir de uma máquina Windows realizar uma ligação e transferir para um atendente.
Com isso descubri várias facilidades do Asterisk e resolvi enviar para a lista algumas coisas interessantes na minha opinião para resolver o problema.
A primeira coisa que me apareceu foi o Asterisk Manager API. Uma interface que disponibiliza acesso ao Asterisk via protocolo TCP/IP.
Para utilizar o Asterisk Manager basta habilitar o serviço editando o arquivo de configuração "/etc/asterisk/manager.conf" como no exemplo abaixo:
;
; Asterisk Call Management support
;
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0
[mark]
secret = mysecret
deny=0.0.0.0/0.0.0.0
permit=209.16.236.73/255.255.255.0
permit=127.0.0.1/255.255.255.0
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user
Para verificar se tudo funcionou basta acessar o servidor Asterisk através de outra máquina com Windows entrando via Telnet. Com um comando como o abaixo:
telnet 192.168.0.1 5038
Irá aparecer a seguinte mensagem:
Asterisk Call Manager/1.0
Agora basta digitar:
Action: login
Username: mark
Secret: mysecret
Obs: Lembrando que qualquer caracter digitado errado, mesmo sendo apagado depois e corrigido faz com que o comando não funcione. Por isso não se preocupe se digitar uma palavra errada e depois apagar e o comando não funcionar. Basta digitar de novo sem errar nada. Para que isso não ocorra aconselho que tudo seja digitado em um bloco de notas e depois copiado para o prompt do DOS. Evitando erros e gardando para futura utilização dos comandos.
E dar dois [enter].
E irá aparecer a mensagem:
Response: Success
Message: Authentication accepted
Para realizar uma ligação e tranferir para um ramal pode-se usar o comando originate. Como no exemplo:
Action: Originate
Channel: SIP/123
Context: default
Exten: 123
Priority: 1
Neste exemplo eu liguei para meu próprio softphone e transferi a ligação para mim também.
Para sair basta digitar:
action: logoff
E terá como resposta:
Response: Goodbye
Message: Thanks for all the fish.
Conexão ao host perdida.
Blz, mas e ai toda vez q eu for ligar vou precisar ir no telnet?
Com isso cheguei ao Asterisk-Java. Uma biblioteca de classes em java para facilitar o acesso ao Asterisk Manager.
Para utilizar o Asterisk-Java basta criar um projeto em java e importar o arquivo .jar do Asterisk-Java para o projeto.
Após isso é só criar uma classe utilizando essa biblioteca. Como no exemplo abaixo:
import java.io.IOException;
import org.asteriskjava.manager.AuthenticationFailedException;
import org.asteriskjava.manager.ManagerConnection;
import org.asteriskjava.manager.ManagerConnectionFactory;
import org.asteriskjava.manager.ManagerEventListener;
import org.asteriskjava.manager.TimeoutException;
import org.asteriskjava.manager.action.StatusAction;
import org.asteriskjava.manager.event.ManagerEvent;
public class HelloEvents implements ManagerEventListener
{
private ManagerConnection managerConnection;
public HelloEvents() throws IOException
{
ManagerConnectionFactory factory = new ManagerConnectionFactory(
"192.168.0.1", "mark", "mysecret");
this.managerConnection = factory.createManagerConnection();
}
public void run() throws IOException, AuthenticationFailedException,
TimeoutException, InterruptedException
{
// register for events
managerConnection.addEventListener(this);
// connect to Asterisk and log in
managerConnection.login();
OriginateAction originateAction = new OriginateAction();
originateAction.setChannel("SIP/123");
originateAction.setContext("default");
originateAction.setExten("123");
originateAction.setPriority(1);
originateAction.setTimeout(new Long(60000));
managerConnection.sendAction(originateAction);
// wait 10 seconds for events to come in
Thread.sleep(10000);
// and finally log off and disconnect
managerConnection.logoff();
}
public void onManagerEvent(ManagerEvent event)
{
// just print received events
System.out.println(event);
}
public static void main(String[] args) throws Exception
{
HelloEvents helloEvents;
helloEvents = new HelloEvents();
helloEvents.run();
}
}
Essa classe faz a mesma coisa que foi feita com o telnet. Realiza uma ligação para o meu ramal e transfere o canal para o meu ramal também. Na vida real não tem muita utilidade mas para fazer um teste você só vai precisar de um X-Lite configurado com o ramal 123.
Tomara que esse tutorial possa ajudar alguém. Ou pelo menos mostrar mais uma funcionalidade do Asterisk.
Abraço a todos,
Silvio Netto
Asterisk Counter 241
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20070118/7b8c0eec/attachment-0001.html
Mais detalhes sobre a lista de discussão AsteriskBrasil