J'ai actuellement un enregistrement SIP fonctionnant correctement avec Jain-SIP. Je reçois le défi, utilise MD5 sur le nonce etc et envoie ma réponse.Comment puis-je réenregistrer un serveur SIP correctement?
Je reçois alors le message 200 OK.
Donc tout va bien.
Cependant je veux réenregistrer automatiquement toutes les X secondes en fonction de l'heure d'expiration.
Pour ce faire, j'ai essayé d'utiliser une minuterie pour réexécuter le code toutes les X secondes.
Cependant, il conduit à deux problèmes:
Le SipProvider est déjà attaché et exécuter wont une deuxième fois. Ou Je reçois une erreur indiquant que la demande a déjà été envoyée.
Alors je me demandais si quelqu'un avait des conseils sur la meilleure façon de se réenregistrer avec le serveur toutes les X secondes? Comme dans les étapes recommandées à prendre?
code source registre public void() throws Exception {
// all this into a create request method
String fromName = "xxxxxxxx";
String fromSipAddress = "sip.network.com";
String toSipAddress = "sip.network.com";
String toUser = "xxxxxxxx";
SipURI fromAddress = addressFactory.createSipURI(fromName,
fromSipAddress);
Address fromNameAddress = addressFactory.createAddress(fromAddress);
FromHeader fromHeader = headerFactory.createFromHeader(
fromNameAddress, null);
SipURI toAddress = addressFactory
.createSipURI(toUser, toSipAddress);
Address toNameAddress = addressFactory.createAddress(toAddress);
ToHeader toHeader = headerFactory.createToHeader(toNameAddress,
null);
URI requestURI = addressFactory.createURI(
"sip:" + "sip.network.com");
List<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
String ipAddress = lp.getIPAddress();
ViaHeader viaHeader = headerFactory.createViaHeader(ipAddress,
lp.getPort(),
lp.getTransport(), null);
viaHeaders.add(viaHeader);
CallIdHeader callIdHeader = sipProvider.getNewCallId();
CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1L,
Request.REGISTER);
MaxForwardsHeader maxForwards = headerFactory
.createMaxForwardsHeader(70);
Request request = messageFactory.createRequest(requestURI,
Request.REGISTER, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
SipURI contactUrl = addressFactory.createSipURI(fromName, fromSipAddress);
contactUrl.setPort(8002);
contactUrl.setLrParam();
SipURI contactURI = addressFactory.createSipURI(fromName, "sip.network.com");
contactURI.setPort(sipProvider.getListeningPoint(lp.getTransport())
.getPort());
Address contactAddress = addressFactory.createAddress(contactURI);
contactHeader = headerFactory.createContactHeader(contactAddress);
request.addHeader(contactHeader);
Header extensionHeader = headerFactory.createHeader("Expires",
"120");
request.addHeader(extensionHeader);
inviteTid = sipProvider.getNewClientTransaction(request);
inviteTid.sendRequest();
Log.d("AFTERSENDREQUEST", "SipProvider = : " + sipProvider.toString());
Log.d("INVITETID", "inviteTid = " + inviteTid.getState());
dialog = inviteTid.getDialog();
}
public void processResponse(ResponseEvent responseEvent) {
Message message = Message.obtain();
message.obj = "received response "+responseEvent.getResponse();
handler.sendMessage(message);
Response response = (Response) responseEvent.getResponse();
ClientTransaction tid = responseEvent.getClientTransaction();
CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
if (response.getStatusCode() == Response.UNAUTHORIZED){
try {
createAuthReply(authHeader, callid);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
MISE À JOUR:
J'ai donc pensé que si je continue à créer de nouvelles méthodes les mêmes que le registre() Méthode et garder le même identifiant d'appel et le code de la configuration du numéro de port, je peux envoyer quelques messages comme celui-ci (pas en boucle).
Je dois donc changer quelque chose dans mon code de registre pour m'assurer que c'est une NOUVELLE demande envoyée à chaque fois ou quelque chose comme ça?
Quelqu'un a-t-il des idées?
J'ai essayé de faire cela, mais lorsque je tente de réinscrire je reçois cette erreur java.lang.NullPointerException gov.nist.javax.sip.SipProviderImpl.getNewCallId (SipProviderImpl.java:230) –
Avez-vous une référence correcte de sipProvider pour initier sipProvider.getNewClientTransaction (request); ? Où perdez-vous cette référence? – calvinscorner
J'ai ajouté plus de code ci-dessus, donc j'ai le init() pour configurer le SipProvider, puis le registre est créé et envoyé et je reçois 401 défi UnAuth, je réponds avec la réponse et obtenir 200 OK. Je réessaie alors de me réenregistrer mais quand j'essaye encore le getNewCAllId() jette une exception de pointeur nul –