4

我目前有一个与 Jain-SIP 合作的 SIP 注册。

我得到了挑战,在 nonce 等上使用 MD5 并发送我的回复。

然后我收到 200 OK 消息。

所以这一切都很好。

但是,我想根据到期时间每 X 秒自动重新注册一次。

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

然而,它会导致几个问题:

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

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


源代码 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();
    }

更新:

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

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

有没有人有任何想法?

4

3 回答 3

3

//掌心!!!!!!

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

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

于 2010-02-12T15:10:16.690 回答
2

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

拳头,在您发送第一个注册请求后调用 getNewCallId,看看一切都很好。

callIdHeader = sipProvider.getNewCallId();

或者可能会尝试转移

inviteTid = sipProvider.getNewClientTransaction(request);

在新的重新注册请求中的 getNewCallId 之前,以验证 sipProvider 对象是否可用。

我所说的不过是基本的调试风格。

于 2010-02-11T11:16:12.150 回答
1

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

  • 初始化服务提供者
  • 发出第一个注册请求。
  • 一旦您收到 200 OK - 检索过期字段并根据该过期值启动计时器。
  • 一旦计时器被触发发送一个新的注册请求 - 不要再次初始化服务提供者。(您可以再次检查 sipProvider 指针是否为 NON NULL)。
于 2010-02-11T05:41:59.653 回答