open62541 浏览服务器中节点

本文介绍了如何使用OPC UA库创建服务器和客户端,并通过客户端的UA_Client_Service_browse方法浏览服务器上的特定节点,展示了一个从server节点下获取子节点信息的示例,同时对比了客户端输出与UaExpert软件的浏览结果,两者一致。
摘要由CSDN通过智能技术生成

概述

本文将讲述客户端连接服务器后使用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输出如下
在这里插入图片描述
可见结果是一致的,对于其他参数可以修改进行查看浏览结果。

open62541是一款开源的OPC UA通信协议栈,可以用于开发OPC UA服务器和客户端。下面将介绍如何使用open62541开发一个服务器。 1. 安装open62541 首先需要从open62541的官方网站下载最新版本的代码,然后根据自己的系统环境进行编译和安装。 详细的安装教程可以参考open62541的官方文档。 2. 编写服务器代码 在编写服务器代码之前,需要先确定服务器的数据模型和节点结构。OPC UA数据模型是基于树形结构的,每一个节点都有一个唯一的标识符和一个类型。对于一个新的服务器,需要自己设计数据模型和节点结构,可以参考OPC UA规范。数据模型设计好之后,就可以使用open62541提供的API来创建节点和变量,并且将它们添加到节点。 下面是一个简单的示例代码,用于创建一个名为"HelloWorld"的变量节点: ``` UA_NodeId objectId = UA_NODEID_NULL; UA_ObjectAttributes objectAttrs = UA_ObjectAttributes_default; objectAttrs.displayName = UA_LOCALIZEDTEXT("en_US", "HelloWorld Object"); UA_Server_addObjectNode(server, UA_NODEID_NULL, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_QUALIFIEDNAME(1, "HelloWorld"), UA_NODEID_NULL, objectAttrs, &objectId); UA_NodeId variableId = UA_NODEID_NULL; UA_VariableAttributes variableAttrs = UA_VariableAttributes_default; variableAttrs.displayName = UA_LOCALIZEDTEXT("en_US", "HelloWorld"); variableAttrs.accessLevel = UA_ACCESSLEVELMASK_READ; UA_Int32 value = 42; UA_Variant_setScalar(&variableAttrs.value, &value, &UA_TYPES[UA_TYPES_INT32]); UA_Server_addVariableNode(server, objectId, UA_NODEID_NUMERIC(0, UA_NS0ID_HASPROPERTY), UA_QUALIFIEDNAME(1, "Value"), UA_NODEID_NULL, variableAttrs, &variableId); ``` 3. 运行服务器 服务器代码编写完成后,需要运行服务器程序。首先需要创建一个UA_Server对象,并且将需要的配置信息设置好。然后使用UA_Server_run()函数来启动服务器,该函数会一直运行直到接收到终止信号(比如Ctrl-C)。 下面是一个简单的服务器启动示例代码: ``` UA_ServerConfig *config = UA_ServerConfig_new_default(); UA_Server *server = UA_Server_new(config); UA_Server_run(server, &running); UA_Server_delete(server); UA_ServerConfig_delete(config); ``` 4. 测试服务器 服务器启动后,就可以连接到它并测试它的功能。可以使用任何支持OPC UA协议的客户端应用程序,比如UAExpert。在客户端输入服务器的地址和端口号,就可以浏览服务器节点,读写变量值,触发事件等等。如果验证出现了问题,可以通过调试服务器代码来查找问题并解决它。 通过以上步骤,就可以使用open62541开发一个OPC UA服务器。当然,这仅仅是一个起点,开发一个真正功能强大的服务器还需要更多的工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

复杂的世界311

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值