You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Open62541中创建无输入参数的方法节点?

如何用Open62541 1.0创建无输入参数的方法节点

核心思路

创建无输入参数的方法节点,关键是在调用UA_Server_addMethodNode时,将输入参数数组设为空,同时正确定义输出参数和方法回调函数。

完整代码示例

下面是一个可运行的最小示例,创建一个无输入、返回整数类型结果的方法节点:

#include <open62541/server.h>
#include <open62541/server_config_default.h>
#include <signal.h>
#include <stdlib.h>

static volatile UA_Boolean running = true;

// 方法回调函数:无输入,返回一个整数
static UA_StatusCode methodCallback(UA_Server *server,
                                    const UA_NodeId *sessionId, void *sessionContext,
                                    const UA_NodeId *methodId, void *methodContext,
                                    const UA_NodeId *objectId, void *objectContext,
                                    size_t inputSize, const UA_Variant *input,
                                    size_t outputSize, UA_Variant *output) {
    // 无输入参数,inputSize为0,无需处理input数组
    
    // 设置返回值:这里返回固定整数42
    UA_Int32 result = 42;
    UA_Variant_setScalar(output, &result, &UA_TYPES[UA_TYPES_INT32]);
    
    return UA_STATUSCODE_GOOD;
}

static void stopHandler(int sign) {
    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "Received Ctrl-C, shutting down...");
    running = false;
}

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

    UA_Server *server = UA_Server_new();
    UA_ServerConfig_setDefault(UA_Server_getConfig(server));

    // 1. 定义输出参数的元数据
    UA_Argument outputArgument;
    UA_Argument_init(&outputArgument);
    UA_String_copy(UA_STRING("Result"), &outputArgument.name);
    UA_String_copy(UA_STRING("The result of the method call"), &outputArgument.description);
    outputArgument.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
    outputArgument.valueRank = UA_VALUERANK_SCALAR;

    // 2. 添加方法节点到服务器
    UA_NodeId methodNodeId = UA_NODEID_NUMERIC(1, 62541); // 自定义节点ID
    UA_QualifiedName methodName = UA_QUALIFIEDNAME(1, "getFixedResult");
    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER); // 挂载到Objects文件夹
    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);

    UA_Server_addMethodNode(server, methodNodeId, parentNodeId,
                            parentReferenceNodeId, methodName,
                            UA_NODEID_NUMERIC(0, UA_NS0ID_METHODTYPE),
                            UA_EMPTY_ARRAY, 0, // 输入参数数组为空,长度0
                            &outputArgument, 1, // 输出参数数组,长度1
                            methodCallback, NULL, NULL);

    // 启动服务器
    UA_StatusCode retval = UA_Server_run(server, &running);

    // 清理资源
    UA_Argument_clear(&outputArgument);
    UA_Server_delete(server);
    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
}

关键细节说明

  • 回调函数:inputSize参数会是0,直接跳过输入参数的处理,专注于设置output变量的值即可。
  • 输入参数设置:调用UA_Server_addMethodNode时,传入UA_EMPTY_ARRAY作为输入参数数组,0作为输入参数长度,这样就定义了无输入的方法。
  • 输出参数定义:必须明确指定输出参数的数据类型、名称等元数据,客户端才能正确解析返回值。
  • 节点挂载:示例中将方法挂载到NS0的Objects文件夹下,你可以根据需求修改parentNodeId来指定挂载位置。

编译与运行

用以下命令编译(假设文件名为server_method_no_input.c):

gcc server_method_no_input.c -o server_method_no_input -lopen62541

运行后,客户端可以调用getFixedResult方法,无需传入任何参数,就能得到返回值42。

内容的提问来源于stack exchange,提问作者Alexandre Martuscelli Faria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:05:33