IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 学习open62541 --- [59] 遍历Server所有node -> 正文阅读

[系统运维]学习open62541 --- [59] 遍历Server所有node

Client端有个api叫UA_Client_Service_browse,可以遍历Server里指定node下所有的直接子node,其原型如下,

static UA_INLINE UA_BrowseResponse
UA_Client_Service_browse(UA_Client *client, const UA_BrowseRequest request);

一 例子

先准备个Server代码,如下,

#include "open62541.h"

#include <signal.h>
#include <stdlib.h>

UA_Boolean running = true;

static void stopHandler(int sign) {
    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
    running = false;
}

int main(void) 
{
    signal(SIGINT, stopHandler);
    signal(SIGTERM, stopHandler);

    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;
}

下面是client代码,程序遍历Objects目录,

#include <stdlib.h>
#include "open62541.h"

int main(void) 
{
    UA_Client *client = UA_Client_new();
    UA_ClientConfig_setDefault(UA_Client_getConfig(client));
    UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
    if(retval != UA_STATUSCODE_GOOD) {
        UA_Client_delete(client);
        return (int)retval;
    }
    

	/* Browse some objects */
    printf("Browsing nodes in objects folder:\n");
	
    UA_BrowseRequest bReq;
    UA_BrowseRequest_init(&bReq); // 初始化bReq
    bReq.requestedMaxReferencesPerNode = 0;
    bReq.nodesToBrowse = UA_BrowseDescription_new(); // 分配内存,并把地址赋给bReq.nodesToBrowse
    bReq.nodesToBrowseSize = 1; // 遍历的起始节点数量
    bReq.nodesToBrowse[0].nodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER); // 遍历 objects目录
    bReq.nodesToBrowse[0].resultMask = UA_BROWSERESULTMASK_ALL; // 返回所有
    
    UA_BrowseResponse bResp = UA_Client_Service_browse(client, bReq); // 开始遍历
	if (bResp.responseHeader.serviceResult) // 判断遍历结果
	{
		// 打印遍历结果
		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("%-9d %-16d %-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("%-9d %-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);


    
    /* Clean up */
    UA_Client_delete(client); /* Disconnects the client internally */
    
    return EXIT_SUCCESS;
}

最终打印如下,
在这里插入图片描述
可以看出只能遍历Objects目录下的所有直接子node,那么如何遍历间接的node呢?就是再遍历读取到的直接node,好像有点傻…


二 相关结构体

结构体UA_BrowseRequest的定义如下,用来发送遍历请求,可以同时遍历多个节点

/**
 * BrowseRequest
 * ^^^^^^^^^^^^^
 * Browse the references for one or more nodes from the server address space. */
typedef struct {
    UA_RequestHeader requestHeader;
    UA_ViewDescription view;
    UA_UInt32 requestedMaxReferencesPerNode;
    size_t nodesToBrowseSize; // 需要遍历的起始节点数目
    UA_BrowseDescription *nodesToBrowse; // 起始节点描述
} UA_BrowseRequest;
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:35:42  更:2022-03-21 21:39:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:19:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码