【问题标题】:CAP Dialog not found for Dialog Id未找到对话 ID 的 CAP 对话
【发布时间】:2022-02-23 15:41:30
【问题描述】:

我正在使用 SS7 Stack 接收 IDP 数据包并使用新对话框转发到 core

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

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

}

TCPDump

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

Sigtran 日志

我是否正确转发数据包?

【问题讨论】:

    标签: mobicents


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      通过进行以下更改,我能够毫无问题地转发数据包并获得回复:

      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 检索原始对话框并回复

      【讨论】:

        猜你喜欢
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多