Merci bcp Twinuts ça montre que vous maitrisez bien les choses concernant JAIN SIP
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionL'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 <------------------------------------------------
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()); } }
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!!!!