int main(int argc, char** argv) { signal(SIGINT, stopHandler); /* catches ctrl-c */ UA_ServerConfig config = UA_ServerConfig_standard; UA_ServerNetworkLayer nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 16664); config.networkLayers = &nl; config.networkLayersSize = 1; UA_Server *server = UA_Server_new(config); /* add a variable node to the address space */ UA_Int32 myInteger = 42; 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, &running); UA_Server_delete(server); nl.deleteMembers(&nl); return (int)retval; }
//#######################################MAIN####################################### int main(int argc, char** argv) { signal(SIGINT, stopHandler); /* catches ctrl-c */ if (gpioInitialise() < 0) { fprintf(stderr, "pigpio initialisation failed\n"); return 1; } gpioSetMode(17, PI_OUTPUT); gpioSetMode(22, PI_INPUT); gpioSetMode(24, PI_OUTPUT); UA_ServerConfig config = UA_ServerConfig_standard; UA_ServerNetworkLayer nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 16664); config.networkLayers = &nl; config.networkLayersSize = 1; UA_Server *server = UA_Server_new(config); /* add a variable node to the address space */ UA_Int32 myIntegerB = 32; UA_NodeId myIntegerBNodeId = UA_NODEID_STRING(1, "button"); UA_QualifiedName myIntegerBName = UA_QUALIFIEDNAME(1, "button"); UA_DataSource dateDataSource = (UA_DataSource) { .handle = &myIntegerB, .read = readIntegerB, .write = writeIntegerB}; UA_VariableAttributes attr; UA_VariableAttributes_init(&attr); attr.description = UA_LOCALIZEDTEXT("en_US","button_on_off"); attr.displayName = UA_LOCALIZEDTEXT("en_US","button"); UA_Server_addDataSourceVariableNode(server, myIntegerBNodeId, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), myIntegerBName, UA_NODEID_NULL, attr, dateDataSource, NULL); /* add a repeated job to the server */ UA_Job job = {.type = UA_JOBTYPE_METHODCALL, .job.methodCall = {.method = testCallback, .data = NULL} }; UA_Server_addRepeatedJob(server, job, 2000, NULL); // call every 2 sec UA_StatusCode retval = UA_Server_run(server, &running); UA_Server_delete(server); nl.deleteMembers(&nl); return (int)retval; }
int main(int argc, char** argv) { signal(SIGINT, stopHandler); /* catches ctrl-c */ #ifdef UA_ENABLE_MULTITHREADING pthread_rwlock_init(&writeLock, 0); #endif UA_ServerNetworkLayer nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 16664); UA_ServerConfig config = UA_ServerConfig_standard; config.serverCertificate = loadCertificate(); config.networkLayers = &nl; config.networkLayersSize = 1; UA_Server *server = UA_Server_new(config); // add node with the datetime data source UA_DataSource dateDataSource = (UA_DataSource) {.handle = NULL, .read = readTimeData, .write = NULL}; UA_VariableAttributes v_attr; UA_VariableAttributes_init(&v_attr); v_attr.description = UA_LOCALIZEDTEXT("en_US","current time"); v_attr.displayName = UA_LOCALIZEDTEXT("en_US","current time"); v_attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE; const UA_QualifiedName dateName = UA_QUALIFIEDNAME(1, "current time"); UA_NodeId dataSourceId; UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), dateName, UA_NODEID_NULL, v_attr, dateDataSource, &dataSourceId); #ifndef _WIN32 /* cpu temperature monitoring for linux machines */ const char *temperatureFileName = "/sys/class/thermal/thermal_zone0/temp"; // RaspberryPi // const char *temperatureFileName = "/sys/class/hwmon/hwmon0/device/temp1_input"; // Beaglebone // const char *temperatureFileName = "/sys/class/thermal/thermal_zone3/temp"; // Intel Edison Alternative 1 // const char *temperatureFileName = "/sys/class/thermal/thermal_zone4/temp"; // Intel Edison Alternative 2 if((temperatureFile = fopen(temperatureFileName, "r"))) { // add node with the data source UA_DataSource temperatureDataSource = (UA_DataSource) { .handle = NULL, .read = readTemperature, .write = NULL}; const UA_QualifiedName tempName = UA_QUALIFIEDNAME(1, "cpu temperature"); UA_VariableAttributes_init(&v_attr); v_attr.description = UA_LOCALIZEDTEXT("en_US","temperature"); v_attr.displayName = UA_LOCALIZEDTEXT("en_US","temperature"); v_attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE; UA_Server_addDataSourceVariableNode(server, UA_NODEID_NULL, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), tempName, UA_NODEID_NULL, v_attr, temperatureDataSource, NULL); }
int main(int argc, char** argv) { signal(SIGINT, stopHandler); /* catches ctrl-c */ UA_ServerConfig config = UA_ServerConfig_standard; UA_ServerNetworkLayer nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 16664); config.networkLayers = &nl; config.networkLayersSize = 1; UA_Server *server = UA_Server_new(config); /* add a repeated job to the server */ UA_Job job = {.type = UA_JOBTYPE_METHODCALL, .job.methodCall = {.method = testCallback, .data = NULL} }; UA_Server_addRepeatedJob(server, job, 2000, NULL); // call every 2 sec UA_StatusCode retval = UA_Server_run(server, &running); UA_Server_delete(server); nl.deleteMembers(&nl); return (int)retval; }
int main(int argc, char** argv) { signal(SIGINT, signalHandler); /* catch ctrl-c */ /* Create a server with one network layer listening on port 4840 */ UA_ServerConfig config = UA_ServerConfig_standard; UA_ServerNetworkLayer nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 4840); config.networkLayers = &nl; config.networkLayersSize = 1; UA_Server *server = UA_Server_new(config); /* Add a variable node */ UA_VariableAttributes attr; UA_VariableAttributes_init(&attr); attr.displayName = UA_LOCALIZEDTEXT("en_US", "Test Var"); UA_Int32 myInteger = 2572; UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]); UA_NodeId newNodeId = UA_NODEID_STRING(1, "Test.Var"); UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER); UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES); UA_NodeId variableType = UA_NODEID_NULL; /* take the default variable type */ UA_QualifiedName browseName = UA_QUALIFIEDNAME(1, "Test Node"); UA_DataSource dateDataSource = (UA_DataSource) {.handle = &myInteger, .read = onRead, .write = NULL}; UA_Server_addDataSourceVariableNode(server, newNodeId, parentNodeId, parentReferenceNodeId, browseName, UA_NODEID_NULL, attr, dateDataSource, NULL); UA_Job job = {.type = UA_JOBTYPE_METHODCALL, .job.methodCall = {.method = testCallback, .data = NULL} }; UA_Server_addRepeatedJob(server, job, 2000, NULL); // call every 2 sec /* Run the server loop */ UA_StatusCode status = UA_Server_run(server, &running); UA_Server_delete(server); nl.deleteMembers(&nl); return status; }
int main(int argc, char** argv) { signal(SIGINT, stopHandler); /* catches ctrl-c */ UA_ServerConfig config = UA_ServerConfig_standard; UA_ServerNetworkLayer nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 16664); config.networkLayers = &nl; config.networkLayersSize = 1; UA_Server *server = UA_Server_new(config); UA_StatusCode retval = UA_Server_run_startup(server); if(retval != UA_STATUSCODE_GOOD) goto cleanup; /* Should the server networklayer block (with a timeout) until a message arrives or should it return immediately? */ UA_Boolean waitInternal = false; while(running) { /* timeout is the maximum possible delay (in millisec) until the next _iterate call. Otherwise, the server might miss an internal timeout or cannot react to messages with the promised responsiveness. */ UA_UInt16 timeout = UA_Server_run_iterate(server, waitInternal); /* Now we can use the max timeout to do something else. In this case, we just sleep. (select is used as a platform-independent sleep function.) */ struct timeval tv; tv.tv_sec = 0; tv.tv_usec = timeout * 1000; select(0, NULL, NULL, NULL, &tv); } retval = UA_Server_run_shutdown(server); cleanup: UA_Server_delete(server); nl.deleteMembers(&nl); return (int)retval; }
int main(void) { signal(SIGINT, stopHandler); signal(SIGTERM, stopHandler); UA_ServerConfig config = UA_ServerConfig_standard; config.applicationDescription.applicationType = UA_APPLICATIONTYPE_DISCOVERYSERVER; config.applicationDescription.applicationUri = UA_String_fromChars("open62541.example.local_discovery_server"); // timeout in seconds when to automatically remove a registered server from the list, // if it doesn't re-register within the given time frame. A value of 0 disables automatic removal. // Default is 60 Minutes (60*60). Must be bigger than 10 seconds, because cleanup is only triggered approximately // ervery 10 seconds. // The server will still be removed depending on the state of the semaphore file. // config.discoveryCleanupTimeout = 60*60; UA_ServerNetworkLayer nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 4840); config.networkLayers = &nl; config.networkLayersSize = 1; UA_Server *server = UA_Server_new(config); UA_StatusCode retval = UA_Server_run(server, &running); UA_String_deleteMembers(&config.applicationDescription.applicationUri); UA_Server_delete(server); nl.deleteMembers(&nl); return (int)retval; }
int main(int argc, char** argv) { signal(SIGINT, stopHandler); /* catches ctrl-c */ UA_ServerConfig config = UA_ServerConfig_standard; UA_ServerNetworkLayer nl = UA_ServerNetworkLayerTCP(UA_ConnectionConfig_standard, 16664, logger); config.logger = Logger_Stdout; config.networkLayers = &nl; config.networkLayersSize = 1; UA_Server *server = UA_Server_new(config); /* add a variable node to the address space */ UA_VariableAttributes attr; UA_VariableAttributes_init(&attr); UA_Int32 myInteger = 42; UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]); attr.description = UA_LOCALIZEDTEXT("en_US","the answer"); attr.displayName = UA_LOCALIZEDTEXT("en_US","the answer"); UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer"); UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer"); UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER); UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES); UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId, parentReferenceNodeId, myIntegerName, UA_NODEID_NULL, attr, NULL, NULL); UA_ReadRequest request; UA_ReadRequest_init(&request); UA_ReadValueId rvi; rvi.nodeId = myIntegerNodeId; rvi.attributeId = UA_ATTRIBUTEID_VALUE; rvi.indexRange = UA_STRING_NULL; rvi.dataEncoding = UA_QUALIFIEDNAME(0, "DefaultBinary"); request.timestampsToReturn = UA_TIMESTAMPSTORETURN_NEITHER; request.nodesToReadSize = 1; request.nodesToRead = &rvi; UA_StatusCode retval = UA_STATUSCODE_GOOD; UA_ByteString request_msg; retval |= UA_ByteString_allocBuffer(&request_msg, 1000); UA_ByteString response_msg; retval |= UA_ByteString_allocBuffer(&response_msg, 1000); size_t offset = 0; retval |= UA_encodeBinary(&request, &UA_TYPES[UA_TYPES_READREQUEST], &request_msg, &offset); clock_t begin, end; begin = clock(); UA_ReadRequest rq; UA_ReadResponse rr; for(int i = 0; i < 900000; i++) { offset = 0; retval |= UA_decodeBinary(&request_msg, &offset, &rq, &UA_TYPES[UA_TYPES_READREQUEST]); UA_ReadResponse_init(&rr); Service_Read(server, &adminSession, &rq, &rr); offset = 0; retval |= UA_encodeBinary(&rr, &UA_TYPES[UA_TYPES_READRESPONSE], &response_msg, &offset); UA_ReadRequest_deleteMembers(&rq); UA_ReadResponse_deleteMembers(&rr); } end = clock(); double time_spent = (double)(end - begin) / CLOCKS_PER_SEC; printf("duration was %f s\n", time_spent); printf("retval is %i\n", retval); UA_ByteString_deleteMembers(&request_msg); UA_ByteString_deleteMembers(&response_msg); retval |= UA_Server_run(server, &running); UA_Server_delete(server); nl.deleteMembers(&nl); return (int)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 = 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; }