与OPC UA服务器的连接通过Cisco工作,但未通过Sinema RC Client

时间:2019-04-04 09:31:16

标签: c++ qt vpn cisco opc-ua

我正在尝试连接到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;
}

我这样称呼它(initalize和start函数都成功运行):

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();

该功能确实获得了所有需要的输入,并且可以通过Cisco运行,但不能与Sinema RC一起运行。知道为什么吗?

1 个答案:

答案 0 :(得分:0)

以防将来有人对此感兴趣:

使用默认的自动方法时,SinemaRC有时有时会错误地配置您的NAT设置。将这些更改回正确的IP后,一切将再次正常工作!