void exploreAddressSpace(
const UaNodeId& startingNode,
unsigned int level)
{
UaReferenceDescriptions referenceDescriptions;
ServiceSettings serviceSettings;
status = g_pUaSession->browse(
serviceSettings,
startingNode,
browseContext,
continuationPoint,
referenceDescriptions);
{
printf("** Error: UaSession::browse of NodeId = %s failed [ret=%s] *********\n",
return;
}
else
{
OpcUa_UInt32 i, j;
for (i=0; i<referenceDescriptions.length(); i++)
{
printf("node: ");
for (j=0; j<level; j++) printf(" ");
UaNodeId referenceTypeId(referenceDescriptions[i].ReferenceTypeId);
printf("[Ref=%s] ", referenceTypeId.toString().toUtf8() );
printf("%s ( ", browseName.toString().toUtf8() );
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_Object) printf("Object ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_Variable) printf("Variable ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_Method) printf("Method ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_ObjectType) printf("ObjectType ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_VariableType) printf("VariableType ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_ReferenceType) printf("ReferenceType ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_DataType) printf("DataType ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_View) printf("View ");
UaNodeId nodeId(referenceDescriptions[i].NodeId.NodeId);
printf("[NodeId=%s] ", nodeId.toFullString().toUtf8() );
printf(")\n");
exploreAddressSpace(referenceDescriptions[i].NodeId.NodeId, level+1 );
}
while ( continuationPoint.
length() > 0 )
{
status = g_pUaSession->browseNext(
serviceSettings,
OpcUa_False,
continuationPoint,
referenceDescriptions);
{
printf("** Error: UaSession::browse of NodeId = %s failed [ret=%s] *********\n",
return;
}
else
{
for (i=0; i<referenceDescriptions.length(); i++)
{
printf("node: ");
for (j=0; j<level; j++) printf(" ");
UaNodeId referenceTypeId(referenceDescriptions[i].ReferenceTypeId);
printf("[Ref=%s] ", referenceTypeId.toString().toUtf8() );
printf("%s ( ", browseName.toString().toUtf8() );
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_Object) printf("Object ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_Variable) printf("Variable ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_Method) printf("Method ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_ObjectType) printf("ObjectType ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_VariableType) printf("VariableType ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_ReferenceType) printf("ReferenceType ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_DataType) printf("DataType ");
if (referenceDescriptions[i].NodeClass & OpcUa_NodeClass_View) printf("View ");
UaNodeId nodeId(referenceDescriptions[i].NodeId.NodeId);
printf("[NodeId=%s] ", nodeId.toFullString().toUtf8() );
printf(")\n");
exploreAddressSpace(referenceDescriptions[i].NodeId.NodeId, level+1 );
}
}
}
}
return;
}
void browse()
{
printf("\n\n****************************************************************\n");
printf("** Try to call browse on root\n");
if ( g_pUaSession == NULL )
{
printf("** Error: Server not connected\n");
printf("****************************************************************\n");
return;
}
UaNodeId startingNode(OpcUaId_RootFolder);
exploreAddressSpace(startingNode, 1);
}
A client uses the Browse Service of UA by passing a starting Node and browse filters. The server, however, returns the list of referenced nodes matching the filter criteria. The Browse Service takes a list of starting Nodes and returns a list of connected Nodes for each starting Node. Nevertheless, most clients will only pass one starting Node for the main purpose of building a tree hierarchy. UaSession::browse() takes the parameters listed below: