Aide IP PBX SIP

mokazo Messages postés 33 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 26 septembre 2011 - 11 août 2011 à 05:10
 infoHAN - 22 mars 2013 à 11:54
Bonjour

Je souhaite creer une application Client SIP pour effectuer des appels sachant que j'ai un compte sur ippi.fr qui m'offre la passerelle SIP
Le proble c'est que je ne sais pas est ce je devrais avoir un serveur IP PBX ou SIP dans mon LAN pour que je puisse effectuer les appels ou bien le faite d'etre abbonné dans ippi.fr me suffira juste de lappl Client SIP?
Je me suis aussi documenter sur JAIN et JTAPI je ne sais pas lequel est facile et rapide a y mettre en place !

NB:
je devrais avoir de laide pas de reproche et Merci

48 réponses

cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
11 août 2011 à 10:15
salut ;o)

si tu fait un client sip tu le connect à un serveur et cela doit suffir ... inutil d avoir un serveur sur ton lan... ;o)
Pour ce qui est des API désolé ;o) je ne les connais pas...

Bon courage ;o)

GodConan ;o)
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
16 août 2011 à 17:57
Salut,

ippi étant un serveur proxy/registrar SIP tu as simplement besoin de créer un petit client SIP qui s'enregistre (REGISTER) vers ippi (domaine: ippi.fr, port: 5060, protocole: udp), de mémoire ippi impose la gestion du digest+realm pour les REGISTER donc il va te falloir le prendre en compte.

