void subscribe()
{
printf("\n\n****************************************************************\n");
printf("** Try to create a subscribe\n");
if ( g_pUaSession == NULL )
{
printf("** Error: Server not connected\n");
printf("****************************************************************\n");
return;
}
SubscriptionSettings subscriptionSettings;
ServiceSettings serviceSettings;
status = g_pUaSession->createSubscription(
serviceSettings,
g_pCallback,
0,
subscriptionSettings,
OpcUa_True,
&pUaSubscription);
{
printf(
"** Error: UaSession::createdSubscription failed [ret=%s] *********\n", status.
toString().
toUtf8());
}
else
{
printf("****************************************************************\n");
printf("** Try to create monitored items\n");
OpcUa_UInt32 i;
OpcUa_UInt32 count;
UaMonitoredItemCreateRequests monitoredItemCreateRequests;
UaMonitoredItemCreateResults monitoredItemCreateResults;
count = g_VariableNodeIds.length();
monitoredItemCreateRequests.create(count + 1);
for ( i=0; i<count; i++ )
{
g_VariableNodeIds[i].copyTo(&monitoredItemCreateRequests[i].ItemToMonitor.NodeId);
monitoredItemCreateRequests[i].ItemToMonitor.AttributeId = OpcUa_Attributes_Value;
monitoredItemCreateRequests[i].MonitoringMode = OpcUa_MonitoringMode_Reporting;
monitoredItemCreateRequests[i].RequestedParameters.ClientHandle = i+1;
monitoredItemCreateRequests[i].RequestedParameters.SamplingInterval = 1000;
monitoredItemCreateRequests[i].RequestedParameters.QueueSize = 1;
}
monitoredItemCreateRequests[count].ItemToMonitor.NodeId.Identifier.Numeric = OpcUaId_Server;
monitoredItemCreateRequests[count].ItemToMonitor.AttributeId = OpcUa_Attributes_EventNotifier;
monitoredItemCreateRequests[count].MonitoringMode = OpcUa_MonitoringMode_Reporting;
monitoredItemCreateRequests[count].RequestedParameters.ClientHandle = count+1;
monitoredItemCreateRequests[count].RequestedParameters.SamplingInterval = 1000;
monitoredItemCreateRequests[count].RequestedParameters.QueueSize = 0;
OpcUa_EventFilter* pEventFilter = (OpcUa_EventFilter*)OpcUa_Null;
OpcUa_EncodeableObject_CreateExtension( &OpcUa_EventFilter_EncodeableType,
&monitoredItemCreateRequests[count].RequestedParameters.Filter,
(OpcUa_Void**)&pEventFilter);
OpcUa_EventFilter_Initialize(pEventFilter);
UaSimpleAttributeOperands selectClauses;
UaQualifiedNameArray browsePath;
selectClauses.create(3);
selectClauses[0].AttributeId = OpcUa_Attributes_Value;
selectClauses[0].TypeDefinitionId.Identifier.Numeric = OpcUaId_BaseEventType;
browsePath.create(1);
propName.
copyTo(&browsePath[0]);
selectClauses[0].NoOfBrowsePath = browsePath.length();
selectClauses[0].BrowsePath = browsePath.detach();
selectClauses[1].AttributeId = OpcUa_Attributes_Value;
selectClauses[1].TypeDefinitionId.Identifier.Numeric = OpcUaId_BaseEventType;
browsePath.create(1);
propName.
copyTo(&browsePath[0]);
selectClauses[1].NoOfBrowsePath = browsePath.length();
selectClauses[1].BrowsePath = browsePath.detach();
selectClauses[2].AttributeId = OpcUa_Attributes_Value;
selectClauses[2].TypeDefinitionId.NamespaceIndex = 2;
selectClauses[2].TypeDefinitionId.Identifier.Numeric = 4000;
browsePath.create(1);
propName.
copyTo(&browsePath[0]);
selectClauses[2].NoOfBrowsePath = browsePath.length();
selectClauses[2].BrowsePath = browsePath.detach();
pEventFilter->NoOfSelectClauses = selectClauses.length();
pEventFilter->SelectClauses = selectClauses.detach();
status = pUaSubscription->createMonitoredItems(
serviceSettings,
OpcUa_TimestampsToReturn_Both,
monitoredItemCreateRequests,
monitoredItemCreateResults);
{
printf(
"** Error: UaSession::createMonitoredItems failed [ret=%s] *********\n", status.
toString().
toUtf8());
printf("****************************************************************\n");
return;
}
else
{
printf("** UaSession::createMonitoredItems result **********************\n");
for ( i=0; i<count; i++ )
{
UaNodeId node(monitoredItemCreateRequests[i].ItemToMonitor.NodeId);
if ( OpcUa_IsGood(monitoredItemCreateResults[i].StatusCode) )
{
printf("** Variable %s MonitoredItemId = %d\n", node.toString().toUtf8(), monitoredItemCreateResults[i].MonitoredItemId);
}
else
{
printf("** Variable %s failed!\n", node.toString().toUtf8());
}
}
if ( OpcUa_IsGood(monitoredItemCreateResults[count].StatusCode) )
{
printf("** Event MonitoredItemId = %d\n", monitoredItemCreateResults[count].MonitoredItemId);
}
else
{
printf("** Event MonitoredItem for Server Object failed!\n");
}
printf("****************************************************************\n");
}
}
printf("\n*******************************************************\n");
printf("*******************************************************\n");
printf("** Press x to stop subscription *******\n");
printf("*******************************************************\n");
printf("*******************************************************\n");
int action;
while(!WaitForKeypress(action))
{
Sleep(100);
}
status = g_pUaSession->deleteSubscription(
serviceSettings,
&pUaSubscription);
{
printf("** UaSession::deleteSubscription failed! **********************\n");
printf("****************************************************************\n");
}
else
{
pUaSubscription = NULL;
printf("** UaSession::deleteSubscription succeeded!\n");
printf("****************************************************************\n");
}
}