PDA

Voir la version complète : Difficultées avec Asterisk AMI



adr8ien
08/06/2011, 21h32
Bonjour à tous!

Alors, comme l'explique le titre du sujet, je rencontre quelques difficulté avec Asterisk manager API.
Mon but est simple, un système Click2Dial, j'ai bien trouvé des exemples, mais je n'arrive à rien depuis 4 jours à pleins de temps maintenant.

J'ai écrit une fonction de test, toute bête, pour trouver une solution, mais rien.
J'ajoute que j'ai installé AsteriskNow 1.6 sur une machine virtuelle, et que j'utilise X-Lite pour les tests.
Le paramétrage d'Asterisk m'a l'air bon, (tout fonctionne comme je le souhaite lorsque je teste avec plusieurs sessions lancées sur X-Lite), mais je n'arrive pas à reproduire tout ça en java.

Voici donc ma classe de test, n’hésitez pas à m'engueuler si vous voyez des aberrations!

Merci d'avance à vous!


import java.io.IOException;

import junit.framework.TestCase;

import org.asteriskjava.live.AsteriskChannel;
import org.asteriskjava.live.AsteriskQueueEntry;
import org.asteriskjava.live.AsteriskServerListener;
import org.asteriskjava.live.DefaultAsteriskServer;
import org.asteriskjava.live.MeetMeUser;
import org.asteriskjava.live.internal.AsteriskAgentImpl;
import org.asteriskjava.manager.TimeoutException;
import org.asteriskjava.manager.action.QueueAddAction;
import org.asteriskjava.manager.response.ManagerResponse;



@SuppressWarnings("deprecation")
public class TestConnexion extends TestCase implements AsteriskServerListener {

public void testConnexion() throws IllegalArgumentException, IllegalStateException, IOException, TimeoutException {
DefaultAsteriskServer server = new DefaultAsteriskServer("192.168.0.35", "root", "root");
server.addAsteriskServerListener(this);

QueueAddAction action = new QueueAddAction();
action.setMemberName("Test");
action.setQueue("simple-queue");
action.setInterface("SIP/Test");
action.setStateInterface("SIP/AutreTest");
action.setPaused(false);

/* Deprecated --> Message d'erreur si j'utilise cette action (Unknown command)
AgentCallbackLoginAction action = new AgentCallbackLoginAction();
action.setAckCall(true);
action.setAgent("SIP/Test");
action.setExten("AutreTest");
*/

ManagerResponse reponse = server.getManagerConnection().sendAction(action,15 000);
System.out.println("Login Response:" + reponse.getResponse());
System.out.println("Login Message:" + reponse.getMessage());


}

@Override
public void onNewAgent(AsteriskAgentImpl arg0) {
// TODO Auto-generated method stub

}

@Override
public void onNewAsteriskChannel(AsteriskChannel arg0) {
// TODO Auto-generated method stub

}

@Override
public void onNewMeetMeUser(MeetMeUser arg0) {
// TODO Auto-generated method stub

}

@Override
public void onNewQueueEntry(AsteriskQueueEntry arg0) {
// TODO Auto-generated method stub

}
}

Reaper
08/06/2011, 21h59
En telnet manuellement ça passe bien ?

adr8ien
08/06/2011, 22h10
En telnet manuellement ça passe bien ?

Quelles instructions je dois rentrer pour tester une fois que je suis loggé dessus?

Reaper
08/06/2011, 22h13
Originate par exemple.

adr8ien
08/06/2011, 22h19
Je n'y arrive pas avec telnet.

Pas forcement parce que cela ne marche pas, surtout parce que je n'ai pas l'habitude de l'utilisé.
Que dois tapé exactement une fois que je suis connecté en telnet?

En tout cas merci beaucoup de m'avoir répondu si vite!

Reaper
08/06/2011, 22h25
http://www.voip-info.org/wiki/view/Asterisk+manager+API

adr8ien
08/06/2011, 23h10
Je le connaît bien ce lien, je suis dessus depuis 4 jours de 8h à 4h du matin! :)

Le problème venait tout simplement de moi, car dans tous les exemple, les instruction sont séparé par un saut de ligne, qui ne s'affiche pas sur ma console, ça m'a déstabilisé!

Donc la réponse est: avec telnet je peux très bien envoyer la commande!

Mais l'envoi d'une action originate, j'ai réussi en java avec le Manager API.

Mais mon but, et autant pour moi c'est vrai que j'ai peut être pas été très clair, est de faire un applet JAVA. Depuis cette applet, je sélectionne un contact et je l'appel. Un Click2Call.
Ce que je ne comprends pas, c'est comment récupérer la communication depuis mon applet. Parce qu'en faisant comme ça, Asterisk va appeler le destinataire, mais il faut évidemment que l'appelant puisse communiquer avec lui, et c'est cette dernière partie que je n'arrive pas à résoudre.

Donc je ne sais pas si c'est simplement que je n’envoie pas la bonne action, ou autre chose.

Reaper
09/06/2011, 10h17
Je vais te donner l'exemple d'une bonne action pour asterisk 1.6




Exemple en ruby:

testcall.rb

require 'socket'

STDOUT.flush
s = TCPsocket.open('localhost', 5038)

seq = [
"Action: Login",
"Username: contactlist",
"Secret: contactSdjgsD6",
"",
"Action: Originate",
"Channel: SIP/SOFTPHONE001", #DEVICE de l'appelant
"Context: trunktollfree", #Contexte avec le bon plan de numérotation
"Exten: 33557023597", #DESTINATION
"Priority: 1",
"Callerid: Dupond <3355706456>", #PRESENTATION DE NUMERO
"",
"Action: Logoff"
""
""
]

seq.each{ |c| s.puts "#{c}\r\n" }

while line = s.gets # Read lines from the socket
puts line.chop # And print with platform line terminator
end

adr8ien
09/06/2011, 11h53
Oui merci beaucoup Reaper, mais j'ai bien saisi comment lancer une action.

Le problème en lançant une action originate, c'est que ça va d'abord faire sonner l'appelant, puis une fois qu'il a décrocher, faire sonner l'appelé.

Maintenant, mon but est d’établir directement la communication avec l'appelant, et de faire sonner l'appeler, mais c'est aussi de rester à l'écoute d'Asterisk si jamais quelqu'un m'appel, et dans ce cas, la, soit l'action originate n'est pas ce que je veux, soit il ne faut pas que j'utilise cette API, soit je ne fais pas faire!
Dans tout les cas, j'aimerais un petit peu d'aide! :)

Reaper
09/06/2011, 13h55
C'est quoi le souci ? Utilise originate pour initier un appel, sinon parse EVENT si quelqu’un t’appelle, ta mis 4 messages pour finalement d’écrire ce que tu veux. Pas la peine de mettre les classes nous pouvons t'aider seulement coté asterisk.