【Node-RED】node-red-contrib-opcua-server模块使用(2)

这里写自定义目录标题

  • 前言
  • 示例简单介绍
    • 变量产生
    • opcuaServe配置
  • 地址空间的配置
    • 创建opcua服务器
    • 获取命名空间
    • 初始化变量
    • 定义文件夹
    • 定义文件夹中的变量
    • view文件夹增加
    • view文件夹中查阅信息定义
    • 最终效果
  • 加密设置
    • opcuaServe组件配置
    • 客户端配置
  • 参考官网博文


前言

上期博文【Node-RED】node-red-contrib-opcua-server模块使用(1)中,我们主要介绍了,模块安装过程中遇到的相关问题。本期博文,我们介绍node-red-contrib-opcua-server模块的使用,并以官方示例中server-with-context.json流程为例展开介绍,主要涉及地址空间的配置加密设置

博文所提示例已经上传资源中,期间设置的所有相关设置都保留在流程中,可以下载使用。

示例简单介绍

示例主要由变量产生opcuaServe配置 两部分组成。

变量产生

变量产生用到了注入中定时器,周期性的实现变量的生成和变化,变量主要有2部分,isoInput2-isoInput8,isoOutput2-isoOutput8,这个可以自定义,通过函数组件将变量保存到流程的上下文数据中,方便后续的使用。
在这里插入图片描述
通过点击注入,在上下文数据中可以进行数据查看,点击右上角的圆圈进行刷新,可以实时更新数据。
在这里插入图片描述

opcuaServe配置

node-red-contrib-opcua-server模块中实现opcuaServe配置,主要采用opcua-compact-server组件,在前期测试中,主要以匿名形式设置,加密可以直接跳转到后面加密设置

  • 需要勾选Setting 中的 Show Errors,方便错误信息的查看。
  • DiscoveryEndpoint Url需配置上地址,端口可以在Setting 中查看。如果Resource Path没有配置,又是本地,Endpoint Url设置为opc.tcp://localhost:54840,54840为默认端口,可以自定义更改;如果Resource Path配置了,Endpoint Url设置为opc.tcp://localhost:54840/UA/NodeRED/Compact,UA/NodeRED/Compact为默认的资源地址。

然后点击部署,当显示active 即表示成功。
在这里插入图片描述

地址空间的配置

创建opcua服务器

  const opcua = coreServer.choreCompact.opcua;
  • 注意:爆红不影响使用
    在这里插入图片描述

获取命名空间

const namespace = addressSpace.getOwnNamespace();

初始化变量

const Variant = opcua.Variant;const DataType = opcua.DataType;const DataValue = opcua.DataValue;var flexServerInternals = this;this.sandboxFlowContext.set("isoInput1", 0);this.setInterval(() => {flexServerInternals.sandboxFlowContext.set("isoInput1",Math.random() + 50.0);}, 500);this.sandboxFlowContext.set("isoInput2", 0);this.sandboxFlowContext.set("isoInput3", 0);...

定义文件夹

coreServer.debugLog("init dynamic address space");const rootFolder = addressSpace.findNode("RootFolder");node.warn("construct new address space for OPC UA");const myDevice = namespace.addFolder(rootFolder.objects, {"browseName": "RaspberryPI-Zero-WLAN"});const gpioFolder = namespace.addFolder(myDevice, { "browseName": "GPIO" });const isoInputs = namespace.addFolder(gpioFolder, {"browseName": "Inputs"});const isoOutputs = namespace.addFolder(gpioFolder, {"browseName": "Outputs"});

定义文件夹中的变量

const gpioDI1 = namespace.addVariable({"organizedBy": isoInputs,"browseName": "I1","nodeId": "ns=1;s=Isolated_Input1","dataType": "Double","value": {"get": function() {return new Variant({"dataType": DataType.Double,"value": flexServerInternals.sandboxFlowContext.get("isoInput1")});},"set": function(variant) {flexServerInternals.sandboxFlowContext.set("isoInput1",parseFloat(variant.value));return opcua.StatusCodes.Good;}}});const gpioDI2 = namespace.addVariable({"organizedBy": isoInputs,"browseName": "I2","nodeId": "ns=1;s=Isolated_Input2","dataType": "Double","value": {"get": function() {return new Variant({"dataType": DataType.Double,"value": flexServerInternals.sandboxFlowContext.get("isoInput2")});},"set": function(variant) {flexServerInternals.sandboxFlowContext.set("isoInput2",parseFloat(variant.value));return opcua.StatusCodes.Good;}}});...

