将 SIPREC 转发到另一个 SBC?

问题描述 投票:0回答:1

我不知道这是否可能,但我需要接受来自 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 ***

sip sip-server dmz
1个回答
0
投票

要处理 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 要求,同时仅在明确触发时转接呼叫。

© www.soinside.com 2019 - 2024. All rights reserved.