Соединение с OPC UA Server работало через Cisco, но не через Sinema RC Client. - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь подключиться к OPC-серверу. Я использую Softing OPC Toolkit и мне удалось успешно подключиться через Cisco Anyconnect, но мне не удается это сделать через Sinema RC Client V2.0.

Я установил VPN-соединение с Сервером, проверил IP-адрес и могу пропинговать сервер в моем терминале. Используемый порт находится в режиме «прослушивания», поэтому это не должно быть проблемой. Я также указал правильную конечную точку.

Вот моя функция подключения в 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();

Функция получает все необходимые входные данные и работает через Cisco, но не с Sinema RC. Есть идеи почему?

1 Ответ

0 голосов
/ 11 апреля 2019

В случае, если кто-то заинтересуется этим в будущем:

SinemaRC иногда неправильно настраивает ваши настройки NAT при использовании автоматического метода по умолчанию.После того, как они вернутся к правильному IP, все снова будет работать!

...