Przeglądaj źródła

UA_Application and services

Julius Pfrommer 11 lat temu
rodzic
commit
848410a21c
4 zmienionych plików z 252 dodań i 5 usunięć
  1. 4 5
      src/Makefile.am
  2. 14 0
      src/ua_application.h
  3. 65 0
      src/ua_services.h
  4. 169 0
      src/ua_services_attribute.c

+ 4 - 5
src/Makefile.am

@@ -38,7 +38,7 @@ libopen62541_la_LDFLAGS = -avoid-version -no-undefined
 #						ua_stackInternalTypes.c\
 #						ua_namespace.h\
 #						ua_namespace.c
-						
+
 #libopen62541_ladir = $(top_builddir)/include . $(top_builddir)/src . $(top_builddir)/src/util					
 
 #libopen62541_la_HEADERS = opcua.h\
@@ -53,7 +53,7 @@ libopen62541_la_LDFLAGS = -avoid-version -no-undefined
 #						ua_stackInternalTypes.h\
 #						ua_list.h\
 #						ua_indexedList.h
-						
+
 libopen62541_la_SOURCES = opcua.c\
 						ua_basictypes.c\
 						ua_namespace_0.c\
@@ -62,9 +62,8 @@ libopen62541_la_SOURCES = opcua.c\
 						ua_secureLayer.c\
 						util/ua_list.c\
 						util/ua_indexedList.c\
-						ua_namespace.c
-						
-						
+						ua_namespace.c\
+						ua_services_attribute.c
 
 #bin_PROGRAMS= $(top_builddir)/bin/open62541.out
 #__top_builddir__bin_libOpen62541_out_SOURCES = opcuaServer.c

+ 14 - 0
src/ua_application.h

@@ -0,0 +1,14 @@
+#ifndef OPCUA_APPLICATION_H_
+#define OPCUA_APPLICATION_H_
+
+#include "opcua.h"
+#include "ua_namespace.h"
+#include "ua_statuscodes.h"
+#include "ua_indexedList.h"
+
+typedef struct UA_Application_T {
+	UA_ApplicationDescription *description;
+	UA_indexedList_List *namespaces; // each entry is a namespace
+} UA_Application;
+
+#endif

+ 65 - 0
src/ua_services.h

@@ -0,0 +1,65 @@
+#ifndef UA_SERVICES_H_
+#define UA_SERVICES_H_
+
+#include "opcua.h"
+#include "ua_application.h"
+#include "ua_statuscodes.h"
+
+/* Part 4: 5.4 Discovery Service Set */
+// service_findservers
+// service_getendpoints
+// service_registerserver
+
+/* Part 4: 5.5 SecureChannel Service Set */
+// service_opensecurechannel
+// service_closesecurechannel
+
+/* Part 4: 5.6 Session Service Set */
+// service_createsession
+// service_activatesession
+// service_closesession
+// service_cancel
+
+/* Part 4: 5.7 NodeManagement Service Set */
+// service_addnodes
+// service_addreferences
+// service_deletenodes
+// service_deletereferences
+
+/* Part 4: 5.8 View Service Set */
+// service_browse
+// service_browsenext
+// service_translatebrowsepathstonodeids
+// service_registernodes
+// service_unregisternodes
+
+/* Part 4: 5.9 Query Service Set */
+// service_queryfirst
+// service_querynext
+
+/* Part 4: 5.10 Attribute Service Set */
+UA_Int32 service_read(UA_Application *app, UA_ReadRequest *request, UA_ReadResponse *response);
+// service_historyread;
+// service_write;
+// service_historyupdate;
+
+/* Part 4: 5.11 Method Service Set */
+// service_call
+
+/* Part 4: 5.12 MonitoredItem Service Set */
+// service_createmonitoreditems
+// service_modifymonitoreditems
+// service_setmonitoringmode
+// service_settriggering
+// service_deletemonitoreditems
+
+/* Part 4: 5.13 Subscription Service Set */
+// service_createsubscription
+// service_modifysubscription
+// service_setpublishingmode
+// service_publish
+// service_republish
+// service_transfersubscription
+// service_deletesubscription
+
+#endif

+ 169 - 0
src/ua_services_attribute.c

