与OPC UA服务器的连接通过思科工作,但不通过Sinema RC客户端

Connection to OPC UA Server worked via Cisco but not via Sinema RC Client

本文关键字:客户端 RC Sinema 工作 UA OPC 服务器 连接      更新时间:2023-10-16

我正在尝试连接到OPC服务器。我使用Softing OPC工具包,并设法通过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:                 %sn")
_T("  Message security:    %sn")
_T("  Security policy:     %sn"),
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: %sn"), 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 一起使用。知道为什么吗?

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

使用默认的自动方法时,SinemaRC 似乎有时会错误地配置您的 NAT 设置。将这些更改回正确的IP后,一切又恢复了!