How can I re-register with the sip server correctly?

I currently have SIP registration working with Jain-SIP.

I get a call, use MD5 on nonce, etc. and send my answer.

Then I get a 200 OK message.

So everything is fine.

However, I want to automatically re-register every X seconds depending on the expiration time.

To do this, I tried using a timer to re-run the code every X seconds.

However, this leads to two problems:

SipProvider is already connected and will not start a second time. Or I get a message that the request has already been sent.

So, I was wondering if anyone has any tips on how best to re-register with the server every X seconds? How are the recommended steps to take?


Source code   public void register () 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();
    }

UPDATE:

So, I realized that if I continue to create new methods in the same way as the register () method, and keep the same call identifier and hard code as the port number, I can send several of these messages (not in the loop).

So I need to change something in my register code to make sure that this is a new request sent each time or something like that?

Does anyone have any ideas?

+3
source share
3 answers

// Face Palm !!!!!

, SipProvider Activity (Android), super.finish() , , , , sip .

calvinscorner,

+3

, . , , ? . Init/Send Register/ . . , sipProvider . .

Fist, Invoke getNewCallId , .

callIdHeader = sipProvider.getNewCallId();

inviteTid = sipProvider.getNewClientTransaction(request);

getNewCallId Re-register requst, sipProvider.

, , , .

+2

, . , .

  • .
  • , 200 OK - .
  • , - . ( sipProvider NON NULL).
+1

Source: https://habr.com/ru/post/1732214/


All Articles