@@ -0,0 +1,169 @@
+#include "ua_services.h"
+
+enum UA_AttributeId {
+	UA_ATTRIBUTEID_NODEID = 1,
+	UA_ATTRIBUTEID_NODECLASS = 2,
+	UA_ATTRIBUTEID_BROWSENAME = 3,
+	UA_ATTRIBUTEID_DISPLAYNAME = 4,
+	UA_ATTRIBUTEID_DESCRIPTION = 5,
+	UA_ATTRIBUTEID_WRITEMASK = 6,
+	UA_ATTRIBUTEID_USERWRITEMASK = 7,
+	UA_ATTRIBUTEID_ISABSTRACT = 8,
+	UA_ATTRIBUTEID_SYMMETRIC = 9,
+	UA_ATTRIBUTEID_INVERSENAME = 10,
+	UA_ATTRIBUTEID_CONTAINSNOLOOPS = 11,
+	UA_ATTRIBUTEID_EVENTNOTIFIER = 12,
+	UA_ATTRIBUTEID_VALUE = 13,
+	UA_ATTRIBUTEID_DATATYPE = 14,
+	UA_ATTRIBUTEID_VALUERANK = 15,
+	UA_ATTRIBUTEID_ARRAYDIMENSIONS = 16,
+	UA_ATTRIBUTEID_ACCESSLEVEL = 17,
+	UA_ATTRIBUTEID_USERACCESSLEVEL = 18,
+	UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL = 19,
+	UA_ATTRIBUTEID_HISTORIZING = 20,
+	UA_ATTRIBUTEID_EXECUTABLE = 21,
+	UA_ATTRIBUTEID_USEREXECUTABLE = 22
+};
+
+static UA_DataValue * service_read_node(UA_Application *app, UA_ReadValueId *id) {
+	UA_DataValue *v;
+	UA_alloc((void **) &v, sizeof(UA_DataValue));
+	
+	UA_NodeId *nodeid = &id->nodeId;
+	namespace *ns = UA_indexedList_findValue(app->namespaces, nodeid->namespace);
+
+	if (ns == UA_NULL) {
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNODEIDUNKNOWN;
+		return v;
+	}
+	
+	UA_Node *node = UA_NULL;
+	ns_lock *lock = UA_NULL;
+	UA_Int32 result = get_node(ns, nodeid, &node, &lock);
+	if(result != UA_SUCCESS) {
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNODEIDUNKNOWN;
+		return v;
+	}
+
+	switch(id->attributeId) {
+	case UA_ATTRIBUTEID_NODEID:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_NODECLASS:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_BROWSENAME:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_DISPLAYNAME:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_DESCRIPTION:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_WRITEMASK:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_USERWRITEMASK:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_ISABSTRACT:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_SYMMETRIC:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_INVERSENAME:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_EVENTNOTIFIER:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_VALUE:
+		if (node->nodeClass != UA_NODECLASS_VARIABLE) {
+			v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+			v->status = UA_STATUSCODE_BADNOTREADABLE;
+			break;
+		}
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE | UA_DATAVALUE_ENCODINGMASK_VARIANT;
+		v->status = UA_STATUSCODE_GOOD;
+		v->value = ((UA_VariableNode *)node)->value; // be careful not to release the node before encoding the message
+		break;
+	case UA_ATTRIBUTEID_DATATYPE:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_VALUERANK:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_ACCESSLEVEL:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_USERACCESSLEVEL:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_HISTORIZING:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_EXECUTABLE:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	case UA_ATTRIBUTEID_USEREXECUTABLE:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADNOTREADABLE;
+		break;
+	default:
+		v->encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
+		v->status = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
+		break;
+	}
+	release_node(lock);
+	return v;
+}
+
+UA_Int32 service_read(UA_Application *app, UA_ReadRequest *request, UA_ReadResponse *response ) {
+	if(app == UA_NULL) {
+		return UA_ERROR; // TODO: Return error message
+	}
+
+	UA_alloc((void **)response, sizeof(UA_ReadResponse));
+	int readsize = request->nodesToReadSize > 0 ? request->nodesToReadSize : 0;
+	response->resultsSize = readsize;
+	UA_alloc((void **)&response->results, sizeof(void *)*readsize);
+	for(int i=0;i<readsize;i++) {
+		response->results[i] = service_read_node(app, request->nodesToRead[i]);
+	}
+	response->diagnosticInfosSize = -1;
+	return UA_SUCCESS;
+}
+