Ver código fonte

move to canonical examples that show only a single feature

Julius Pfrommer 9 anos atrás
pai
commit
3649101943

+ 5 - 4
CMakeLists.txt

@@ -263,7 +263,6 @@ option(BUILD_EXAMPLESERVER "Build the example server" OFF)
 if(BUILD_EXAMPLESERVER)
     set(server_source $<TARGET_OBJECTS:open62541-object>)
     add_executable(server_static examples/server.c ${server_source})
-    add_executable(server_simple examples/server_simple.c ${server_source})
     add_executable(server examples/server.c)
     if(ENABLE_AMALGAMATION)
        ADD_DEPENDENCIES(server amalgamation) 
@@ -271,16 +270,13 @@ if(BUILD_EXAMPLESERVER)
     target_link_libraries(server open62541)
     if(WIN32)
         target_link_libraries(server_static ws2_32)
-        target_link_libraries(server_simple ws2_32)
         target_link_libraries(server ws2_32)
     else()
         target_link_libraries(server_static rt)
-        target_link_libraries(server_simple rt)
         target_link_libraries(server rt)
     endif()
     if(ENABLE_MULTITHREADING)
         target_link_libraries(server_static urcu-cds urcu urcu-common pthread)
-        target_link_libraries(server_simple urcu-cds urcu urcu-common pthread)
         target_link_libraries(server urcu-cds urcu urcu-common pthread)
     endif()
 endif()
@@ -336,6 +332,11 @@ if(BUILD_UNIT_TESTS)
     add_subdirectory(tests)
 endif()
 
+option(BUILD_EXAMPLES "Build example servers and clients" OFF)
+if(BUILD_EXAMPLES)
+    add_subdirectory(examples)
+endif()
+
 # build documentation
 option(BUILD_DOCUMENTATION "Generate doxygen/sphinx documentation" OFF)
 if(BUILD_DOCUMENTATION)

+ 22 - 0
examples/CMakeLists.txt

@@ -0,0 +1,22 @@
+include_directories(${PROJECT_SOURCE_DIR}/include)
+
+set(LIBS open62541)
+if(NOT WIN32)
+    list(APPEND LIBS rt pthread)
+else()
+    list(APPEND LIBS ws2_32)
+endif()
+if(MULTITHREADING)
+    list(APPEND LIBS urcu-cds urcu urcu-common)
+endif(MULTITHREADING)
+
+add_executable(server_variable server_variable.c)
+target_link_libraries(server_variable ${LIBS})
+
+add_executable(server_repeated_job server_repeated_job.c)
+target_link_libraries(server_repeated_job ${LIBS})
+
+if(ENABLE_METHODCALLS)
+  add_executable(server_method server_method.c)
+  target_link_libraries(server_method ${LIBS})
+endif()

+ 80 - 0
examples/server_method.c

@@ -0,0 +1,80 @@
+/*
+ * This work is licensed under a Creative Commons CCZero 1.0 Universal License.
+ * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
+ */
+
+#ifdef UA_NO_AMALGAMATION
+# include <time.h>
+# include "ua_types.h"
+# include "ua_server.h"
+# include "logger_stdout.h"
+# include "networklayer_tcp.h"
+#else
+# include "open62541.h"
+#endif
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+UA_Boolean running = UA_TRUE;
+UA_Logger logger;
+
+static UA_StatusCode helloWorldMethod(const UA_NodeId objectId, const UA_Variant *input, UA_Variant *output) {
+    UA_String *inputStr = (UA_String*)input->data;
+    UA_String tmp = UA_STRING_ALLOC("Hello ");
+    if(inputStr->length > 0) {
+        tmp.data = realloc(tmp.data, tmp.length + inputStr->length);
+        memcpy(&tmp.data[tmp.length], inputStr->data, inputStr->length);
+        tmp.length += inputStr->length;
+    }
+    UA_Variant_setScalar(output, &tmp, &UA_TYPES[UA_TYPES_STRING]);
+    UA_LOG_INFO(logger, UA_LOGCATEGORY_SERVER, "Hello World was called");
+    return UA_STATUSCODE_GOOD;
+} 
+
+static void stopHandler(int sign) {
+    UA_LOG_INFO(logger, UA_LOGCATEGORY_SERVER, "Received Ctrl-C");
+	running = 0;
+}
+
+int main(int argc, char** argv) {
+	signal(SIGINT, stopHandler); /* catches ctrl-c */
+
+    /* initialize the server */
+    UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
+    logger = Logger_Stdout_new();
+    UA_Server_setLogger(server, logger);
+	UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
+
+    /* 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_Server_addMethodNode(server, UA_QUALIFIEDNAME(1,"ping"), UA_NODEID_NUMERIC(1,62541),
+                            UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+                            &helloWorldMethod, 1, &inputArguments, 1, &outputArguments);
+
+    /* start server */
+	UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
+
+	/* ctrl-c received -> clean up */
+	UA_Server_delete(server);
+	return retval;
+}

