OPCUA Java milo 结构在UAEExpert 中的结构错误

如何解决OPCUA Java milo 结构在UAEExpert 中的结构错误

我正在使用 milo 0.5.4 来设置我自己的 OpCUA 服务器。

现在我尝试使用一个复杂的数据类型,它应该在一个结构中包含一个结构。

但是当连接到UAExpert客户端时,显示如下错误信息:

UaBsdReader::evaluateTypeName: 无法确定 TypeName ua: Structure 的数据类型

BsdReader 无法在字段状态中解释类型 ua:Structure

下面我添加了UAExpert结果的图片

我猜这个问题与 registerToxStructType() 中的 Identifiers.Structure 有关。但我不知道这里还应该使用什么。 我希望那里的任何人都可以给我提示?

new StructureField("status",LocalizedText.NULL_VALUE,Identifiers.Structure,ValueRanks.Scalar,null,uint(0),false) };

这是我第一次注册结构:

    private void registerStatusStructType() throws Exception {
        // Get the NodeId for the DataType and encoding Nodes.

        NodeId dataTypeId = StatusStructType.TYPE_ID.toNodeIdOrThrow(getServer().getNamespaceTable());

        NodeId binaryEncodingId = StatusStructType.BINARY_ENCODING_ID.toNodeIdOrThrow(getServer().getNamespaceTable());
        
        dictionaryManager.registerStructureCodec(new StatusStructType.Codec(),"StatusStructType",dataTypeId,binaryEncodingId ); ///,parentTypeId);
        

        StructureField[] fields = new StructureField[] { new StructureField("type",Identifiers.String,false),new StructureField("text",new StructureField("source",false) };

        StructureDefinition definition = new StructureDefinition(binaryEncodingId,StructureType.Structure,fields);

        StructureDescription description = new StructureDescription(dataTypeId,new QualifiedName(getNamespaceIndex(),"StatusStructType"),definition);

        dictionaryManager.registerStructureDescription(description,binaryEncodingId);

    }

这是我想包含第一个结构的注册:

    private void registerToxStructType() throws Exception {
        // Get the NodeId for the DataType and encoding Nodes.

        NodeId dataTypeId = ToxStructType.TYPE_ID.toNodeIdOrThrow(getServer().getNamespaceTable());

        NodeId binaryEncodingId = ToxStructType.BINARY_ENCODING_ID.toNodeIdOrThrow(getServer().getNamespaceTable());

        dictionaryManager.registerStructureCodec(new ToxStructType.Codec(),"ToxStructType",binaryEncodingId);
        
        StructureField[] fields = new StructureField[] { 
                new StructureField("foo",getServer().getConfig().getLimits().getMaxStringLength(),new StructureField("bar",Identifiers.Int32,new StructureField("baz",Identifiers.Boolean,//};
                new StructureField("status","ToxStructType"),binaryEncodingId);
    }

这是添加ToxStructType的函数

    private void addToxStructTypeVariable(UaFolderNode rootFolder) throws Exception {
        NodeId dataTypeId = ToxStructType.TYPE_ID.toNodeIdOrThrow(getServer().getNamespaceTable());

        NodeId binaryEncodingId = ToxStructType.BINARY_ENCODING_ID.toNodeIdOrThrow(getServer().getNamespaceTable());

        UaVariableNode ToxStructTypeVariable = UaVariableNode.builder(getNodeContext())
                                                             .setNodeId(newNodeId("ThisIsMyPart/ToxStructTypeVariable"))
                                                             .setAccessLevel(AccessLevel.READ_WRITE)
                                                             .setUserAccessLevel(AccessLevel.READ_WRITE)
                                                             .setBrowseName(newQualifiedName("ToxStructTypeVariable"))
                                                             .setDisplayName(LocalizedText.english("ToxStructTypeVariable"))
                                                             .setDataType(dataTypeId)
                                                             .setTypeDefinition(Identifiers.BaseDataVariableType)
                                                             .build();
        
        StatusStructType statestruct = new StatusStructType("Error 0010","Error 0010 occured! 0x0F","Device 0010?");

        ToxStructType value = new ToxStructType("foo",42,true,statestruct );

        ExtensionObject xo = ExtensionObject.encodeDefaultBinary(getServer().getSerializationContext(),value,binaryEncodingId);

        ToxStructTypeVariable.setValue(new DataValue(new Variant(xo)));

        getNodeManager().addNode(ToxStructTypeVariable);

        ToxStructTypeVariable.addReference(new Reference(ToxStructTypeVariable.getNodeId(),Identifiers.Organizes,rootFolder.getNodeId().expanded(),false));
    }   

结构 ToxStructType.java:

package com.toxware.export.opcua.communication.server.util;

import org.eclipse.milo.opcua.stack.core.UaSerializationException;
import org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamDecoder;
import org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder;
import org.eclipse.milo.opcua.stack.core.serialization.SerializationContext;
import org.eclipse.milo.opcua.stack.core.serialization.UaStructure;
import org.eclipse.milo.opcua.stack.core.serialization.codecs.OpcUaBinaryDataTypeCodec;
import org.eclipse.milo.opcua.stack.core.types.builtin.ExpandedNodeId;

import com.toxware.export.opcua.communication.server.ToxNamespaceDRX;

public class ToxStructType implements UaStructure {

    public static final ExpandedNodeId TYPE_ID = ExpandedNodeId.parse(String.format("nsu=%s;s=%s",ToxNamespaceDRX.NAMESPACE_URI,"DataType.ToxStructType"));

    public static final ExpandedNodeId BINARY_ENCODING_ID = ExpandedNodeId.parse(String.format("nsu=%s;s=%s","DataType.ToxStructType.BinaryEncoding"));

    private final String foo;
    private final Integer bar;
    private final boolean baz;
    private final StatusStructType status;

    @Override
    public ExpandedNodeId getTypeId() {
        return TYPE_ID;
    }

    public ToxStructType(String foo,Integer bar,boolean baz,StatusStructType status) {
        this.foo = foo;
        this.bar = bar;
        this.baz = baz;
        this.status = status;
    }

    public ToxStructType() {
        this(null,false,new StatusStructType());
    }

    public static class Codec implements OpcUaBinaryDataTypeCodec<ToxStructType> {
        @Override
        public Class<ToxStructType> getType() {
            return ToxStructType.class;
        }

        @Override
        public ToxStructType decode(SerializationContext context,OpcUaBinaryStreamDecoder reader) throws UaSerializationException {
            String foo = reader.readString("foo");
            Integer bar = reader.readInt32("bar");
            boolean baz = reader.readBoolean("baz");
            Object statusStruct = reader.readStruct("status",new StatusStructType.Codec());
            StatusStructType statusStructure = new StatusStructType();
            if (statusStruct.getClass().isAssignableFrom(StatusStructType.class)) {
                statusStructure = (StatusStructType) statusStruct;
            }
            return new ToxStructType(foo,bar,baz,statusStructure);
        }

        @Override
        public void encode(SerializationContext context,OpcUaBinaryStreamEncoder writer,ToxStructType value) throws UaSerializationException {
            writer.writeString("foo",value.foo);
            writer.writeInt32("bar",value.bar);
            writer.writeBoolean("baz",value.baz);
            writer.writeStruct("status",value.status,StatusStructType.TYPE_ID);
        }
    }

}

StatusStructType.java:

package com.toxware.export.opcua.communication.server.util;

import org.eclipse.milo.opcua.stack.core.UaSerializationException;
import org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamDecoder;
import org.eclipse.milo.opcua.stack.core.serialization.OpcUaBinaryStreamEncoder;
import org.eclipse.milo.opcua.stack.core.serialization.SerializationContext;
import org.eclipse.milo.opcua.stack.core.serialization.UaStructure;
import org.eclipse.milo.opcua.stack.core.serialization.codecs.OpcUaBinaryDataTypeCodec;
import org.eclipse.milo.opcua.stack.core.types.builtin.ExpandedNodeId;

import com.toxware.export.opcua.communication.server.ToxNamespaceDRX;

public class StatusStructType implements UaStructure {

    public static final ExpandedNodeId TYPE_ID = ExpandedNodeId.parse(String.format("nsu=%s;s=%s","DataType.StatusStructType"));

    public static final ExpandedNodeId BINARY_ENCODING_ID = ExpandedNodeId.parse(String.format("nsu=%s;s=%s","DataType.StatusStructType.BinaryEncoding"));

    String type = "txt_0";
    String text = "txt_1";
    String source = "txt_2";

    @Override
    public ExpandedNodeId getTypeId() {
        return TYPE_ID;
    }

    public StatusStructType(String type,String text,String source) {
        this.type = type;
        this.text = text;
        this.source = source;

    }

    public StatusStructType() {
        this("","","");
    }

    public static class Codec implements OpcUaBinaryDataTypeCodec<StatusStructType> {
        @Override
        public Class<StatusStructType> getType() {
            return StatusStructType.class;
        }

        @Override
        public StatusStructType decode(SerializationContext context,OpcUaBinaryStreamDecoder reader) throws UaSerializationException {
            String type = reader.readString("type");
            String text = reader.readString("text");
            String source = reader.readString("source");
            return new StatusStructType(type,text,source);
        }

        @Override
        public void encode(SerializationContext context,StatusStructType value) throws UaSerializationException {
            writer.writeString("type",value.type);
            writer.writeString("text",value.text);
            writer.writeString("source",value.source);
        }
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

}

UAExpert Result / ErrorMessage

解决方法

我猜这个问题与 registerToxStructType() 中的 Identifiers.Structure 有关。但我不知道这里还应该使用什么。我希望那里的任何人都可以给我提示?

您应该使用标识 StatusStructType (StatusStructType.TYPE_ID) 的 NodeId。

我不知道这是否能完全解决您的问题,但这是一个很好的第一步。

,

现在可以了。解决方案是: 在 StructureField[] 字段定义中的函数 registerToxStructType() 中,我必须替换 标识符.结构 经过 StatusStructType.TYPE_ID.toNodeIdOrThrow(getServer().getNamespaceTable())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res