如何正确注册sip服务器?

时间:2010-02-10 16:39:19

标签: java registration sip jain-sip

我目前正在与Jain-SIP合作进行SIP注册。

我接受了挑战,在nonce等上使用MD5并发送回复。

然后我收到200 OK消息。

所以这一切都很好。

但是我希望每隔X秒自动重新注册一次,具体取决于过期时间。

为此,我尝试使用计时器每隔X秒重新运行一次代码。

然而,它会导致一些问题:

SipProvider已经附加,不会再次运行。 要么 我收到一条错误消息,说已经发送了请求。

所以我想知道是否有人建议每隔X秒如何最好地重新注册服务器?如同采取的推荐步骤一样?


源代码     public void register()抛出异常{

    // 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();
    }

更新:

所以我认为如果我继续创建与register()方法相同的新方法并保持相同的Call Id和硬编码端口号的设置我可以发送一些这样的消息(不在循环)。

所以我必须在我的注册码中更改一些内容,以确保每次都发送一个新的请求或类似的东西?

有没有人有任何想法?

3 个答案:

答案 0 :(得分:3)

// Face Palm !!!!!

错误是SipProvider附加到Activity(Android)并且我在代码中有super.finish(),它在错误的时间杀死了活动,因此注册仍然尝试但活动已经消失所以sip提供程序丢失了上下文。

感谢您的时间calvinscorner,非常感谢

答案 1 :(得分:2)

好的,我花了很多时间分析这些东西。我真的不知道我们做错了什么?一切看起来都很好。初始化/发送寄存器/启动定时器和定时器到期 - 再次发送寄存器请求。似乎sipProvider也是一个全局对象。你是否只是为了调试目的而执行以下两件事

Fist,刚发送第一个Register请求后调用getNewCallId,看看一切正常。

callIdHeader = sipProvider.getNewCallId();

或者可能会尝试转移

inviteTid = sipProvider.getNewClientTransaction(request);

在新的重新注册请求之前的getNewCallId之前,可以使用sipProvider对象来实现。

我所说的只不过是基本的调试方式。

答案 2 :(得分:1)

每次要发送新的注册请求时,都不需要初始化服务提供者。以下是我建议您应遵循的步骤。

  • 初始化服务提供商
  • 发出首次注册请求。
  • 一旦收到200 OK - 检索到期字段并根据该到期值启动计时器。
  • 一旦计时器被触发,发送一个新的注册请求 - 不要再次初始化服务提供商。 (您可以再次检查sipProvider指针是否为NON NULL)。
相关问题