SIP Mobicents - 如何在现有对话框中创建新请求? (相同的呼叫ID)

时间:2013-03-16 20:44:32

标签: java sip

我目前正在开发一个带有sip的通信系统,使用mobicents(在tomcat上实现sip-servlet)作为基础。我尝试实现Notification-Service,其中UAs可以订阅通过Notify不时获取Status-Info。正如我在RFC3265-“特定事件通知”中所读,订阅的NOTIFY-Messages必须具有相同的Call-ID,因为它们属于Subscribe-Dialog。

问题:现在我在使用相同的Call-ID创建NOTIFY时遇到问题,因为我不知道如何告诉servlet-container新请求属于当前对话框。 这是我尝试测试的:

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

我认为添加相同的会话可以完成这项工作,但事实并非如此。有谁知道如何做到这一点?

1 个答案:

答案 0 :(得分:1)

花了很长时间,但我自己想出来了。好像我误解了通过SipFactory结合SipApplicationSession创建新请求。

我目前的观点(希望这次是正确的): SipFactory用于为完整的新Dialog创建初始请求,并且仅用于新的Dialog。而SipApplicationSession只是一个Container,它存储每个新Session的Session-Objects。 这意味着,上面的代码在SipApplicationSession-Container中创建了第二个SipSession,它独立于SipSession,它是由收到的SUBSCRIBE-Request创建的! 要在现有对话框中创建请求,您必须使用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();
         }       
   }

最后解决方案很简单。但是有更少的示例或文档可以帮助您理解这样的事情。因此,我希望这能帮助每个人面对与我相同的问题。