我不知道这是否可能,但我需要接受来自 Oracle Occas 中的 CORE SBC 的 SIPREC 邀请,然后稍后转发/代理/重新邀请(无论如何)我们的 DMZ SBC。
SBC -> Occas(仅在用户触发时发送到 DMZ)-> DMZ-SBC -> 第三方。
原邀请函
处理邀请 - 确认 - 返回非活动状态。
@Override
protected void doInvite(SipServletRequest request) throws ServletException, IOException {
// Handle the INVITE from SBC (Act as UAS for this SIP dialog)
SipSession incomingSession = request.getSession();
// Respond to the SBC with 200 OK (terminate the dialog as a UAS)
String sdpResponse = "v=0\r\n" +
"o=- 13760799956958020 13760799956958020 IN IP4 1.1.1.1\r\n" +
"s=-\r\n" +
"c=IN IP4 1.1.1.1\r\n" +
"t=0 0\r\n" +
"m=audio 49170 RTP/AVP 0\r\n" +
"a=sendrecv\r\n"; // Media attributes for SBC
SipServletResponse response = request.createResponse(200);
response.setContent(sdpResponse, "application/sdp");
response.send();
}
要触发的休息端点: 我正在尝试使用原始 SDP 向下一个 sbc 发送请求。
SipServletRequest originalInvite = RequestService.requests.get(callId);
String originalContent = RequestService.content.get(callId);
if (originalInvite == null) {
return Response.status(Response.Status.NOT_FOUND).entity("Original INVITE not found for Call-ID: " + callId).build();
}
SipSession applicationSession = originalInvite.getSession();
SipURI sipURIPrimary = sipFactory.createSipURI(null, ipAddress);
sipURIPrimary.setTransportParam("tcp");
sipURIPrimary.setPort(5060);
Address nextSbc= sipFactory.createAddress(sipURIPrimary);
SipServletRequest newInvite = sipFactory.createRequest(
applicationSession.getApplicationSession(),
"INVITE",
originalInvite.getSession().getLocalParty(),
nextSbc);
newInvite.setRequestURI(sipURIPrimary);
newInvite.setHeader("required", "siprec");
newInvite.setContent(originalContent, originalInvite.getContentType());
newInvite.send();
return Response.ok("Request Sent").build();
回应: SIP/2.0 400 错误请求 - 联系人标头中缺少 SRC 功能标记
Error : SIP/2.0 400 Bad Request - SRC feature tag missing in contact header
Content-Length: 0
CSeq: 1 INVITE
Call-ID: jfkldsjflkdsfjdlsfkjsdlf
From: <sip:<OCCAS>:5070;transport=tcp>;tag=dsdasas
To: <sip:<DMZ>:5060;transport=tcp>;tag=ffffffff
Via: SIP/2.0/TCP <OCCAS>:5070;wlsscid=-dsdsadsadasd;branch=dsdsadsadsa
据我了解,我根本无法修改联系人标题。
原始样本邀请
INVITE sip:<phoneNumber>@<OCCAS>:5070 SIP/2.0
Via: SIP/2.0/TCP 1.1.1.1:5060;branch=56456464456
From: sip:[email protected];tag=45645464546
To: <sip:<OCCAS>:5070;transport=tcp>
Call-ID: dshdkhsadkashdj@<OCCAS>
CSeq: 123456 INVITE
Contact: <sip:[email protected]:5060;transport=tcp>;+sip.src
Max-Forwards: 70
Require: siprec
Content-Type: multipart/mixed; boundary=unique-boundary-1
Content-Length: 3081
MIME-Version: 1.0
*** SDP ***
要处理 SIPREC INVITE 请求并仅在触发时将其转发到 DMZ SBC,您可以使用两步方法。首先,通过响应 200 OK 和不活动的 SDP 来接受来自 OCCAS 中的 CORE SBC 的初始 INVITE,以保持会话处于活动状态。存储 INVITE 及其 SDP 内容以供以后使用。当用户触发转发时,创建一个新的 INVITE 到 DMZ SBC。确保新的 INVITE 包含原始 SDP 和带有所需 +sip.src 功能标记的 Contact 标头,该标记可以使用 SIP servlet API 进行设置。发送新的 INVITE 并处理来自 DMZ SBC 的响应,始终保持 SIP 会话状态。这种方法可确保您满足 SIPREC 要求,同时仅在明确触发时转接呼叫。