与OPC UA Server的连接通过Cisco工作,但不通过Sinema RC Client工作

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

我正在尝试连接到OPC服务器。我使用Softing OPC Toolkit并成功通过Cisco Anyconnect进行连接,但无法通过Sinema RC Client V2.0进行连接。

我已经与服务器建立了VPN连接,检查了IP地址,并能够在我的终端中ping服务器。我正在使用的端口正在“监听”,所以这应该不是问题。我也确实放入了正确的端点。

这是我在c ++中的连接函数

EnumStatusCode OpcClient::connect()
{
    EnumStatusCode result;
    std::vector<tstring> transportProfileList;
    std::vector<EndpointDescription> endpointDescriptions;

EnumUserTokenType desiredTokenType = EnumUserTokenType_Anonymous;
EnumMessageSecurityMode desiredSecurityMode = EnumMessageSecurityMode_None;
tstring desiredSecurityPolicy = SecurityPolicyUri_None;

result = pApp->getEndpointsFromServer(serverUrl, transportProfileList, endpointDescriptions);

if(StatusCode::isBad(result))
{
    qDebug() << "No connection to ServerURL:";
}
else if (StatusCode::isGood(result))
{
    for(unsigned int i = 0; i < endpointDescriptions.size(); i++)
    {
       for(unsigned int j = 0; j < endpointDescriptions[i].getUserIdentityTokenCount(); j++)
       {
          if(endpointDescriptions[i].getUserIdentityToken(j)->getTokenType() == desiredTokenType
             && endpointDescriptions[i].getMessageSecurityMode() == desiredSecurityMode
             && endpointDescriptions[i].getSecurityPolicy() == desiredSecurityPolicy)
          {
              _tprintf(_T("Endpoint %d:\n")
                      _T("  URL:                 %s\n")
                      _T("  Message security:    %s\n")
                      _T("  Security policy:     %s\n"),
                      i,
                      endpointDescriptions[i].getEndpointUrl().c_str(),
                      getEnumMessageSecurityModeString(endpointDescriptions[i].getMessageSecurityMode()),
                      endpointDescriptions[i].getSecurityPolicy().c_str());

              const IUserTokenPolicy* pPolicy = endpointDescriptions[i].getUserIdentityToken(j);
              _tprintf(_T("  User token policy %d: %s\n"), j, getEnumUserTokenTypeString(pPolicy->getTokenType()));

              qDebug() << "Trying to connect a new session...";
              session = Client::Session::create();
              session->setSessionTimeout(60 * 1000); // in milliseconds
              session->setUrl(serverUrl);
              session->setSecurityConfiguration(desiredSecurityMode, desiredSecurityPolicy);

              UserIdentityToken userIdentityToken;
              userIdentityToken.setAnonymousIdentityToken(endpointDescriptions[i].getUserIdentityToken(j)->getPolicyId()); // usually obtained by GetEndpoints
              session->setUserIdentityToken(&userIdentityToken);
              session->setUserSecurityPolicy(desiredSecurityPolicy); // usually obtained by GetEndpoints

              pApp->addSession(session);

              result = session->connect(true);
              if(StatusCode::isBad(result))
              {
                  qDebug() << "ERROR: Failed to connect the session: \n"
                           << getEnumStatusCodeString(result);
                  session->disconnect();
                  pApp->removeSession(session);
              }
              if(StatusCode::isGood(result))
              {
                  qDebug() << "Successfully connected Session";
              }
          }
       }
    }
}
return result;
}

我这样称它(初始化和启动函数都成功运行):

OpcClient::OpcClient()
{

EnumStatusCode result;

loadToolbox(NULL);   // "NULL" only in the case that no creator is needed


ApplicationDescription appDesc;
appDesc.setApplicationType(EnumApplicationType_Client);
appDesc.setApplicationName(LocalizedText(_T("Client"), _T("en")));
appDesc.setApplicationUri(_T("urn:.../.../OpcUa/TestClient"));

appDesc.setProductUri(_T("urn:.../OpcUA/Softing_Development_Toolkit"));

serverUrl = _T("opc.tcp://myIP_andPort/Softing_dataFEED_OPC_Suite_UP");


pApp = Application::instance();
result = pApp->initialize(&appDesc);
if(StatusCode::isBad(result))
{
    qDebug() << "Failed to initialize App";
}
else if (StatusCode::isGood(result))
{
    qDebug() << "Successfully initialized App";

    result = pApp->start();
    if(StatusCode::isBad(result))
    {
        qDebug() << "Failed to start App";
    }
    else if (StatusCode::isGood(result))
    {
        qDebug() << "Successfully started App";
        result = connect();
        if(StatusCode::isBad(result))
        {
            qDebug() << "Failed to connect";
            disconnect();

该功能确实可以获得所有需要的输入并通过思科工作,但不能使用Sinema RC。任何想法为什么?

c++ qt vpn cisco opc-ua
1个回答
0
投票

如果将来有人对此感兴趣:

在使用默认自动方法时,SinemaRC似乎有时会错误地配置NAT设置。将这些更改回正确的IP之后,一切都会再次运行!

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