Browse Source

Example: Add simpler client_connect with crypto if available

Julius Pfrommer 5 years ago
parent
commit
64426cc928
2 changed files with 150 additions and 0 deletions
  1. 2 0
      examples/CMakeLists.txt
  2. 148 0
      examples/client_connect.c

+ 2 - 0
examples/CMakeLists.txt

@@ -113,6 +113,8 @@ install(PROGRAMS $<TARGET_FILE:server_ctt>
 
 add_example(client client.c)
 
+add_example(client_connect client_connect.c)
+
 if(UA_ENABLE_HISTORIZING)
     add_example(client_historical client_historical.c)
 endif()

+ 148 - 0
examples/client_connect.c

@@ -0,0 +1,148 @@
+/* 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 <open62541/client_config_default.h>
+#include <open62541/client_highlevel.h>
+#include <open62541/client_subscriptions.h>
+#include <open62541/plugin/log_stdout.h>
+
+#include "common.h"
+
+static void usage(void) {
+    printf("Usage: client [-username name] [-password password] ");
+#ifdef UA_ENABLE_ENCRYPTION
+    printf("[-cert certfile.der] [-key keyfile.der] "
+           "[-securityMode <0-3>] [-securityPolicy policyUri] ");
+#endif
+    printf("opc.tcp://<host>:<port>\n");
+}
+
+int main(int argc, char *argv[]) {
+    UA_String securityPolicyUri = UA_STRING_NULL;
+    UA_MessageSecurityMode securityMode = UA_MESSAGESECURITYMODE_INVALID; /* allow everything */
+    char *serverurl = NULL;
+    char *username = NULL;
+    char *password = NULL;
+#ifdef UA_ENABLE_ENCRYPTION
+    char *certfile = NULL;
+    char *keyfile = NULL;
+#endif
+
+    /* At least one argument is required for the server uri */
+    if(argc <= 1) {
+        usage();
+        return EXIT_FAILURE;
+    }
+
+    /* Parse the arguments */
+    for(int argpos = 1; argpos < argc; argpos++) {
+        if(strcmp(argv[argpos], "--help") == 0 ||
+           strcmp(argv[argpos], "-h") == 0) {
+            usage();
+            return EXIT_SUCCESS;
+        }
+
+        if(argpos + 1 == argc) {
+            serverurl = argv[argpos];
+            continue;
+        }
+
+        if(strcmp(argv[argpos], "-username") == 0) {
+            argpos++;
+            username = argv[argpos];
+            continue;
+        }
+
+        if(strcmp(argv[argpos], "-password") == 0) {
+            argpos++;
+            password = argv[argpos];
+            continue;
+        }
+
+#ifdef UA_ENABLE_ENCRYPTION
+        if(strcmp(argv[argpos], "-cert") == 0) {
+            argpos++;
+            certfile = argv[argpos];
+            continue;
+        }
+
+        if(strcmp(argv[argpos], "-key") == 0) {
+            argpos++;
+            keyfile = argv[argpos];
+            continue;
+        }
+
+        if(strcmp(argv[argpos], "-securityMode") == 0) {
+            argpos++;
+            if(sscanf(argv[argpos], "%i", (int*)&securityMode) != 1) {
+                usage();
+                return EXIT_FAILURE;
+            }
+            continue;
+        }
+
+        if(strcmp(argv[argpos], "-securityPolicy") == 0) {
+            argpos++;
+            securityPolicyUri = UA_STRING(argv[argpos]);
+            continue;
+        }
+#endif
+
+        usage();
+        return EXIT_FAILURE;
+    }
+
+    /* Create the server and set its config */
+    UA_Client *client = UA_Client_new();
+    UA_ClientConfig *cc = UA_Client_getConfig(client);
+
+#ifdef UA_ENABLE_ENCRYPTION
+    if(certfile) {
+        UA_ByteString certificate = loadFile(certfile);
+        UA_ByteString privateKey  = loadFile(keyfile);
+        UA_ClientConfig_setDefaultEncryption(cc, certificate, privateKey,
+                                             NULL, 0, NULL, 0);
+        UA_ByteString_deleteMembers(&certificate);
+        UA_ByteString_deleteMembers(&privateKey);
+    } else {
+        UA_ClientConfig_setDefault(cc);
+    }
+#else
+    UA_ClientConfig_setDefault(cc);
+#endif
+
+    cc->securityMode = securityMode;
+    cc->securityPolicyUri = securityPolicyUri;
+
+    /* Connect to the server */
+    UA_StatusCode retval = UA_STATUSCODE_GOOD;
+    if(username)
+        retval = UA_Client_connect_username(client, serverurl, username, password);
+    else
+        retval = UA_Client_connect(client, serverurl);
+    if(retval != UA_STATUSCODE_GOOD) {
+        UA_Client_delete(client);
+        return EXIT_FAILURE;
+    }
+
+    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Connected!");
+
+    /* Read the server-time */
+    UA_Variant value;
+    UA_Variant_init(&value);
+    UA_Client_readValueAttribute(client,
+              UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME),
+              &value);
+    if(UA_Variant_hasScalarType(&value, &UA_TYPES[UA_TYPES_DATETIME])) {
+        UA_DateTimeStruct dts = UA_DateTime_toStruct(*(UA_DateTime *)value.data);
+        UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
+                    "The server date is: %02u-%02u-%04u %02u:%02u:%02u.%03u",
+                    dts.day, dts.month, dts.year, dts.hour, dts.min, dts.sec, dts.milliSec);
+    }
+    UA_Variant_clear(&value);
+
+    /* Clean up */
+    UA_Client_disconnect(client);
+    UA_Client_delete(client);
+    return retval == UA_STATUSCODE_GOOD ? EXIT_SUCCESS : EXIT_FAILURE;
+}