int main(int argc, char** argv) { signal(SIGINT, stopHandler); /* catches ctrl-c */ /* initialize the server */ UA_ServerConfig config = UA_ServerConfig_standard; UA_ServerNetworkLayer nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 16664); config.logger = Logger_Stdout; config.networkLayers = &nl; config.networkLayersSize = 1; UA_Server *server = UA_Server_new(config); //EXAMPLE 1 /* add the method node with the callback */ UA_Argument inputArguments; UA_Argument_init(&inputArguments); inputArguments.arrayDimensionsSize = 0; inputArguments.arrayDimensions = NULL; inputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId; inputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String"); inputArguments.name = UA_STRING("MyInput"); inputArguments.valueRank = -1; UA_Argument outputArguments; UA_Argument_init(&outputArguments); outputArguments.arrayDimensionsSize = 0; outputArguments.arrayDimensions = NULL; outputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId; outputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String"); outputArguments.name = UA_STRING("MyOutput"); outputArguments.valueRank = -1; UA_MethodAttributes helloAttr; UA_MethodAttributes_init(&helloAttr); helloAttr.description = UA_LOCALIZEDTEXT("en_US","Say `Hello World`"); helloAttr.displayName = UA_LOCALIZEDTEXT("en_US","Hello World"); helloAttr.executable = true; helloAttr.userExecutable = true; UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1,62541), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_QUALIFIEDNAME(1, "hello world"), helloAttr, &helloWorldMethod, NULL, 1, &inputArguments, 1, &outputArguments, NULL); //END OF EXAMPLE 1 //EXAMPLE 2 /* add another method node: output argument as 1d Int32 array*/ // define input arguments UA_Argument_init(&inputArguments); inputArguments.arrayDimensionsSize = 1; UA_UInt32 * pInputDimensions = UA_UInt32_new(); pInputDimensions[0] = 5; inputArguments.arrayDimensions = pInputDimensions; inputArguments.dataType = UA_TYPES[UA_TYPES_INT32].typeId; inputArguments.description = UA_LOCALIZEDTEXT("en_US", "input an array with 5 elements, type int32"); inputArguments.name = UA_STRING("int32 value"); inputArguments.valueRank = 1; // define output arguments UA_Argument_init(&outputArguments); outputArguments.arrayDimensionsSize = 1; UA_UInt32 * pOutputDimensions = UA_UInt32_new(); pOutputDimensions[0] = 5; outputArguments.arrayDimensions = pOutputDimensions; outputArguments.dataType = UA_TYPES[UA_TYPES_INT32].typeId; outputArguments.description = UA_LOCALIZEDTEXT("en_US", "increment each array index"); outputArguments.name = UA_STRING("output is the array, each index is incremented by one"); outputArguments.valueRank = 1; UA_MethodAttributes incAttr; UA_MethodAttributes_init(&incAttr); incAttr.description = UA_LOCALIZEDTEXT("en_US","1dArrayExample"); incAttr.displayName = UA_LOCALIZEDTEXT("en_US","1dArrayExample"); incAttr.executable = true; incAttr.userExecutable = true; UA_Server_addMethodNode(server, UA_NODEID_STRING(1, "IncInt32ArrayValues"), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_QUALIFIEDNAME(1, "IncInt32ArrayValues"), incAttr, &IncInt32ArrayValuesMethod, NULL, 1, &inputArguments, 1, &outputArguments, NULL); //END OF EXAMPLE 2 /* start server */ UA_StatusCode retval = UA_Server_run(server, &running); /* ctrl-c received -> clean up */ UA_UInt32_delete(pInputDimensions); UA_UInt32_delete(pOutputDimensions); UA_Server_delete(server); nl.deleteMembers(&nl); return retval; }
int main(int argc, char** argv) { signal(SIGINT, stopHandler); /* catches ctrl-c */ /* initialize the server */ UA_ServerConfig config = UA_ServerConfig_standard; UA_ServerNetworkLayer nl; nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 16664); config.networkLayers = &nl; config.networkLayersSize = 1; UA_Server *server = UA_Server_new(config); /* Example 1 */ /* add the method node with the callback */ UA_Argument inputArguments1; UA_Argument_init(&inputArguments1); inputArguments1.arrayDimensionsSize = 0; inputArguments1.arrayDimensions = NULL; inputArguments1.dataType = UA_TYPES[UA_TYPES_STRING].typeId; inputArguments1.description = UA_LOCALIZEDTEXT("en_US", "A String"); inputArguments1.name = UA_STRING("MyInput"); inputArguments1.valueRank = -1; UA_Argument outputArguments1; UA_Argument_init(&outputArguments1); outputArguments1.arrayDimensionsSize = 0; outputArguments1.arrayDimensions = NULL; outputArguments1.dataType = UA_TYPES[UA_TYPES_STRING].typeId; outputArguments1.description = UA_LOCALIZEDTEXT("en_US", "A String"); outputArguments1.name = UA_STRING("MyOutput"); outputArguments1.valueRank = -1; UA_MethodAttributes helloAttr; UA_MethodAttributes_init(&helloAttr); helloAttr.description = UA_LOCALIZEDTEXT("en_US","Say `Hello World`"); helloAttr.displayName = UA_LOCALIZEDTEXT("en_US","Hello World"); helloAttr.executable = true; helloAttr.userExecutable = true; UA_Server_addMethodNode(server, UA_NODEID_NUMERIC(1,62541), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_HASORDEREDCOMPONENT), UA_QUALIFIEDNAME(1, "hello world"), helloAttr, &helloWorldMethod, NULL, 1, &inputArguments1, 1, &outputArguments1, NULL); /* Example 2 */ /* add another method node: output argument as 1d Int32 array*/ UA_Argument inputArguments2; UA_Argument_init(&inputArguments2); inputArguments2.arrayDimensionsSize = 1; UA_UInt32 * pInputDimensions = UA_UInt32_new(); pInputDimensions[0] = 5; inputArguments2.arrayDimensions = pInputDimensions; inputArguments2.dataType = UA_TYPES[UA_TYPES_INT32].typeId; inputArguments2.description = UA_LOCALIZEDTEXT("en_US", "input an array with 5 elements, type int32"); inputArguments2.name = UA_STRING("int32 value"); inputArguments2.valueRank = 1; UA_Argument outputArguments2; UA_Argument_init(&outputArguments2); outputArguments2.arrayDimensionsSize = 1; UA_UInt32 * pOutputDimensions = UA_UInt32_new(); pOutputDimensions[0] = 5; outputArguments2.arrayDimensions = pOutputDimensions; outputArguments2.dataType = UA_TYPES[UA_TYPES_INT32].typeId; outputArguments2.description = UA_LOCALIZEDTEXT("en_US", "increment each array index"); outputArguments2.name = UA_STRING("output is the array, " "each index is incremented by one"); outputArguments2.valueRank = 1; UA_MethodAttributes incAttr; UA_MethodAttributes_init(&incAttr); incAttr.description = UA_LOCALIZEDTEXT("en_US", "1dArrayExample"); incAttr.displayName = UA_LOCALIZEDTEXT("en_US", "1dArrayExample"); incAttr.executable = true; incAttr.userExecutable = true; UA_Server_addMethodNode(server, UA_NODEID_STRING(1, "IncInt32ArrayValues"), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_QUALIFIEDNAME(1, "IncInt32ArrayValues"), incAttr, &IncInt32ArrayValuesMethod, NULL, 1, &inputArguments2, 1, &outputArguments2, NULL); /* Example 3 */ UA_MethodAttributes method3Attr; UA_MethodAttributes_init(&method3Attr); method3Attr.description = UA_LOCALIZEDTEXT("en_US", "FooBar"); method3Attr.displayName = UA_LOCALIZEDTEXT("en_US", "FooBar"); method3Attr.executable = true; method3Attr.userExecutable = true; UA_Server_addMethodNode(server, UA_NODEID_STRING(1, "FooBar"), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_QUALIFIEDNAME(1, "FooBar"), method3Attr, NULL, NULL, 1, &inputArguments1, 1, &outputArguments1, NULL); /* If the method node has no callback (because it was instantiated without * one) or if we just want to change it, this can be done * UA_Server_setMethodNode_callback() */ UA_Server_setMethodNode_callback(server, UA_NODEID_NUMERIC(1,62542), &fooBarMethod, NULL); /* start server */ UA_StatusCode retval = UA_Server_run(server, &running); /* ctrl-c received -> clean up */ UA_UInt32_delete(pInputDimensions); UA_UInt32_delete(pOutputDimensions); UA_Server_delete(server); nl.deleteMembers(&nl); return (int)retval; }