int main(int argc, char** argv) { signal(SIGINT, stopHandler); /* catches ctrl-c */ UA_Server *server = UA_Server_new(UA_ServerConfig_standard); UA_Server_setLogger(server, logger); UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664)); UA_Int32 myInteger = 42; /* add a variable node to the address space */ UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer"); UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer"); UA_DataSource dateDataSource = (UA_DataSource) { .handle = &myInteger, .read = readInteger, .write = writeInteger}; UA_VariableAttributes attr; UA_VariableAttributes_init(&attr); attr.description = UA_LOCALIZEDTEXT("en_US","the answer"); attr.displayName = UA_LOCALIZEDTEXT("en_US","the answer"); UA_Server_addDataSourceVariableNode(server, myIntegerNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), myIntegerName, UA_NODEID_NULL, attr, dateDataSource, NULL); UA_StatusCode retval = UA_Server_run(server, 1, &running); UA_Server_delete(server); return retval; }
int main(int argc, char** argv) { signal(SIGINT, stopHandler); /* catches ctrl-c */ #ifdef UA_MULTITHREADING pthread_rwlock_init(&writeLock, 0); #endif UA_Server *server = UA_Server_new(UA_ServerConfig_standard); logger = Logger_Stdout_new(); UA_Server_setLogger(server, logger); UA_ByteString certificate = loadCertificate(); UA_Server_setServerCertificate(server, certificate); UA_ByteString_deleteMembers(&certificate); UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664)); // add node with the datetime data source UA_DataSource dateDataSource = (UA_DataSource) {.handle = NULL, .read = readTimeData, .release = releaseTimeData, .write = NULL}; const UA_QualifiedName dateName = UA_QUALIFIEDNAME(1, "current time"); UA_Server_addDataSourceVariableNode(server, dateDataSource, dateName, UA_NODEID_NULL, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES)); //cpu temperature monitoring for linux machines if((temperatureFile = fopen("/sys/class/thermal/thermal_zone0/temp", "r"))){ // add node with the data source UA_DataSource temperatureDataSource = (UA_DataSource) {.handle = NULL, .read = readTemperature, .release = releaseTemperature, .write = NULL}; const UA_QualifiedName tempName = UA_QUALIFIEDNAME(1, "cpu temperature"); UA_Server_addDataSourceVariableNode(server, temperatureDataSource, tempName, UA_NODEID_NULL, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES)); }
int main(int argc, char** argv) { signal(SIGINT, stopHandler); /* catches ctrl-c */ /* initialize the server */ UA_Server *server = UA_Server_new(UA_ServerConfig_standard); UA_Server_setLogger(server, logger); UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664)); //EXAMPLE 1 /* add the method node with the callback */ UA_Argument inputArguments; UA_Argument_init(&inputArguments); inputArguments.arrayDimensionsSize = -1; 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 = -1; 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 = UA_TRUE; helloAttr.userExecutable = UA_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 = UA_TRUE; incAttr.userExecutable = UA_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, 1, &running); /* ctrl-c received -> clean up */ UA_UInt32_delete(pInputDimensions); UA_UInt32_delete(pOutputDimensions); UA_Server_delete(server); return retval; }