view文件夹增加

const viewDI = namespace.addView({"organizedBy": rootFolder.views,"browseName": "RPIW0-Digital-Ins"});const viewDO = namespace.addView({"organizedBy": rootFolder.views,"browseName": "RPIW0-Digital-Outs"});

view文件夹中查阅信息定义

viewDI.addReference({"referenceType": "Organizes","nodeId": gpioDI1.nodeId});viewDI.addReference({"referenceType": "Organizes","nodeId": gpioDI2.nodeId});

最终效果

在这里插入图片描述

加密设置

opcuaServe组件配置

  1. 在Security中取消Allow Anonymous勾选
  2. 勾选Use individual Certificate Files
  3. Public填上公钥地址,Private填上私钥地址,可以直接用绝对地址,这里用了默认的相对地址..\certificates,不太对,依旧报没有路径下没有文件。
C:\Users\11003189\.node-red\node_modules\node-red-contrib-opcua-server\opcua-certificate-2048\server_selfsigned_cert_2048.pem
C:\Users\11003189\.node-red\node_modules\node-red-contrib-opcua-server\opcua-certificate-2048\server_key_2048.pem

在这里插入图片描述

客户端配置

  1. 将公钥的pem文件转der文件,私钥不用。
openssl x509 -in server_selfsigned_cert_2048.pem -out server_selfsigned_cert_2048.der -outform DER

在这里插入图片描述

  1. 在客户端里面直接导入公钥和私钥文件即可。在这里插入图片描述

这里有一个问题,官网博文中说加密模式选Aes128Sha256RsaOaep,但是opcuaServe组件并不支持这个算法模式,所以最后也就没有连接成功,但是官网博文中一样的配置居然连接成功了,很迷。

参考官网博文

How to Deploy a Basic OPC-UA Server in Node-RED - Part 1

How to Build a Secure OPC-UA Server for PLCs in Node-RED

node-red-contrib-opcua-server模块的研究就先到这里了,原以为该模块的函数部分编辑可以实现二次开发,结果只能是地址空间的配置,而且该模块也没有输出。
又测试了node-red-contrib-opcua,它主要是输出连接状态、收到的写入信息,不能在服务器中对输出信息进行二次处理。
基于以上的情况,需求依旧无法实现,上周的喜悦戛然而止,不过热情依旧,继续探索Opcua 的魅力,目前也看了c++中实现Opcua的底层函数,严重怀疑估计得改底层代码,庆幸NodeRed是开源的,因此继续研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础学编程,中文编程入门视频教程

零基础学编程,中文编程入门视频教程 一、前言 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常用工具下载——编程工具免费版下载及实例源码下载。 如上图为编程工具构件…

c语言实战之贪吃蛇

文章目录 前言效果展示游戏用到的图片游戏思路一览游戏前准备一、贪吃蛇、食物、障碍物节点坐标的结构体二、枚举游戏状态、和贪吃蛇的方向三、维护运行的结构体 游戏开始前的初始化一、学习图形库相关知识二、设置背景三、欢迎界面四、初始化贪吃蛇五、生成障碍物六、生成食物…

SharedPreferences卡顿分析

SP的使用及存在的问题 SharedPreferences(以下简称SP)是Android本地存储的一种方式,是以key-value的形式存储在/data/data/项目包名/shared_prefs/sp_name.xml里,SP的使用示例及源码解析参见:Android本地存储之SharedPreferences源码解析。以…

【JAVA语言-第16话】集合框架(三)——Set、HashSet、LinkedHashSet、TreeSet集合的详细解析

目录 Set集合 1.1 概述 1.2 特点 1.3 HashSet集合 1.3.1 概述 1.3.2 哈希表 1.3.3 哈希值 1.3.4 练习 1.3.5 HashSet存储自定义类型元素 1.4 LinkedHashSet集合 1.4.1 概述 1.4.2 特点 1.4.3 练习 1.5 TreeSet集合 1.5.1 概述 1.5.2 练习 1.6 HashSet、Lin…

【论文复现】

code: paper: 论文 介绍 方法 实验 结论 复现 Image generation 问题1:No models "dcface/dcface/pretrained_models/adaface_ir101_webface4m.ckpt Traceback (most recent call last):File "/data/dcface/dcface/src/r…

如何通俗解释Docker是什么?

要想弄懂Docker,咱们得先从“容器化”讲起。 一、容器化技术及Docker的出现 容器化,它是一种轻量级、可移植的软件打包方式,你就想象成一个快递箱子,里面装着你的应用和所有需要运行的环境,这个箱子能在任何支持容器…

