QOpcUaGenericStructHandler 类

读取服务器的数据类型,并将通用结构从扩展对象进行解码/编码。 更多信息...

头文件 #include <QOpcUaGenericStructHandler>
CMakefind_package(Qt6 REQUIRED COMPONENTS OpcUa)
target_link_libraries(mytarget PRIVATE Qt6::OpcUa)
qmakeQT += opcua
Qt 6.7
继承 QObject

公共类型

枚举类DataTypeKind { Unknown, Struct, Enum, Other }

公共函数

QOpcUaGenericStructHandler(QOpcUaClient *client, QObject *parent = nullptr)
booladdCustomEnumDefinition(const QOpcUaEnumDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)
booladdCustomStructureDefinition(const QOpcUaStructureDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)
QOpcUaGenericStructValuecreateGenericStructValueForTypeId(const QString &typeId)
QOpcUaGenericStructHandler::DataTypeKinddataTypeKindForTypeId(const QString &id) const
std::optional<QOpcUaGenericStructValue>decode(const QOpcUaExtensionObject &extensionObject) const
std::optional<QOpcUaExtensionObject>encode(const QOpcUaGenericStructValue &value)
QOpcUaEnumDefinitionenumDefinitionForTypeId(const QString &id) const
boolinitialize()
(since 6.7) boolinitialized() const
boolisAbstractTypeId(const QString &id) const
QOpcUaStructureDefinitionstructureDefinitionForBinaryEncodingId(const QString &id) const
QOpcUaStructureDefinitionstructureDefinitionForTypeId(const QString &id) const
QStringtypeIdForBinaryEncodingId(const QString &id) const
QStringtypeNameForBinaryEncodingId(const QString &id) const
QStringtypeNameForTypeId(const QString &id) const

信号

voidinitializedChanged(bool initialized)

详细描述

OPC UA中使用的二进制数据编码旨在设计小消息大小,不包含关于数据结构的任何信息。这意味着解码器必须事先知道编码数据的结构,才能解码数据缓冲区。

从OPC UA 1.04开始,DataType节点类的节点可能具有DataTypeDefinition属性,该属性包含有关结构化类型字段的信息以及枚举值到名称的映射。结合关于如何解码内置类型的知识,这允许客户端不需要依赖外部知识即可解码通用的自定义结构化类型。

QOpcUaGenericStructHandler通过从BaseDataType开始遍历服务器的类型层次结构,并读取节点的DataTypeDefinition属性。

对于在DataTypeDefinition属性中包含QOpcUaStructureDefinition值的结构化类型,可以自动解码包含它们的扩展对象。具有内置类型或存在C++数据类的类型字段的序列化转换为相应的Qt OPC UA类型,其他通用结构序列化为一个嵌套的QOpcUaGenericStructValue。所有嵌套的通用结构值必须在服务器中有QOpcUaStructureDefinition,否则解码失败。

将结构化数据编码的自定义结构相同。

自定义结构的解码示例

QOpcUaGenericStructHandler handler(opcuaClient);
handler.initialize();

QObject::connect(&handler, &QOpcUaGenericStructHandler::initializedChanged, [opcuaClient, &handler](bool initialized) {
    if (!initialized)
        return;

    auto node = opcuaClient->node("ns=4;i=3003"); // A custom struct test node in the open62541-testserver
    node->readValueAttribute();

    QObject::connect(node, &QOpcUaNode::attributeRead, [node, &handler](QOpcUa::NodeAttributes attr) {
        if (!attr.testFlag(QOpcUa::NodeAttribute::Value) || node->valueAttributeError() != QOpcUa::UaStatusCode::Good)
            return;

        auto extObj = node->valueAttribute().value<QOpcUaExtensionObject>();
        qDebug() << "Got object of type" << handler.typeNameForBinaryEncodingId(extObj.encodingTypeId());

        const auto result = handler.decode(extObj);

        if (!result)
            return;

        qDebug() << *result;
    });
});

自定义结构的编码示例

QOpcUaGenericStructHandler handler(opcuaClient);
handler.initialize();

QObject::connect(&handler, &QOpcUaGenericStructHandler::initializedChanged, [opcuaClient, &handler](bool initialized) {
    if (!initialized)
        return;

    QOpcUaGenericStructValue value = handler.createGenericStructValueForTypeId("ns=4;i=3006");
    value.fieldsRef()["MandatoryMember"] = 23.0;
    value.fieldsRef()["OptionalMember"] = 42.0;

    const auto ext = handler.encode(value);

    if (!ext)
        return;

    // Use the extension object to write a node's value attribute, in a method parameter, etc...
});

成员类型文档

枚举类型 QOpcUaGenericStructHandler::DataTypeKind

此枚举类型指定数据类型节点的数据类型。

