如何在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
相关产品推荐
相关产品推荐

