|
@@ -0,0 +1,109 @@
|
|
|
+/* This work is licensed under a Creative Commons CCZero 1.0 Universal License.
|
|
|
+ * See http://creativecommons.org/publicdomain/zero/1.0/ for more information.
|
|
|
+ *
|
|
|
+ * Copyright (c) 2019 Kalycito Infotech Private Limited
|
|
|
+ *
|
|
|
+ */
|
|
|
+
|
|
|
+#include <open62541/client_config_default.h>
|
|
|
+#include <open62541/client_highlevel.h>
|
|
|
+#include <open62541/plugin/log_stdout.h>
|
|
|
+#include <open62541/plugin/securitypolicy.h>
|
|
|
+
|
|
|
+#include <stdlib.h>
|
|
|
+#include "common.h"
|
|
|
+
|
|
|
+#define MIN_ARGS 4
|
|
|
+
|
|
|
+int main(int argc, char* argv[]) {
|
|
|
+ if(argc < MIN_ARGS) {
|
|
|
+ UA_LOG_FATAL(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND,
|
|
|
+ "Arguments are missing. The required arguments are "
|
|
|
+ "<opc.tcp://host:port> "
|
|
|
+ "<client-certificate.der> <client-private-key.der> "
|
|
|
+ "[<trustlist1.crl>, ...]");
|
|
|
+ return EXIT_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ const char *endpointUrl = argv[1];
|
|
|
+
|
|
|
+ /* Load certificate and private key */
|
|
|
+ UA_ByteString certificate = loadFile(argv[2]);
|
|
|
+ UA_ByteString privateKey = loadFile(argv[3]);
|
|
|
+
|
|
|
+ /* Load the trustList. Load revocationList is not supported now */
|
|
|
+ size_t trustListSize = 0;
|
|
|
+ if(argc > MIN_ARGS)
|
|
|
+ trustListSize = (size_t)argc-MIN_ARGS;
|
|
|
+ UA_STACKARRAY(UA_ByteString, trustList, trustListSize);
|
|
|
+ for(size_t trustListCount = 0; trustListCount < trustListSize; trustListCount++)
|
|
|
+ trustList[trustListCount] = loadFile(argv[trustListCount+4]);
|
|
|
+
|
|
|
+ UA_ByteString *revocationList = NULL;
|
|
|
+ size_t revocationListSize = 0;
|
|
|
+
|
|
|
+ UA_Client *client = UA_Client_new();
|
|
|
+ UA_ClientConfig *config = UA_Client_getConfig(client);
|
|
|
+ config->securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
|
|
|
+ UA_ClientConfig_setDefaultEncryption(config, certificate, privateKey,
|
|
|
+ trustList, trustListSize,
|
|
|
+ revocationList, revocationListSize);
|
|
|
+
|
|
|
+ UA_ByteString_clear(&certificate);
|
|
|
+ UA_ByteString_clear(&privateKey);
|
|
|
+ for(size_t deleteCount = 0; deleteCount < trustListSize; deleteCount++) {
|
|
|
+ UA_ByteString_clear(&trustList[deleteCount]);
|
|
|
+ }
|
|
|
+
|
|
|
+ UA_StatusCode retval = UA_Client_connect_username(client, endpointUrl, "paula", "paula123");
|
|
|
+ if(retval != UA_STATUSCODE_GOOD) {
|
|
|
+ UA_Client_delete(client);
|
|
|
+ return EXIT_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ UA_NodeId newVariableIdRequest = UA_NODEID_NUMERIC(1, 1001);
|
|
|
+ UA_NodeId newVariableId = UA_NODEID_NULL;
|
|
|
+
|
|
|
+ UA_VariableAttributes newVariableAttributes = UA_VariableAttributes_default;
|
|
|
+
|
|
|
+ newVariableAttributes.accessLevel = UA_ACCESSLEVELMASK_READ;
|
|
|
+ newVariableAttributes.description = UA_LOCALIZEDTEXT_ALLOC("en-US", "NewVariable desc");
|
|
|
+ newVariableAttributes.displayName = UA_LOCALIZEDTEXT_ALLOC("en-US", "NewVariable");
|
|
|
+ newVariableAttributes.dataType = UA_TYPES[UA_TYPES_UINT32].typeId;
|
|
|
+ UA_UInt32 value = 50;
|
|
|
+ UA_Variant_setScalarCopy(&newVariableAttributes.value, &value, &UA_TYPES[UA_TYPES_UINT32]);
|
|
|
+
|
|
|
+ UA_StatusCode retCode;
|
|
|
+
|
|
|
+ retCode = UA_Client_addVariableNode(client, newVariableIdRequest,
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
|
|
|
+ UA_QUALIFIEDNAME(1, "newVariable"),
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
|
|
|
+ newVariableAttributes, &newVariableId);
|
|
|
+
|
|
|
+ printf("addVariable returned: %s\n", UA_StatusCode_name(retCode));
|
|
|
+
|
|
|
+ UA_ExpandedNodeId extNodeId = UA_EXPANDEDNODEID_NUMERIC(0, 0);
|
|
|
+ extNodeId.nodeId = newVariableId;
|
|
|
+
|
|
|
+ retCode = UA_Client_addReference(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), UA_TRUE,
|
|
|
+ UA_STRING_NULL, extNodeId, UA_NODECLASS_VARIABLE);
|
|
|
+
|
|
|
+ printf("addReference returned: %s\n", UA_StatusCode_name(retCode));
|
|
|
+
|
|
|
+ retCode = UA_Client_deleteReference(client, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_TRUE, extNodeId,
|
|
|
+ UA_TRUE);
|
|
|
+
|
|
|
+ printf("deleteReference returned: %s\n", UA_StatusCode_name(retCode));
|
|
|
+
|
|
|
+ retCode = UA_Client_deleteNode(client, newVariableId, UA_TRUE);
|
|
|
+ printf("deleteNode returned: %s\n", UA_StatusCode_name(retCode));
|
|
|
+
|
|
|
+ /* Clean up */
|
|
|
+ UA_VariableAttributes_clear(&newVariableAttributes);
|
|
|
+ UA_Client_delete(client); /* Disconnects the client internally */
|
|
|
+ return EXIT_SUCCESS;
|
|
|
+}
|