常量描述
QOpcUaGenericStructHandler::DataTypeKind::Unknown0类型节点id是未知的。
QOpcUaGenericStructHandler::DataTypeKind::Struct1类型节点id属于结构化类型。
QOpcUaGenericStructHandler::DataTypeKind::Enum2类型节点id属于枚举类型。
QOpcUaGenericStructHandler::DataTypeKind::Other3类型节点id属于不属于结构或枚举的类型(其他内置类型或它们的子类型)

成员函数文档

[显式] QOpcUaGenericStructHandler::QOpcUaGenericStructHandler(QOpcUaClient *client, QObject *parent = nullptr)

client构造一个通用结构处理器。

bool QOpcUaGenericStructHandler::addCustomEnumDefinition(const QOpcUaEnumDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)

将自定义枚举定义definition添加到已知类型中。这可以用来支持服务器不暴露结构定义的自定义结构。参数definitiontypeIdname对于适当的解码和编码是必需的。如果isAbstract被设置,则此类型无法编码和解码。

如果枚举定义已成功添加,则返回true

bool QOpcUaGenericStructHandler::addCustomStructureDefinition(const QOpcUaStructureDefinition &definition, const QString &typeId, const QString &name, QOpcUa::IsAbstract isAbstract = QOpcUa::IsAbstract::NotAbstract)

将自定义结构定义 definition 添加到已知类型中。这可以用于支持服务器没有暴露结构定义的自定义结构。参数definitiontypeIdname 对于适当的解码和编码是必需的。如果 isAbstract 被设置,则类型不能被编码和解码。

如果结构定义成功添加,则返回 true

QOpcUaGenericStructValue QOpcUaGenericStructHandler::createGenericStructValueForTypeId(const QString &typeId)

返回一个通用结构值,该值预先填充了结构定义、与 typeId 对应的类型 ID 和类型名称。对于所有必填字段,将插入一个无效的占位符 QVariant

QOpcUaGenericStructHandler::DataTypeKind QOpcUaGenericStructHandler::dataTypeKindForTypeId(const QString &id) const

返回类型节点 ID id 的数据类型种类。

std::optional<QOpcUaGenericStructValue> QOpcUaGenericStructHandler::decode(const QOpcUaExtensionObject &extensionObject) const

extensionObject 解码为 QOpcUaGenericStructValue。如果解码失败,返回 std::nullopt

std::optional<QOpcUaExtensionObject> QOpcUaGenericStructHandler::encode(const QOpcUaGenericStructValue &value)

返回 value 编码为 QOpcUaExtensionObject,或者在无法编码值时返回 std::nullopt

QOpcUaEnumDefinition QOpcUaGenericStructHandler::enumDefinitionForTypeId(const QString &id) const

返回类型节点 ID idQOpcUaEnumDefinition。如果节点 ID 未知或不属于枚举类型,则返回默认构造的值。

bool QOpcUaGenericStructHandler::initialize()

开始数据类型层次遍历。成功或失败将通过 initializedChanged 信号报告。

如果无法启动操作,则返回 false

[自 6.7] bool QOpcUaGenericStructHandler::initialized() const

如果通用结构处理程序已初始化,则返回 true

此函数从 Qt 6.7 开始引入。

[信号] void QOpcUaGenericStructHandler::initializedChanged(bool initialized)

当初始化过程完成时,将发出此信号。initialized 表示初始化是否成功。

bool QOpcUaGenericStructHandler::isAbstractTypeId(const QString &id) const

如果由 id 描述的数据类型是抽象的,则返回 true。

QOpcUaStructureDefinition QOpcUaGenericStructHandler::structureDefinitionForBinaryEncodingId(const QString &id) const

返回二进制编码节点标识符 id 对应的 QOpcUaStructureDefinition。如果节点标识符未知或不属于结构类型,则返回默认构造的值。

QOpcUaStructureDefinition QOpcUaGenericStructHandler::structureDefinitionForTypeId(const QString &id) const

返回类型节点标识符 id 对应的 QOpcUaStructureDefinition。如果节点标识符未知或不属于结构类型,则返回默认构造的值。

QString QOpcUaGenericStructHandler::typeIdForBinaryEncodingId(const QString &id) const

返回与二进制编码标识符 id 相关的类型节点标识符。

QString QOpcUaGenericStructHandler::typeNameForBinaryEncodingId(const QString &id) const

返回属于二进制编码节点标识符 id 的类型名称。如果节点标识符未知或不属于结构类型,则返回空字符串。

QString QOpcUaGenericStructHandler::typeNameForTypeId(const QString &id) const

返回由类型节点标识符 id 识别的数据类型节点的类型名称。如果节点标识符未知,则返回空字符串。

© 2024 The Qt Company Ltd. 此处包含的文档贡献是各自所有者的版权。此处提供的文档是根据由自由软件基金会发布的 GNU自由文档许可证版本1.3 的条款提供的。Qt及其相关标志是芬兰的The Qt Company Ltd.在芬兰和/或其他国家和地区的商标。所有其他商标均为各自所有者的财产。