Forráskód Böngészése

simplified adding of scalar nodes from userland

Julius Pfrommer 10 éve
szülő
commit
afbd8cc54a
4 módosított fájl, 52 hozzáadás és 20 törlés
  1. 9 0
      examples/networklayer_tcp.h
  2. 13 20
      examples/opcuaServer.c
  3. 7 0
      include/ua_server.h
  4. 23 0
      src/server/ua_server.c

+ 9 - 0
examples/networklayer_tcp.h

@@ -6,6 +6,15 @@
 #ifndef NETWORKLAYERTCP_H_
 #define NETWORKLAYERTCP_H_
 
+#ifdef WIN32
+  #include "winsock2.h"
+#else
+  #include <sys/mman.h>
+  #include <sys/wait.h>
+  #include <unistd.h>
+  #include <sys/time.h>
+#endif
+
 #include "ua_server.h"
 
 struct NetworklayerTCP;

+ 13 - 20
examples/opcuaServer.c

@@ -5,22 +5,16 @@
 
 #include <stdio.h>
 #include <stdlib.h> 
-#ifdef WIN32
-  #include "winsock2.h"
-#else
-  #include <sys/mman.h>
-  #include <sys/wait.h>
-  #include <unistd.h>
-  #include <sys/time.h>
-#endif
-#include <sys/types.h>
-#include <fcntl.h>
 #include <signal.h>
 #include <errno.h> // errno, EINTR
+
+// provided by the open62541 lib
 #include "ua_server.h"
+#include "ua_namespace_0.h"
+
+// provided by the user, implementations available in the /examples folder
 #include "logger_stdout.h"
 #include "networklayer_tcp.h"
-#include "ua_namespace_0.h"
 
 UA_Boolean running = UA_TRUE;
 
@@ -65,18 +59,16 @@ int main(int argc, char** argv) {
 	Logger_Stdout_init(&server.logger);
     server.serverCertificate = loadCertificate();
 
+    UA_Int32 myInteger = 42;
+    UA_String myIntegerName;
+    UA_STRING_STATIC(myIntegerName, "The Answer");
+    UA_Server_addScalarVariableNode(&server, &myIntegerName, (void*)&myInteger, &UA_[UA_INT32],
+                                    &server.objectsNodeId, &server.hasComponentReferenceTypeId);
+
 #ifdef BENCHMARK
     UA_UInt32 nodeCount = 500;
     UA_VariableNode *tmpNode;
 
-    UA_ExpandedNodeId objectNodeId;
-    UA_ExpandedNodeId_init(&objectNodeId);
-    objectNodeId.nodeId.identifier.numeric = 85;
-
-    UA_NodeId hasComponentReferenceId;
-    UA_NodeId_init(&hasComponentReferenceId);
-    hasComponentReferenceId.identifier.numeric = 47;
-
     UA_Int32 data = 42;
     char str[15];
     for(UA_UInt32 i = 0;i<nodeCount;i++) {
@@ -92,7 +84,8 @@ int main(int argc, char** argv) {
         tmpNode->value.storage.data.dataPtr = &data;
         tmpNode->value.storageType = UA_VARIANT_DATA_NODELETE;
         tmpNode->value.storage.data.arrayLength = 1;
-        UA_Server_addNode(&server, (UA_Node**)&tmpNode, &objectNodeId, &hasComponentReferenceId);
+        UA_Server_addNode(&server, (UA_Node**)&tmpNode, &server.objectsNodeId,
+                          &server.hasComponentReferenceTypeId);
     }
 #endif
 	

+ 7 - 0
include/ua_server.h

@@ -43,6 +43,10 @@ typedef struct UA_Server {
     UA_NodeStore *nodestore;
     UA_Logger logger;
     UA_ByteString serverCertificate;
+
+    // todo: move these somewhere sane
+    UA_ExpandedNodeId objectsNodeId;
+    UA_NodeId hasComponentReferenceTypeId;
 } UA_Server;
 
 void UA_LIBEXPORT UA_Server_init(UA_Server *server, UA_String *endpointUrl);
@@ -50,6 +54,9 @@ UA_Int32 UA_LIBEXPORT UA_Server_deleteMembers(UA_Server *server);
 UA_Int32 UA_LIBEXPORT UA_Server_processBinaryMessage(UA_Server *server, UA_Connection *connection, const UA_ByteString *msg);
 
 /* Services for local use */
+UA_AddNodesResult UA_Server_addScalarVariableNode(UA_Server *server, UA_String *browseName, void *value,
+                                                  const UA_VTable_Entry *vt, UA_ExpandedNodeId *parentNodeId,
+                                                  UA_NodeId *referenceTypeId );
 UA_AddNodesResult UA_Server_addNode(UA_Server *server, UA_Node **node, UA_ExpandedNodeId *parentNodeId,
                                     UA_NodeId *referenceTypeId);
 void UA_Server_addReferences(UA_Server *server, const UA_AddReferencesRequest *request,

+ 23 - 0
src/server/ua_server.c

@@ -16,6 +16,12 @@ UA_Int32 UA_Server_deleteMembers(UA_Server *server) {
 }
 
 void UA_Server_init(UA_Server *server, UA_String *endpointUrl) {
+    UA_ExpandedNodeId_init(&server->objectsNodeId);
+    server->objectsNodeId.nodeId.identifier.numeric = 85;
+
+    UA_NodeId_init(&server->hasComponentReferenceTypeId);
+    server->hasComponentReferenceTypeId.identifier.numeric = 47;
+    
     UA_ApplicationDescription_init(&server->description);
     UA_ByteString_init(&server->serverCertificate);
 #define MAXCHANNELCOUNT 100
@@ -531,3 +537,20 @@ void UA_Server_addReference(UA_Server *server, const UA_AddReferencesRequest *re
                             UA_AddReferencesResponse *response) {
     Service_AddReferences(server, &adminSession, request, response);
 }
+
+UA_AddNodesResult UA_Server_addScalarVariableNode(UA_Server *server, UA_String *browseName, void *value,
+                                                  const UA_VTable_Entry *vt, UA_ExpandedNodeId *parentNodeId,
+                                                  UA_NodeId *referenceTypeId ) {
+    UA_VariableNode *tmpNode;
+    UA_VariableNode_new(&tmpNode);
+    UA_String_copy(browseName, &tmpNode->browseName.name);
+    UA_String_copy(browseName, &tmpNode->displayName.text);
+    /* UA_LocalizedText_copycstring("integer value", &tmpNode->description); */
+    tmpNode->nodeClass = UA_NODECLASS_VARIABLE;
+    tmpNode->valueRank = -1;
+    tmpNode->value.vt = vt;
+    tmpNode->value.storage.data.dataPtr = value;
+    tmpNode->value.storageType = UA_VARIANT_DATA_NODELETE;
+    tmpNode->value.storage.data.arrayLength = 1;
+    return UA_Server_addNode(server, (UA_Node**)&tmpNode, parentNodeId, referenceTypeId);
+}