Я пытаюсь подключиться к 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. Есть идеи почему?