1

私は現在、mobicents (Tomcat での sip サーブレットの実装) を基礎として使用して、sip を使用した通信システムを開発しています。私は通知サービスを実装しようとしました。ここで、UA は定期的に Notify を介して Status-Info を取得するためにサブスクライブできます。RFC3265「特定のイベント通知」で読んだように、サブスクリプションの NOTIFY メッセージは、サブスクライブ ダイアログに属しているため、同じ Call-ID を持っている必要があります。

問題: 新しいリクエストが現在のダイアログに属していることをサーブレットコンテナに伝える方法がわからないため、同じ Call-ID で NOTIFY を作成する際に問題が発生しました。これは私がテストのために試みたものです:

public void doSubscribe(SipServletRequest request){
    try{
        //Get Session
        SipApplicationSession session = request.getApplicationSession();

        //Send response
        SipServletResponse response = request.createResponse(SipServletResponse.SC_OK);
        response.setExpires(600);
        response.setHeader("Event", "buddylist");
        response.send();

        //Send notify (same call-id!!!)
        Address serverAddress = this.sipFactory.createAddress("sip:server@test.com");
        SipServletRequest newRequest  = sipFactory.createRequest(session, "NOTIFY", serverAddress, request.getFrom());
        newRequest.setHeader("Subscription-State", "active;expires=600");
        newRequest.setHeader("Event", "buddylist");
        newRequest.send();
    } catch(Exception e){
        e.printStackTrace();
    }       
}

同じセッションを追加するとうまくいくと思いましたが、そうではありません。誰もこれを正しく行う方法を知っていますか?

4

1 に答える 1

1

かなり時間がかかりましたが、私は自分でそれを理解しました。SipFactory と SipApplicationSession の組み合わせによる新しいリクエストの作成を誤解しているようです。

私の現在の視点 (今回は正しいことを願っています): SipFactory は、完全な新しいダイアログの最初の要求を作成するために使用され、新しいダイアログに対してのみ使用されます。一方、SipApplicationSession は、新しいセッションごとにセッション オブジェクトを格納するコンテナにすぎません。つまり、上記のコードは、着信 SUBSCRIBE-Request! によって作成された SipSession から独立した SipApplicationSession-Container に 2 番目の SipSession を作成したことを意味します。既存のダイアログでリクエストを作成するには、SipSession-Object 自体を使用する必要があります。

    public void doSubscribe(SipServletRequest request){
        try{
            //Get !!!SipSession
            SipSession sipSession = request.getSession();

            //Send response
            SipServletResponse response = request.createResponse(SipServletResponse.SC_OK);
            response.setExpires(600);
            response.setHeader("Event", "buddylist");
            response.send();

            //Send notify (same call-id!!!)
            SipServletRequest newRequest  = sipSession.createRequest("NOTIFY");
            newRequest.setHeader("Subscription-State", "active;expires=600");
            newRequest.setHeader("Event", "buddylist");
            newRequest.send();
         } catch(Exception e){
            e.printStackTrace();
         }       
   }

結局、解決策は簡単でした。しかし、このようなことを理解するのに役立つ例やドキュメントはあまりありません。したがって、これが私と同じ問題に直面しているすべての人に役立つことを願っています。

于 2013-03-19T16:59:30.363 に答える