gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:45:00 27 4
gpt4 key购买 nike

我目前正在开发一个 sip 通信系统,使用 mobicents(tomcat 上的 sip-servlet 实现)作为基础。我尝试实现一个通知服务,UA 可以不时通过 Notify 订阅获取状态信息。正如我在 RFC3265-“特定事件通知”中读到的那样,订阅的 NOTIFY 消息必须具有相同的 Call-ID,因为它们属于订阅对话框。

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

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

我以为添加相同的 session 就可以完成这项工作,但事实并非如此。有谁知道如何正确执行此操作?

最佳答案

花了很长时间,但我自己弄清楚了。看来我误解了通过 SipFactory 结合 SipApplicationSession 创建新请求。

我目前的观点(希望这次是正确的):SipFactory 用于为完整的新对话创建初始请求,并且仅针对新对话。而 SipApplicationSession 只是一个容器,它存储每个新 session 的 session 对象。这意味着,上面的代码在 SipApplicationSession-Container 中创建了第二个 SipSession,它独立于传入的 SUBSCRIBE-Request 创建的 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();
}
}

最终解决方案很简单。但帮助您理解此类内容的示例或文档较少。因此我希望这可以帮助每个和我面临同样问题的人。

关于java - SIP Mobicents - 如何在现有对话框中创建新请求? (相同的调用 ID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15454522/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com