Browse Source

added an example how to register a user defined "readNodes" operation

FlorianPalm 10 years ago
parent
commit
aa4268e4d6

+ 2 - 1
CMakeLists.txt

@@ -166,7 +166,8 @@ endif()
 
 # build example server
 set(server_sources examples/opcuaServer.c
-                   examples/logger_stdout.c)
+                   examples/logger_stdout.c
+ 		   examples/nodestoreAccessExample.c)
 if(NOT ENABLE_MULTITHREADING)
     list(APPEND server_sources examples/networklayer_tcp.c)
 else()

+ 8 - 0
examples/opcuaServer.c

@@ -16,6 +16,9 @@
 #include "logger_stdout.h"
 #include "networklayer_tcp.h"
 
+#include "nodestoreAccessExample.h"
+#include "../src/server/ua_nodestore.h"
+#include "../src/server/ua_namespace_manager.h"
 UA_Boolean running = UA_TRUE;
 
 void stopHandler(int sign) {
@@ -56,6 +59,11 @@ int main(int argc, char** argv) {
 	UA_String endpointUrl;
 	UA_String_copycstring("no endpoint url",&endpointUrl);
 	UA_Server_init(&server, &endpointUrl);
+	UA_NodeStore newNodeStore;
+
+	UA_Server_addNamespace(&server,0,&newNodeStore);
+	UA_NodeStore_registerReadNodesOperation(&newNodeStore,readNodes);
+
 	Logger_Stdout_init(&server.logger);
     server.serverCertificate = loadCertificate();
 

+ 3 - 3
include/ua_server.h

@@ -119,11 +119,11 @@ void UA_EXPORT UA_Server_addReferences(UA_Server *server, const UA_AddReferences
                                        UA_AddReferencesResponse *response);
 
 
-UA_Int32 UA_Server_addNamespace(UA_Server *server, UA_UInt16 namespaceIndex, UA_NodeStore *nodeStore);
+UA_Int32 UA_EXPORT UA_Server_addNamespace(UA_Server *server, UA_UInt16 namespaceIndex, UA_NodeStore *nodeStore);
 
-UA_Int32 UA_Server_removeNamespace(UA_Server *server, UA_UInt16 namespaceIndex);
+UA_Int32 UA_EXPORT UA_Server_removeNamespace(UA_Server *server, UA_UInt16 namespaceIndex);
 
-UA_Int32 UA_Server_setNodeStore(UA_Server *server, UA_UInt16 namespaceIndex, UA_NodeStore *nodeStore);
+UA_Int32 UA_EXPORT UA_Server_setNodeStore(UA_Server *server, UA_UInt16 namespaceIndex, UA_NodeStore *nodeStore);
 
 #ifdef __cplusplus
 } // extern "C"

+ 1 - 1
src/server/ua_nodestore.c

@@ -41,7 +41,7 @@ UA_Int32 UA_NodeStore_registerDeleteReferencesOperation(UA_NodeStore *nodeStore,
 }
 
 
-UA_Int32 UA_NodeStore_registerReadOperation(UA_NodeStore *nodeStore, UA_NodeStore_readNodes readNodes)
+UA_Int32 UA_NodeStore_registerReadNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_readNodes readNodes)
 {
 	if(nodeStore==UA_NULL){
 		return UA_ERROR;

+ 7 - 7
src/server/ua_nodestore.h

@@ -6,13 +6,13 @@
 
 
 
-UA_Int32 UA_NodeStore_registerAddNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_addNodes addNode);
-UA_Int32 UA_NodeStore_registerAddReferenceOperation(UA_NodeStore *nodeStore, UA_NodeStore_addReferences addReference);
-UA_Int32 UA_NodeStore_registerDeleteNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_deleteNodes deleteNode);
-UA_Int32 UA_NodeStore_registerDeleteReferencesOperation(UA_NodeStore *nodeStore, UA_NodeStore_deleteReferences deleteReference);
-UA_Int32 UA_NodeStore_registerReadOperation(UA_NodeStore *nodeStore, UA_NodeStore_readNodes readNode);
-UA_Int32 UA_NodeStore_registerWriteOperation(UA_NodeStore *nodeStore, UA_NodeStore_writeNodes writeNode);
-UA_Int32 UA_NodeStore_registerBrowseOperation(UA_NodeStore *nodeStore, UA_NodeStore_browseNodes browseNode);
+UA_Int32 UA_EXPORT UA_NodeStore_registerAddNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_addNodes addNode);
+UA_Int32 UA_EXPORT UA_NodeStore_registerAddReferenceOperation(UA_NodeStore *nodeStore, UA_NodeStore_addReferences addReference);
+UA_Int32 UA_EXPORT UA_NodeStore_registerDeleteNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_deleteNodes deleteNode);
+UA_Int32 UA_EXPORT UA_NodeStore_registerDeleteReferencesOperation(UA_NodeStore *nodeStore, UA_NodeStore_deleteReferences deleteReference);
+UA_Int32 UA_EXPORT UA_NodeStore_registerReadNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_readNodes readNode);
+UA_Int32 UA_EXPORT UA_NodeStore_registerWriteNodesOperation(UA_NodeStore *nodeStore, UA_NodeStore_writeNodes writeNode);
+UA_Int32 UA_EXPORT UA_NodeStore_registerBrowseOperation(UA_NodeStore *nodeStore, UA_NodeStore_browseNodes browseNode);
 
 #define UA_NODESTORE_INSERT_UNIQUE 1
 #define UA_NODESTORE_INSERT_GETMANAGED 2

