关于此任务
B2BUA 是一个会话启动协议 (SIP) 应用程序,它包含在 SIP 调用中,用于转发两个或更多 SIP
对话之间的请求和响应。典型 B2BUA 应用程序管理两个用户代理之间的 SIP 会话。但是,B2BUA
应用程序还可处理更复杂的场景,在这些场景中,它需要管理来自下游派生的不同分支的响应。请求拆分为不同分支及消息从用户代理客户机转发至用户代理服务器时,发生下游派生。
B2buaHelper
类包含用于创建这类 B2BUA 应用程序的所有必需方法。
B2buaHelper 类的行为及用于创建新请求的规则是在 JSR289 规范第 12.2 节中定义的。可使用
B2buaHelper 类函数来链接 SIP 背靠背用户代理呼叫的两个分支:入局呼叫分支和出局呼叫分支。
- 通过调用 SipServletRequest.getB2buaHelper() 方法来检索 B2buaHelper 实例。
- 检索此实例后,可通过调用 B2buaHelper.createRequest() 来创建新的 SIP 请求。
private void doInvite(SipServletRequest req) {
B2buaHelper b2buaHelper = req.getB2buaHelper();
SipServletRequest newRequest = b2buaHelper.createRequest(req, true, headerMap);
}
所创建的 newRequest 与在此方法的第一个参数中作为原始请求提供的 SipServletRequest
req 完全相同。Boolean 参数指示是否已链接原始请求 req 和 newRequest。headerMap 提供要在 newRequest 中覆盖的非系统头的映射。
- 确保已链接两个分支。如果调用 createRequest 方法时指定了 false 属性,那么可通过调用以下项以显式链接 SIP 会话:
B2buaHelper.linkSipSessions(session1, session2)
- 链接 SIP 会话和 SIP 请求后,可通过调用以下项来检索所链接会话:
SipSession linkedSession = B2buaHelper.getLinkedSession(req.getSession());
注: 在 B2BUA 派生场景中,该应用程序创建多个 SIP 请求,所以不会链接所有 SIP 会话。必须显式链接这些会话。
- 从用户代理服务器 (UAS) 接收响应后,创建针对其分支的响应。进行检查以确定响应上是否存在所链接会话,如果存在,请使用所链接请求创建针对用户代理客户机 (UAC) 的响应。
SipServletRequest linked = b2bHelper.getLinkedSipServletRequest(resp.getRequest());
linked.createResponse(resp.getStatus(),resp.getReasonPhrase()).send();
如果没有与响应相关联的所链接会话,那么该应用程序需要调用 B2buaHelper.createResponseToOriginalRequest
并创建新的派生会话,此会话是与原始请求相关联的 SipSession 的副本。
注: JSR289 规范第 12.5 节提供一种方法以创建针对原始请求的多个成功响应。如果有多个 SipSession
与原始 INVITE 消息相关联,并且需要将多个成功响应发送至 INVITE 消息,请使用 B2buaHelper.createResponseToOriginalRequest 方法。
- 如果使用 createResponseToOriginalRequest 方法,请确保已链接两个分支。应用程序负责将新的派生会话链接至其配对会话,以便它可检索所链接会话以发送与其相关的后续响应。