Pour ce qui est de l'API tu peux utiliser jain SIP qui contient tout ce qu'il faut (perso je le trouve bien trop laid et je pref utiliser ma propre stack SIP... mais bon c'est une question de gout...) pour ce qui est de la gestion du flux audio (RTP/RTCP) suite à tes INVITE (si tu veux sortir le flux et le capturer depuis ton pc) tu peux largement t'en sortir avec la JMF.



------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
mokazo Messages postés 33 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 26 septembre 2011
16 août 2011 à 19:53
ET si j'ai un serveur asterisk dans mon LAN?

Merci bcp Twinuts ça montre que vous maitrisez bien les choses concernant JAIN SIP
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
16 août 2011 à 20:44
Salut,

Si tu as asterisk sur ton LAN tu as plusieurs choix possibles (ici j'en retiens 2) :

1 - Tu peux rendre ton client multi serveurs (donc paramétrage obligatoire du port SIP de toutes les sessions) et bypasser asterisk dans le cas d'un REGISTER vers ippi.

2 - Tu peux enregistrer tes clients sur asterisk et ensuite faire en sorte qu'asterisk fasse un REGISTER unique vers ippi, dans ce cas il te faudra créer un routage dans asterisk, pour que par exemple, tu forward l'appel vers ippi:

[list]
cas 1 - si un numéro de téléphone commence par 0 (0 pour sortir soit si tu appels le 0123456789 l'utilisateur devra composer le 00123456789 (tu peux facilement lui eviter ça en lui demandant (ou par config) vers quel serveur il veut sortir) ; assez générique mais impose de commencer les numéros par 0).

cas 2 - si l'alias SIP du champ 'from' vaut 1234 (exemple: From: javafr <sip:1234@asterisk.domain> ; impose faire une règle pour chaque clients et impose également à ce client de toujours passer par ippi).
/list

Pour et contre de la proposition 2:
[list]
cas 1: Configuration d'asterisk réduite au maximum, une seule connexion vers ippi (donc un seul compte), mais tu ne peux effectuer qu'un appel simultané pour tout le LAN.

Proposition 2: Configuration d'asterisk assez redondante si le LAN contient beaucoup de clients, une règle au minimum par client, utilisation réduite du client (si pas de sessions multiples), obligation d'avoir plusieurs comptes ippi (si plusieurs clients), mais le client concerné est assuré de pouvoir passer son appel vers ippi donc plusieurs appels simultanés pour tout le LAN.
/list


Merci bcp Twinuts ça montre que vous maitrisez bien les choses concernant JAIN SIP

Non, non, je ne maitrise pas particulièrement JAIN SIP, je travail juste dans la VoIP (principalement SIP et H323) ;)




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mokazo Messages postés 33 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 26 septembre 2011
17 août 2011 à 04:57
Merci donc vous me serez tres utile !!!

En faite on offre a ippi une passerelle SIP gratuite donc c pas vraiment qlq chose de payant !!!

Mon application consiste a faire des appels a des num PSTN donc je m'occupe actuellement de l'installation et config de Asterisk j'ai tester par X-lite en LAN entre 2 pcs en VMware!

Ensuite je me documente sur SIP <->java plutot le Jain sip !!
Je vx mtn faire une petite appl pour y commencer en faisant des test d'invite et voir cmt ça marche dans le log de asterisk !

Suis je dans la bonne direction ou pas?

Je suis ingenieur reseaux et on m'as ordonné d'installer Asterisk dans la boite ou je travailles donc jaurais bcp de conseils de votre part !!
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
17 août 2011 à 10:12
Salut,

Je pense qu'avant même l'apprentissage de jain SIP il est primordiale que tu maîtrises bien les call graph ainsi que la syntaxe de certains champs, comme principalement celle du champ contact et surtout dans ton cas des VIA (c'est les principaux champs qui posent un réel problème dans une installation, surtout quand certains systèmes qui sont bcp trop stricts s'interfacent avec des systèmes bcp trop laxistes ...

Pour le reste, le log d'asterisk c'est bien mais ça ne remplacera jamais une analyse avec wireshark (qui dispose d'un super mode (graph and co) pour les appels VoIP et également d'outils pour tracer assez finement les flux RTP).


Tu dois garder en principale optique que le but n'est pas de s'interfacer avec asterisk (la finalité oui) mais plus de s enregistrer et émettre/recevoir des appels conformément aux RFC SIP, ainsi demain si tu changes de serveur pour ton LAN ton soft restera le plus compatible possible.




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
mokazo Messages postés 33 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 26 septembre 2011
17 août 2011 à 15:51
Dans mon appl est ce que je dois simuler tous les details
1-invite ->
2-trying <-
3-ringing ->
...
je dois crée mon appl le plus tot possible c'est pour ça que j mentionné JAIN SIP

donc mtn je vx le minimum et apres j'installerais mon serveur et je me documente plus en details.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
17 août 2011 à 15:59
Salut,

Bah oui, l'établissement d'un INVITE comprend les messages INVITE, TRYING, RINGING, OK (INVITE), BYE, etc...





------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
mokazo Messages postés 33 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 26 septembre 2011
17 août 2011 à 17:46
Ces requetes sont deja definies ou bien dois faire a chaque requete une fonction par ex void invite() ... ??.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
17 août 2011 à 19:32
Salut,


SIP contient beaucoups de champs qui ne sont pas uniques pour une session donnée (par session j'entends séquence de message INVITE, REGISTER etc...).

Certains champs sont optionnels en fonction du message (ex: le champ contact qui n'est pas obligatoire pour tous les messages (cas des réponses en erreur), le champs expires qui est uniquement obligatoire pour les champs REGISTER+SUBSCRIBE, etc...).

D'autres sont dynamiques et peuvent changer en cours de route comme par exemple le Via, le To dans le cas d'un RE-INVITE, etc...).

Le call-id qui change également en fonction des appels (comme le To), le Cseq qui change églement en fonction du séquencement des messages relatifs à l'appel (message INFO compris), etc...

Comme tu peux te douter apres coups tu vas devoir te faire une re-encapsulation (même minimalite) de l'API JAIN SIP qui te fournit plus un encodeur/decodeur de messages SIP qu'autre cho.se

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
mokazo Messages postés 33 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 26 septembre 2011
17 août 2011 à 19:43
Bon voila c le debut voila la class sipListener

public interface SipListener extends java.util.EventListener
{
public void processResponse(SipEvent responseReceivedEvent);
public void processRequest(SipEvent requestReceivedEvent);
public void processTimeOut(SipEvent transactionTimeoutEvent);
}

puis je cré le SipFactory


Code pour SIP User Agent

Create a SipFactory object instance
sipFactory = SipFactory.getInstance();
sipFactory.setPathName("gov.nist");

Creation de SIP Stack instance

try { sipStack = sipFactory.createSipStack();
} catch(SipPeerUnavailableException e) { System.exit(-1);}
catch(SipException e) { System.exit(-1); }

Suis je dans ka bonne voie???
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
17 août 2011 à 22:05
Salut,

Le mieux pour toi serait de suivre un tutos genre:
Le Getting Started de la page projet de jain sip, attention ici ils utilisent le message SIP MESSAGE donc pas de REGISTER ni d'INVITE, du coups c'est plus un exemple IM over SIP mais bon il y a quelques explications assez importantes.
en regardant sur google je suis également tombé sur ce Tutorial de SUN qui semble bien fait (je l'ai juste survolé).




------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
mokazo Messages postés 33 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 26 septembre 2011
19 août 2011 à 02:57
Bonjour
je me suis bien documenter sur SIP et aussi jain sip
mais le probleme c que je me suis perdu entre le sipStack sipListener sipURI ...
je compte juste envoyer des requetes invite mais en vain !!!!help
Merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
19 août 2011 à 07:14
Salut,

Pourtant... Bon on récap (grossièrement):
Le SipStack te permet d'encoder décoder les messages d'objets java vers SIP et inversement.
Le SipListener te permet de te mettre en écoute des différents messages SIP en provenance du réseau.
Le SipURI c'est un champ des messages SIP.

Tu n'arrives pas à faire d'invite, ok, mais avant même de parler d'invite, comment c'est passé la séquence de registre entre ton client et ton serveur ?



------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
mokazo Messages postés 33 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 26 septembre 2011
19 août 2011 à 15:47
ça montre que je suis loin est nul aussi disons que le combat sera rude !!!
Mon probleme c'est que j'ai pas une structure un plan pour mon code ça vx dire combien de classes dois je utiliser est ce que elles doivent implementer du SipListener ou Sip...!

je vx comprendre cmt utiliser la lib javax.sip.* !!!!
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
19 août 2011 à 16:38
Salut,

Je ne suis pas vraiment d'accord avec ça, dans un projet, plus vite tu te lances dans le code et plus vite tu fais de la merde, surtout quand il s'agit de téléphonie.

Dans un tout premiers temps ce qu'il te faut c'est maîtriser parfaitement les séquencements (INVITE, TRYING, RINGING, OK, ACK, BYE, etc...) et conditions(REGISTER) pour effectuer un invite en SIP.

Quand tu auras bien compris ça tu pourras commencer à penser à la structure du code qui sera légèrement plus claire (vu que tu sauras ce que tu veux).

Donc si on prend les bases :
L'enregistrement (cas simple) :
Client                                       Server
            REGISTER ttl:30sec
------------------------------------------------>
             200 Ok cseq REGISTER
<------------------------------------------------
Suite des REGISTER's toutes les 30sec
< - - - - - - - - - - - - - - - - - - - - - - - - >
Pour te désenregister :
            REGISTER ttl:0sec
------------------------------------------------>
             200 Ok cseq REGISTER
<------------------------------------------------


Déjà ici tu sais que dans ton automate tu dois avoir au moins un thread qui va gérer les REGISTER + REGISTER keepalive et ce indépendamment des modules de gestion des INVITE's
etc....

La conception d'un 'vrai' softphone/téléphone ne se limite pas à envoyer un simple message INVITE mais à créer un véritable automate d'appels avec gestions de tous les messages SIP (y compris les messages INFO en com. pour la DTMF en INFO (sinon faut la gérer dans le RTP (il y a 2 RFC pour la DTMF dans RTP)), les messages SUBSCRIBE/NOTIFY pour le suivit de correspondants, les messages OPTIONS, REFER, etc...).






------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
mokazo Messages postés 33 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 26 septembre 2011
20 août 2011 à 01:27
Salut vrmt vous m'aidiez bcp surtt le truc de thread qui me semble une tres bonne idée

J'ai meme une capture d"exemple Wireshark d'enregistrement d'un AE
c'est tres pratique et riche !!! voici ou j trouvé : http://www.architoip.com/entete-sip/#La_m%C3%A9thode_-_Les_requ%C3%AAtes



j'ai pas de souci avec sip et ces requêtes mais c'est juste le fait de l'appliquer a java qui me pose problème!!!!
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
20 août 2011 à 20:31
Salut,

Pourtant il n'y a rien de vraiment compliqué ô_O c'est surtout de l'assemblage d'objets en te basant sur la norme.

Tiens voici un sample code qui fait un 'simple' register (+keepalive) en mode non authentifié (pas de gestion du digest donc pas possible de le faire vers ippi.fr mais vers Asterisk ça devrait passer si il n'est pas configuré pour n'accepter que des register avec authentification).

import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Properties;
import java.util.Timer;
import java.util.TimerTask;

import javax.sip.DialogTerminatedEvent;
import javax.sip.IOExceptionEvent;
import javax.sip.ListeningPoint;
import javax.sip.RequestEvent;
import javax.sip.ResponseEvent;
import javax.sip.SipFactory;
import javax.sip.SipListener;
import javax.sip.SipProvider;
import javax.sip.SipStack;
import javax.sip.TimeoutEvent;
import javax.sip.TransactionTerminatedEvent;
import javax.sip.address.Address;
import javax.sip.address.AddressFactory;
import javax.sip.address.SipURI;
import javax.sip.header.CSeqHeader;
import javax.sip.header.CallIdHeader;
import javax.sip.header.ContactHeader;
import javax.sip.header.ExpiresHeader;
import javax.sip.header.FromHeader;
import javax.sip.header.HeaderFactory;
import javax.sip.header.MaxForwardsHeader;
import javax.sip.header.ToHeader;
import javax.sip.header.ViaHeader;
import javax.sip.message.MessageFactory;
import javax.sip.message.Request;
import javax.sip.message.Response;

public class RegistrerFactory implements SipListener {
/* De la config */
private static String	myip		= null;
private static String	myAlias		= "12345";
private static String	myDisplay	= "bob";
private static int	registerTTL	= 30;
private static int	sipport		= 5060;
private static String	protocol	= "udp";
private static String	domaine		= "192.168.0.19";
/* pour la gestion des register's */
private long		registerCSeq	= 0L;
/* pour la création des différents champs du register */
private HeaderFactory	headerFactory	= null;
private AddressFactory	addressFactory	= null;
private MessageFactory	messageFactory	= null;
private SipProvider	sipProvider	= null;
/* pour les registers periodiques */
private Timer		timer		= new Timer();


public static void main(String[] args) {
try {
RegistrerFactory rf = new RegistrerFactory();
rf.register(registerTTL);
} catch (Throwable e) {
e.printStackTrace();
}
}

public RegistrerFactory() throws Throwable {
myip = InetAddress.getLocalHost().getHostAddress();

/* Init de la stacks */
final SipFactory sfactory = SipFactory.getInstance();
sfactory.setPathName("gov.nist");
final Properties properties = new Properties();
properties.setProperty("javax.sip.IP_ADDRESS", myip);
properties.setProperty("javax.sip.STACK_NAME", "JainRegistration");
SipStack sipStack = sfactory.createSipStack(properties);
/* Creation des messages, headers, adresse... */
headerFactory = sfactory.createHeaderFactory();
addressFactory = sfactory.createAddressFactory();
messageFactory = sfactory.createMessageFactory();
/* on ecoute sur le 5060 en udp */
final ListeningPoint lp = sipStack.createListeningPoint(myip, sipport, protocol);
sipProvider = sipStack.createSipProvider(lp);
/* pour les messages du serveur et les controles */
sipProvider.addSipListener(this);
}

private void register(int ttl) throws Throwable {
/* preparation du header du champ from */
final SipURI from = addressFactory.createSipURI(myAlias, myip + ":" + sipport);
final Address fromNameAddress = addressFactory.createAddress(from);
fromNameAddress.setDisplayName(myDisplay);
final FromHeader fromHeader = headerFactory.createFromHeader(fromNameAddress, 				
"qwerty");

/* idem pour le header to ; pour le register from=to */
final SipURI toAddress = addressFactory.createSipURI(myAlias, domaine);
final Address toNameAddress = addressFactory.createAddress(toAddress);
toNameAddress.setDisplayName(myAlias);
final ToHeader toHeader = headerFactory.createToHeader(toNameAddress, null);

/* preparation du via */
final ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
final ViaHeader viaHeader = headerFactory.createViaHeader(myip, sipport,
 protocol, "branch1");
viaHeaders.add(viaHeader);

/* generation d'un nouveau callid */
final CallIdHeader callIdHeader = sipProvider.getNewCallId();
/* preparation du CSeq et incrémentation pour le prochain */
final CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(++registerCSeq,
 Request.REGISTER);
/* Nombre maxi de forward authorisés */
final MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70);
/* URI de la requete */
final SipURI requestURI = addressFactory.createSipURI(myAlias, domaine);
requestURI.setTransportParam(protocol);
/* Creation de la requete de type REGISTER */
final Request request = messageFactory.createRequest(
requestURI, Request.REGISTER, callIdHeader, cSeqHeader,
fromHeader, toHeader, viaHeaders, maxForwards);
/* preparation du champ contact */
final SipURI contactURI = addressFactory.createSipURI(myAlias, myip);
contactURI.setPort(sipport);
final Address contactAddress = addressFactory.createAddress(contactURI);
contactAddress.setDisplayName(myDisplay);
final ContactHeader contactHeader = headerFactory.createContactHeader(contactAddress);
request.addHeader(contactHeader);
/* preparation du champ expires */
final ExpiresHeader expires = headerFactory.createExpiresHeader(ttl);
request.addHeader(expires);
/* Pas besoin de continuer */
if(ttl == 0) timer.cancel();
/* on envoi la requete */
sipProvider.sendRequest(request);
}

/* 
 * equivalent de la macro C __func__
 */
private String getMethod() {
return new Throwable().getStackTrace()[1].getMethodName() + " ";
}

@Override
public void processDialogTerminated(final DialogTerminatedEvent evt) {
System.out.println(getMethod());
}

@Override
public void processIOException(final IOExceptionEvent evt) {
System.out.println(getMethod());
}

@Override
public void processRequest(final RequestEvent evt) {
System.out.println(getMethod());
}

@Override
public void processResponse(final ResponseEvent evt) {
System.out.println(getMethod());
final Response response = evt.getResponse();
final int status = response.getStatusCode();
final CSeqHeader cseq = (CSeqHeader) response.getHeader("CSeq");
/* Reponse au REGISTER */
if (cseq.getMethod().equals(Request.REGISTER)) {
if (status == Response.OK) { // Success!
System.out.println("Registration success");
final TimerTask task = new TimerTask() {
@Override
public void run() {
try {
register(registerTTL);
} catch (final Throwable e) {
e.printStackTrace();
}
}
};
System.out.println("Restart in " + registerTTL + " sec. " +
(registerTTL * 1000) + " ms.");
timer.schedule(task, registerTTL * 1000);
return;
} 
/* le serveur ne veut pas de nous */
System.out.println("Registration failure with status: " + status
+ " and reason: " + response.getReasonPhrase());
}
}

@Override
public void processTimeout(final TimeoutEvent evt) {
System.out.println(getMethod());
}

@Override
public void processTransactionTerminated(final TransactionTerminatedEvent evt) {
System.out.println(getMethod());
}
}




Maintenant si ce qui te pose le plus de problèmes c'est le coté java... je ne peux pas grand choses pour toi...


------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
mokazo Messages postés 33 Date d'inscription vendredi 30 mai 2008 Statut Membre Dernière intervention 26 septembre 2011
21 août 2011 à 00:44
je te rappelle que c un forum en java j'ai pas besoin du code source je vx comprendre le mecanisme!!! et Merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
21 août 2011 à 01:02
Bah quoi pas besoin de prendre la mouche, tu dis :

j'ai pas de souci avec sip et ces requêtes mais c'est juste le fait de l'appliquer a java qui me pose problème!!!!

Je te donne juste un code d'exemple avec la base (le REGISTER) et j'explique les étapes (cf les commentaires), je peux difficilement faire mieux.
Pour ce qui est du mécanisme le lien avec le pdf que je t'ai passé l'illustre bien, maintenant si il y a des choses qui t’échappe dedans c'est une autre histoire et , bah... lance toi, dit ce que tu comprends pas.



------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
Rejoignez-nous