+ 7 - 1
src/server/ua_server.c

@@ -3,6 +3,7 @@
 #include "ua_services_internal.h" // AddReferences
 #include "ua_namespace_0.h"
 #include "ua_securechannel_manager.h"
+#include "ua_namespace_manager.h"
 #include "ua_session_manager.h"
 #include "ua_util.h"
 #include "ua_services.h"
@@ -22,7 +23,7 @@ void UA_Server_init(UA_Server *server, UA_String *endpointUrl) {
 
     UA_NodeId_init(&server->hasComponentReferenceTypeId);
     server->hasComponentReferenceTypeId.identifier.numeric = 47;
-
+    UA_NamespaceManager_new(&server->namespaceManager);
     UA_ApplicationDescription_init(&server->description);
     UA_ByteString_init(&server->serverCertificate);
 #define MAXCHANNELCOUNT 100
@@ -555,3 +556,8 @@ UA_AddNodesResult UA_Server_addScalarVariableNode(UA_Server *server, UA_String *
     tmpNode->value.storage.data.arrayLength = 1;
     return UA_Server_addNode(server, (UA_Node**)&tmpNode, parentNodeId, referenceTypeId);
 }
+
+UA_Int32 UA_Server_addNamespace(UA_Server *server, UA_UInt16 namespaceIndex, UA_NodeStore *nodeStore)
+{
+	return UA_NamespaceManager_addNamespace(server->namespaceManager,namespaceIndex,nodeStore);
+}

+ 17 - 3
src/server/ua_services_attribute.c

@@ -2,7 +2,7 @@
 #include "ua_nodestoreExample.h"
 #include "ua_statuscodes.h"
 #include "ua_nodestore.h"
-
+#include "ua_namespace_manager.h"
 #include "ua_namespace_0.h"
 #include "ua_util.h"
 
@@ -229,8 +229,22 @@ void Service_Read(UA_Server *server, UA_Session *session,
     }
     response->resultsSize = request->nodesToReadSize;
     for(UA_Int32 i = 0;i < response->resultsSize;i++){
-    	//server->nodestore->readNode(&request->nodesToRead[i],&response->results[i],request->timestampsToReturn, &response->diagnosticInfos[i])
-		response->results[i] = service_read_node(server, &request->nodesToRead[i]);
+    	UA_Namespace *tmpNamespace;
+    	UA_NamespaceManager_getNamespace(server->namespaceManager,
+    			request->nodesToRead[i].nodeId.namespaceIndex, &tmpNamespace);
+
+    	//(UA_ReadValueId *readValueIds,UA_UInt32 sizeReadValueIds, UA_DataValue *value, UA_Boolean timeStampToReturn, UA_DiagnosticInfo *diagnosticInfo);
+
+
+    	if(tmpNamespace!=UA_NULL){
+    		tmpNamespace->nodeStore->readNodes(&request->nodesToRead[i],
+    				request->nodesToReadSize,
+    				&response->results[i],
+    				request->timestampsToReturn,
+    				&response->diagnosticInfos[i]);
+
+			//	response->results[i] = service_read_node(server, &request->nodesToRead[i]);
+    	}
     }