0

我正在使用SS7 堆栈接收 IDP 数据包并使用新对话框转发到核心。

我能够使用以下代码成功转发请求:

@Override
public void onInitialDPRequest(InitialDPRequest arg0) {

    try {
        String refId = StringUtility.createRefId("sc");
        logger.info("[" + refId + "] IDP Recieved");
        String outgoingGTDigits = "92308985051";
        int calledSSN = 146;
        int remotePC = 3003;

        SccpAddress remoteAddress = MapUtilities.getSccpAddress(RoutingIndicator.ROUTING_BASED_ON_GLOBAL_TITLE, outgoingGTDigits, calledSSN, remotePC);
        arg0.getCAPDialog().setRemoteAddress(remoteAddress);
        logger.debug("[" + refId + "] Forwading to Core with remoteAddress [" + remoteAddress + "]");

        InitialDPRequestImpl initialDPRequestImpl = (InitialDPRequestImpl) arg0;

        Invoke invoke = SCCPProxy.tcapStack_cap.getProvider().getComponentPrimitiveFactory()
            .createTCInvokeRequest(InvokeClass.Class2);
        invoke.setTimeout(_Timer_CircuitSwitchedCallControl_Short);

        OperationCode oc = SCCPProxy.tcapStack_cap.getProvider().getComponentPrimitiveFactory().createOperationCode();
        oc.setLocalOperationCode((long) CAPOperationCode.initialDP);

        AsnOutputStream aos = new AsnOutputStream();
        initialDPRequestImpl.encodeData(aos);

        Parameter p = SCCPProxy.tcapStack_cap.getProvider().getComponentPrimitiveFactory().createParameter();
        p.setTagClass(initialDPRequestImpl.getTagClass());
        p.setPrimitive(initialDPRequestImpl.getIsPrimitive());
        p.setTag(initialDPRequestImpl.getTag());
        p.setData(aos.toByteArray());
        invoke.setParameter(p);
        invoke.setOperationCode(oc);

        // Create a new dialog
        Dialog clientDialog = SCCPProxy.tcapStack_cap.getProvider().getNewDialog(arg0.getCAPDialog().getLocalAddress(), remoteAddress);
        invoke.setInvokeId(clientDialog.getLocalDialogId());

        clientDialog.sendComponent(invoke);
        logger.debug("[" + refId + "] set invoke id " + clientDialog.getLocalDialogId());
        //long[] _ACN_ = new long[]{0, 4, 0, 0, 1, 0, 19, 2};
        ApplicationContextName acn = SCCPProxy.tcapStack_cap.getProvider().getDialogPrimitiveFactory()
            .createApplicationContextName(arg0.getCAPDialog().getApplicationContext().getOID());
        // Create begin request
        TCBeginRequest tcbr = SCCPProxy.tcapStack_cap.getProvider().getDialogPrimitiveFactory().createBegin(clientDialog);
        tcbr.setApplicationContextName(acn);

        clientDialog.send(tcbr);
        logger.info("[" + refId + "] Forwaded to core with id: " + clientDialog.getLocalDialogId());
    } catch (Exception ex) {
        logger.error("Exception: ", ex);
    }

}

TCP转储

在此处输入图像描述

现在,当核心节点回复此数据包(数据包#3)时。我在 sigtran 日志中收到CAP Dialog not found for Dialog Id n 。

SIGTRAN 日志

SIGTRA日志

我是否正确转发数据包?

4

2 回答 2

0

通过进行以下更改,我能够转发数据包并获得回复而没有任何问题:

  1. 必须像这样创建新对话框
CAPDialogCircuitSwitchedCall capDialog = capProvider.getCAPServiceCircuitSwitchedCall().createNewDialog(arg0
      .getCAPDialog().getApplicationContext(), proxyOwnAddress, destinationAddress, arg0.getCAPDialog().getRemoteDialogId());
  1. 从原始对话框复制有效负载并放入新对话框

capDialog.addInitialDPRequest((int) arg0.getInvokeId(), arg0.getServiceKey(), arg0.getCalledPartyNumber(), arg0.getCallingPartyNumber(), arg0.getCallingPartysCategory(), arg0.getCGEncountered(), arg0.getIPSSPCapabilities(), arg0 .getLocationNumber(), arg0.getOriginalCalledPartyID(), arg0.getExtensions(), arg0 .getHighLayerCompatibility(), arg0.getAdditionalCallingPartyNumber(), arg0.getBearerCapability(), arg0.getEventTypeBCSM(), arg0 .getRedirectingPartyID(), arg0.getRedirectionInformation ()、arg0.getCause()、arg0.getServiceInteractionIndicatorsTwo()、arg0.getCarrier()、arg0.getCugIndex()、arg0.getCugInterlock()、arg0.getCugOutgoingAccess()、arg0.getIMSI()、arg0.getSubscriberState() , arg0 .getLocationInformation(), arg0.getExtBasicServiceCode(), arg0.getCallReferenceNumber(), arg0.getMscAddress(), arg0。getCalledPartyBCDNumber(), arg0.getTimeAndTimezone(), arg0.getCallForwardingSSPending(), arg0.getInitialDPArgExtension());

  1. 保存并转发新对话框

dialogHashMap .put(capDialog.getLocalDialogId(), arg0.getCAPDialog()); capDialog.setReturnMessageOnError(true);

capDialog.send();
logger.info("[" + refId + "] 使用 id 转发:" + capDialog.getLocalDialogId());

  1. 检索和回复所以现在当我收到来自核心的回复时。我只需要使用本地 dialogId 从dialogHashMap检索原始对话框并回复
于 2022-02-23T07:41:30.310 回答
0

这有点复杂。我可能会假设您想在同一个 Sbb 中处理所有内容。

  1. 当您创建一个新的 capDialog(在您的情况下为 clientDialog)时,它使用新的 TCAP otid 和 dtid 创建。因此,即使您收到关于新 capDialog 的响应,您也必须将其与原始 capDialog 相关联。
  2. Sbb 只知道初始事件中的 ActivityContext,因为您没有将 sbbLocalObject 附加到新的 ActivityContext。
  3. 对于此类任务,最好使用 Parent->Child 架构。Parent Sbb 处理所有原始对话事件。Child Sbb 创建新对话框,将 sbbLocalObject 附加到新的 ActivityContext 并处理新对话框的所有相关事件。
于 2021-06-15T14:20:50.073 回答