4

私は現在、Jain-SIP で適切に機能する SIP 登録を行っています。

私は挑戦を受け、ノンスなどで MD5 を使用し、返信を送信します。

その後、200 OK メッセージが表示されます。

それで、すべて問題ありません。

ただし、有効期限に応じて X 秒ごとに自動的に再登録したいと考えています。

これを行うために、タイマーを使用して X 秒ごとにコードを再実行しようとしました。

ただし、いくつかの問題が発生します。

SipProvider は既にアタッチされており、2 回目は実行されません。または、リクエストが既に送信されているというエラーが表示されます。

それで、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() メソッドと同じように新しいメソッドを作成し続け、同じ Call Id を保持し、ポート番号の設定をハードコードすると、このようないくつかのメッセージを送信できることがわかりました (ループではありません)。

したがって、登録コードの何かを変更して、毎回送信される NEW 要求またはそのようなものであることを確認する必要がありますか?

誰にもアイデアはありますか?

4

3 に答える 3

3

//フェイスパーム!!!!!

エラーは、SipProvider がアクティビティ (Android) にアタッチされ、コードに super.finish() があり、間違ったタイミングでアクティビティを強制終了したため、登録はまだ試行されましたが、アクティビティがなくなったため、sip プロバイダーはコンテキストを失いました。

お時間をいただきありがとうございます。

于 2010-02-12T15:10:16.690 に答える
2

さて、私はこのことを分析するのにかなりの時間を費やしました. そして、本当に私たちは何が間違っているのかわかりませんか? 私にはすべてがうまく見えます。Init / Send Register / Start a Timer and on Timer expiry - 再び登録要求を送信します。また、sipProvider はグローバル オブジェクトのようです。デバッグ目的のためだけに、次の2つのことを実行できますか

最初に、最初の登録要求を送信した直後に getNewCallId を呼び出して、すべてが正常であることを確認します。

callIdHeader = sipProvider.getNewCallId();

またはシフトしようとするかもしれません

inviteTid = sipProvider.getNewClientTransaction(request);

新しい再登録要求の getNewCallId の前に、sipProvider オブジェクトが使用可能であることを確認します。

私が言っているのはデバッグの初歩的なスタイルに他なりません。

于 2010-02-11T11:16:12.150 に答える
1

新しい登録要求を送信するたびに、サービス プロバイダーを初期化する必要はありません。従うべきことをお勧めする手順を次に示します。

  • サービス プロバイダーの初期化
  • 最初の登録要求を送信します。
  • 200 OK を受け取ったら、Expires フィールドを取得し、その値に基づいてタイマーを開始します。
  • タイマーが起動したら、新しい登録要求を送信します。サービス プロバイダーを再度初期化しないでください。(NON NULL の sipProvider ポインターをもう一度確認できます)。
于 2010-02-11T05:41:59.653 に答える