Redisson分布式锁介绍及实战应用(防止缓存击穿)

本地锁 浏览器把100w请求由网关随机往下传,在集群情况下,每台服务都放行10w请求过来,这时候每台服务都用的是本地锁是跨JVM的, 列如这些服务都没有49企业,此时有几个服务进行回原了打击在DB上面,那后期把这…

Blender教程(基础)-物体的移动、旋转与缩放-04

一、新建一个立方体 ShiftA新建一个立方体用来演示。 二、物体的移动 xyz轴移动 点击下图图左侧的移动选项后,选中要移动的物体,会出现三个箭头的方向,这分别代表沿着x、y、z轴移动。xyz平面移动 这个小正方体代表沿着某一个面移动&#…

AWS 专题学习 P14 (Security Encryption)

文章目录 专题总览为什么需要加密?AWS KMS(密钥管理服务)KMS 密钥类型AWS KMS(密钥管理服务)Copying Snapshots across regionsKMS Key Policies在不同账户之间复制快照KMS Multi-Region Keys (多区域密钥)DynamoDB 全…

ElasticSearch 学习笔记

基本概念 术语 文档(document):每条记录就是一个文档,会以 JSON 格式进行存储 映射(mapping):索引中文档字段的约束信息,类似 RDBMS 中的表结构约束(schema&#xff09…

在linux上进行编译调试

1.相关疑问 1. 为什么在代码里使用了一个未定义过的函数(如add()),在编译阶段不会报错,在链接阶段会报错呢? 答:先说几个代码编译的结论: 单个\.c源文件文件被编译成机器码文件时&#xff0c…

LVS 工作模式

1、LVS DR模式 DR 模式是通过改写请求报文的目标 MAC 地址,将请求发给真实服务器的,而真实服务器响应后的处理结果直接返回给客户端用户。DR 模式可以极大的提高集群系统的伸缩性。但是要求调度器 LB 与真实服务器 RS 都有一块网卡连接到同一物理网段上…

Codeforces Round 785 C. Palindrome Basis

C. Palindrome Basis 题意 定义一个正整数 a a a 是回文的(没有前导 0 0 0)当且仅当: a a a 的十进制表示形式回文 给定一个正整数 n n n ,求出将 n n n 拆分成若干个回文数之和的方案数 思路 这是一个经典模型&#xff0…

媒体邀约:怎么吸引总体目标受众?

新闻媒体影响力日益扩大。不论是公司、机构还是其他,都希望能够通过新闻媒体的曝光来吸引更多总体目标受众。要想真正吸引住总体目标受众并非易事,需要一定的方案和方法。下面我们就深入探究媒体邀约推广的真相,共享怎么吸引总体目标受众的方…

秋招面试—计算机网络安全

2021 计算机网络安全 1.Get 和 Post 的区别 get 用于获取数据,post用于提交数据; get 的缓存保存在浏览器和web服务器日志中; get 使用明文传输,post请求保存在请求体中; get 长度限制在2048以内 2.常见的HTTP请…

Android P 屏保和休眠相关知识

Android P添加屏保功能,如果休眠时间设定大于屏保时间,则先进入屏保,达到休眠时间后再进入休眠 需求: 添加屏幕互保开关,默认关闭。只保留时钟,可设定指针和数字、夜间模式。启用时间改多长时间无操作进入…

###C语言程序设计-----C语言学习(6)#

前言:感谢老铁的浏览,希望老铁可以一键三连加个关注,您的支持和鼓励是我前进的动力,后续会分享更多学习编程的内容。 一. 主干知识的学习 1. while语句 除了for语句以外,while语句也用于实现循环,而且它…

初识elasticsearch

一、了解ES 1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案 在打车软件搜索附近的车 …

(七)for循环控制

文章目录 用法while的用法for的用法两者之间的联系可以相互等价用for改写while示例for和while的死循环怎么写for循环见怪不怪表达式1省略第一.三个表达式省略(for 改 while)全省略即死循环(上面已介绍) 用法 类比学习while语句 …

MySQL原理(一)架构组成(1)物理文件组成

目录 一、日志文件 1、错误日志 Error Log 1.1、作用: 1.2、开启关闭: 1.3、使用 2、二进制日志 Binary Log & Binary Log Index 2.1、作用: 2.2、开启关闭: 2.3、Binlog还有一些附加选项参数 (1&#x…