赞
踩
本文将讲述客户端连接服务器后使用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输出如下
可见结果是一致的,对于其他参数可以修改进行查看浏览结果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。