概述
本文将讲述客户端连接服务器后使用UA_Client_Service_browse去浏览服务器中某个节点下的子节点
示例
首先我们创建一个简单的服务器
#include "open62541.h"
UA_Boolean running = true;
int main()
{
UA_Server *server = UA_Server_new();
UA_ServerConfig_setDefault(UA_Server_getConfig(server));
UA_StatusCode retval = UA_Server_run(server, &running);
UA_Server_delete(server);
return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
}
创建成功服务器成功之后我们使用UaExpert软件去连接这个服务器并展开server节点
创建完服务器后我们创建客户端,读取服务器中server节点下的有关节点信息,如下
#include "open62541.h"
int main(int argc, char *argv[]) {
UA_Client *client = UA_Client_new();
UA_ClientConfig_setDefault(UA_Client_getConfig(client));
UA_StatusCode retval;
/* Connect to a server */
retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
if(retval != UA_STATUSCODE_GOOD) {
UA_Client_delete(client);
return EXIT_FAILURE;
}
/* Browse some objects */
printf("Browsing nodes in objects folder:\n");
UA_BrowseRequest bReq;
UA_BrowseRequest_init(&bReq);
bReq.requestedMaxReferencesPerNode = 0;//限制查到的最大节点数,0 不限制
bReq.nodesToBrowse = UA_BrowseDescription_new();
bReq.nodesToBrowseSize = 1;//需要浏览的节点个数,这里只寻找server节点下的节点所以为1
/*UA_BROWSEDIRECTION_FORWARD表示向下查找(即查找添加在节点下的节点),
UA_BROWSEDIRECTION_INVERSE表示向上查找(即查找节点的父节点),
UA_BROWSEDIRECTION_BOTH表示上下都进行查找*/
bReq.nodesToBrowse[0].browseDirection = UA_BROWSEDIRECTION_FORWARD;
bReq.nodesToBrowse[0].includeSubtypes = UA_TRUE;//是否包含subtypes
bReq.nodesToBrowse[0].nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER);//设置起始浏览节点为server节点
bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL; //返回浏览到的节点包含的信息,名称、显示名称......,UA_BROWSERESULTMASK_ALL表示返回所有信息
//bReq.nodesToBrowse[0].referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT);//筛选引用类型
UA_BrowseResponse bResp = UA_Client_Service_browse(client, bReq);
//输出浏览到的每个节点信息
printf("%-9s %-16s %-16s %-16s\n", "NAMESPACE", "NODEID", "BROWSE NAME", "DISPLAY NAME");
for(size_t i = 0; i < bResp.resultsSize; ++i) {
for(size_t j = 0; j < bResp.results[i].referencesSize; ++j) {
UA_ReferenceDescription *ref = &(bResp.results[i].references[j]);
if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_NUMERIC) {
printf("%-9u %-16u %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex,
ref->nodeId.nodeId.identifier.numeric, (int)ref->browseName.name.length,
ref->browseName.name.data, (int)ref->displayName.text.length,
ref->displayName.text.data);
} else if(ref->nodeId.nodeId.identifierType == UA_NODEIDTYPE_STRING) {
printf("%-9u %-16.*s %-16.*s %-16.*s\n", ref->nodeId.nodeId.namespaceIndex,
(int)ref->nodeId.nodeId.identifier.string.length,
ref->nodeId.nodeId.identifier.string.data,
(int)ref->browseName.name.length, ref->browseName.name.data,
(int)ref->displayName.text.length, ref->displayName.text.data);
}
/* TODO: distinguish further types */
}
}
UA_BrowseRequest_clear(&bReq);
UA_BrowseResponse_clear(&bResp);
UA_Client_disconnect(client);
UA_Client_delete(client);
system("pause");
return EXIT_SUCCESS;
}
输出结果与Uaexpert软件输出是对应的,Uaexpert浏览结果如下
demo输出如下
可见结果是一致的,对于其他参数可以修改进行查看浏览结果。