+ 49 - 0
examples/server_repeated_job.c

@@ -0,0 +1,49 @@
+/*
+ * This work is licensed under a Creative Commons CCZero 1.0 Universal License.
+ * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
+ */
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h> 
+#include <signal.h>
+#include <errno.h> // errno, EINTR
+#include <string.h>
+
+#ifdef UA_NO_AMALGAMATION
+# include "ua_types.h"
+# include "ua_server.h"
+# include "logger_stdout.h"
+# include "networklayer_tcp.h"
+#else
+# include "open62541.h"
+#endif
+
+UA_Boolean running = 1;
+UA_Logger logger;
+
+static void stopHandler(int sign) {
+    printf("Received Ctrl-C\n");
+	running = 0;
+}
+
+static void testCallback(UA_Server *server, void *data) {
+    UA_LOG_INFO(logger, UA_LOGCATEGORY_USERLAND, "testcallback");
+}
+
+int main(int argc, char** argv) {
+	signal(SIGINT, stopHandler); /* catches ctrl-c */
+
+	UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
+    logger = Logger_Stdout_new();
+    UA_Server_setLogger(server, logger);
+    UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
+
+	/* 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, 1, &running);
+	UA_Server_delete(server);
+	return retval;
+}

+ 52 - 0
examples/server_variable.c

@@ -0,0 +1,52 @@
+/*
+ * This work is licensed under a Creative Commons CCZero 1.0 Universal License.
+ * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
+ */
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h> 
+#include <signal.h>
+#include <errno.h> // errno, EINTR
+#include <string.h>
+
+#ifdef UA_NO_AMALGAMATION
+# include "ua_types.h"
+# include "ua_server.h"
+# include "logger_stdout.h"
+# include "networklayer_tcp.h"
+#else
+# include "open62541.h"
+#endif
+
+UA_Boolean running = 1;
+UA_Logger logger;
+
+static void stopHandler(int sign) {
+    printf("Received Ctrl-C\n");
+	running = 0;
+}
+
+int main(int argc, char** argv) {
+	signal(SIGINT, stopHandler); /* catches ctrl-c */
+
+	UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
+    logger = Logger_Stdout_new();
+    UA_Server_setLogger(server, logger);
+    UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
+
+	/* add a variable node to the adresspace */
+    UA_Variant *myIntegerVariant = UA_Variant_new();
+    UA_Int32 myInteger = 42;
+    UA_Variant_setScalarCopy(myIntegerVariant, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
+    UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
+    UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer"); /* UA_NODEID_NULL would assign a random free nodeid */
+    UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
+    UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
+    UA_Server_addVariableNode(server, myIntegerVariant, myIntegerName,
+                              myIntegerNodeId, parentNodeId, parentReferenceNodeId);
+
+    UA_StatusCode retval = UA_Server_run(server, 1, &running);
+	UA_Server_delete(server);
+
+	return retval;
+}