ua_server.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. #include "ua_server_internal.h"
  2. #include "ua_services_internal.h" // AddReferences
  3. #include "ua_namespace_0.h"
  4. #include "ua_securechannel_manager.h"
  5. #include "ua_namespace_manager.h"
  6. #include "ua_session_manager.h"
  7. #include "ua_util.h"
  8. #include "ua_services.h"
  9. #include "server/nodestore/open62541_nodestore.h"
  10. void UA_Server_delete(UA_Server *server) {
  11. UA_ApplicationDescription_deleteMembers(&server->description);
  12. UA_SecureChannelManager_deleteMembers(&server->secureChannelManager);
  13. UA_SessionManager_deleteMembers(&server->sessionManager);
  14. UA_NamespaceManager_deleteMembers(&server->namespaceManager);
  15. UA_free(server->namespaceManager);
  16. UA_ByteString_deleteMembers(&server->serverCertificate);
  17. UA_Array_delete(server->endpointDescriptions,
  18. server->endpointDescriptionsSize,
  19. &UA_TYPES[UA_ENDPOINTDESCRIPTION]);
  20. UA_free(server);
  21. }
  22. void addSingleReference(UA_Namespace *namespace,
  23. UA_AddReferencesItem *addReferencesItem) {
  24. UA_UInt32 indices = 1;
  25. UA_UInt32 indicesSize = 1;
  26. UA_DiagnosticInfo diagnosticInfo;
  27. UA_StatusCode result;
  28. UA_RequestHeader tmpRequestHeader;
  29. namespace->nodeStore->addReferences(&tmpRequestHeader, addReferencesItem,
  30. &indices, indicesSize, &result, &diagnosticInfo);
  31. }
  32. void addSingleNode(UA_Namespace *namespace, UA_AddNodesItem *addNodesItem) {
  33. UA_UInt32 indices = 0;
  34. UA_UInt32 indicesSize = 1;
  35. UA_DiagnosticInfo diagnosticInfo;
  36. UA_AddNodesResult result;
  37. UA_RequestHeader tmpRequestHeader;
  38. namespace->nodeStore->addNodes(&tmpRequestHeader, addNodesItem, &indices,
  39. indicesSize, &result, &diagnosticInfo);
  40. }
  41. static void UA_Server_registerNS0Operations(UA_Server *server,
  42. UA_NodeStoreInterface *nodestore) {
  43. UA_NodeStoreInterface_registerReadNodesOperation(nodestore,
  44. open62541NodeStore_ReadNodes);
  45. UA_NodeStoreInterface_registerBrowseNodesOperation(nodestore,
  46. open62541NodeStore_BrowseNodes);
  47. UA_NodeStoreInterface_registerAddNodesOperation(nodestore,
  48. open62541NodeStore_AddNodes);
  49. UA_NodeStoreInterface_registerWriteNodesOperation(nodestore,
  50. open62541NodeStore_WriteNodes);
  51. }
  52. static void ns0_addObjectNode(UA_Server *server, UA_NodeId REFTYPE_NODEID,
  53. UA_ExpandedNodeId REQ_NODEID, UA_ExpandedNodeId PARENTNODEID,
  54. char* BROWSENAME, char* DISPLAYNAME, char* DESCRIPTION) {
  55. UA_ObjectAttributes objAttr;
  56. UA_ObjectAttributes_init(&objAttr);
  57. UA_AddNodesItem addNodesItem;
  58. UA_AddNodesItem_init(&addNodesItem);
  59. UA_Namespace *ns0 = UA_NULL;
  60. UA_NamespaceManager_getNamespace(&server->namespaceManager, 0, &ns0);
  61. addNodesItem.parentNodeId = PARENTNODEID;
  62. addNodesItem.requestedNewNodeId = REQ_NODEID;
  63. addNodesItem.referenceTypeId = REFTYPE_NODEID;
  64. addNodesItem.nodeClass = UA_NODECLASS_OBJECT;\
  65. UA_QualifiedName_copycstring(BROWSENAME, &addNodesItem.browseName);
  66. UA_LocalizedText_copycstring(DISPLAYNAME, &objAttr.displayName);
  67. UA_LocalizedText_copycstring(DESCRIPTION, &objAttr.description);
  68. objAttr.userWriteMask = 0;
  69. objAttr.writeMask = 0;
  70. objAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_BROWSENAME;
  71. objAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_DISPLAYNAME;
  72. objAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_DESCRIPTION;
  73. addNodesItem.typeDefinition.nodeId.identifier.numeric = 354;
  74. addNodesItem.typeDefinition.nodeId.identifierType = UA_NODEIDTYPE_NUMERIC;
  75. addNodesItem.typeDefinition.nodeId.namespaceIndex = 0;
  76. addNodesItem.nodeAttributes.typeId = addNodesItem.typeDefinition.nodeId;
  77. UA_UInt32 offset = 0;
  78. UA_ByteString_newMembers(&addNodesItem.nodeAttributes.body,
  79. UA_ObjectAttributes_calcSizeBinary(&objAttr));
  80. UA_ObjectAttributes_encodeBinary(&objAttr,
  81. &addNodesItem.nodeAttributes.body, &offset);
  82. addSingleNode(ns0, &addNodesItem);
  83. UA_ObjectAttributes_deleteMembers(&objAttr);
  84. UA_AddNodesItem_deleteMembers(&addNodesItem);
  85. }
  86. static void ns0_addVariableNode(UA_Server *server, UA_NodeId refTypeNodeId,
  87. UA_ExpandedNodeId requestedNodeId, UA_ExpandedNodeId parentNodeId,
  88. UA_QualifiedName *browseName, UA_LocalizedText *displayName,
  89. UA_LocalizedText *description, UA_DataValue *dataValue,
  90. UA_Int32 valueRank) {
  91. UA_VariableAttributes varAttr;
  92. UA_VariableAttributes_init(&varAttr);
  93. UA_AddNodesItem addNodesItem;
  94. UA_AddNodesItem_init(&addNodesItem);
  95. UA_Namespace *ns0 = UA_NULL;
  96. UA_NamespaceManager_getNamespace(&server->namespaceManager, 0, &ns0);
  97. addNodesItem.parentNodeId = parentNodeId;
  98. addNodesItem.requestedNewNodeId = requestedNodeId;
  99. addNodesItem.referenceTypeId = refTypeNodeId;
  100. addNodesItem.nodeClass = UA_NODECLASS_VARIABLE;
  101. UA_QualifiedName_copy(browseName, &addNodesItem.browseName);
  102. addNodesItem.typeDefinition.nodeId.identifier.numeric = 357;
  103. addNodesItem.typeDefinition.nodeId.identifierType = UA_NODEIDTYPE_NUMERIC;
  104. addNodesItem.typeDefinition.nodeId.namespaceIndex = 0;
  105. addNodesItem.nodeAttributes.typeId = addNodesItem.typeDefinition.nodeId;
  106. UA_LocalizedText_copy(displayName, &varAttr.displayName);
  107. UA_LocalizedText_copy(description, &varAttr.description);
  108. //UA_Variant_copy(&dataValue->value,&varAttr.value);
  109. varAttr.userWriteMask = 0;
  110. varAttr.writeMask = 0;
  111. UA_Variant_copy(&dataValue->value, &varAttr.value);
  112. varAttr.dataType = varAttr.value.vt->typeId;
  113. varAttr.valueRank = valueRank;
  114. varAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_VALUERANK;
  115. UA_Array_copy(dataValue->value.storage.data.arrayDimensions,
  116. dataValue->value.storage.data.arrayDimensionsLength,
  117. &UA_TYPES[UA_UINT32], (void**)&varAttr.arrayDimensions);
  118. varAttr.arrayDimensionsSize =
  119. dataValue->value.storage.data.arrayDimensionsLength;
  120. varAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_BROWSENAME;
  121. varAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_DISPLAYNAME;
  122. varAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_DESCRIPTION;
  123. varAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_VALUE;
  124. varAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_DATATYPE;
  125. varAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_ARRAYDIMENSIONS;
  126. UA_UInt32 offset = 0;
  127. UA_ByteString_newMembers(&addNodesItem.nodeAttributes.body,
  128. UA_VariableAttributes_calcSizeBinary(&varAttr));
  129. UA_VariableAttributes_encodeBinary(&varAttr,
  130. &addNodesItem.nodeAttributes.body, &offset);
  131. addSingleNode(ns0, &addNodesItem);
  132. UA_VariableAttributes_deleteMembers(&varAttr);
  133. UA_AddNodesItem_deleteMembers(&addNodesItem);
  134. }
  135. static void ns0_addReferenceTypeNode(UA_Server *server,
  136. UA_NodeId REFTYPE_NODEID, UA_ExpandedNodeId REQ_NODEID,
  137. UA_ExpandedNodeId PARENTNODEID, char* REFTYPE_BROWSENAME,
  138. char* REFTYPE_DISPLAYNAME, char*REFTYPE_DESCRIPTION,
  139. UA_Boolean IS_ABSTRACT, UA_Boolean IS_SYMMETRIC) {
  140. UA_AddNodesItem addNodesItem;
  141. UA_AddNodesItem_init(&addNodesItem);
  142. UA_Namespace *ns0;
  143. UA_NamespaceManager_getNamespace(&server->namespaceManager, 0, &ns0);
  144. UA_ReferenceTypeAttributes refTypeAttr;
  145. UA_ReferenceTypeAttributes_init(&refTypeAttr);
  146. addNodesItem.parentNodeId = PARENTNODEID;
  147. addNodesItem.requestedNewNodeId = REQ_NODEID;
  148. addNodesItem.referenceTypeId = REFTYPE_NODEID;
  149. addNodesItem.nodeClass = UA_NODECLASS_REFERENCETYPE;
  150. UA_QualifiedName_copycstring(REFTYPE_BROWSENAME, &addNodesItem.browseName);
  151. UA_LocalizedText_copycstring(REFTYPE_DISPLAYNAME, &refTypeAttr.displayName);
  152. UA_LocalizedText_copycstring(REFTYPE_DESCRIPTION, &refTypeAttr.description);
  153. refTypeAttr.isAbstract = IS_ABSTRACT;
  154. refTypeAttr.symmetric = IS_SYMMETRIC;
  155. refTypeAttr.userWriteMask = 0;
  156. refTypeAttr.writeMask = 0;
  157. UA_LocalizedText_copycstring(REFTYPE_DISPLAYNAME, &refTypeAttr.inverseName);
  158. refTypeAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_BROWSENAME;
  159. refTypeAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_DISPLAYNAME;
  160. refTypeAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_DESCRIPTION;
  161. refTypeAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_ISABSTRACT;
  162. refTypeAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_SYMMETRIC;
  163. refTypeAttr.specifiedAttributes |= UA_NODEATTRIBUTESMASK_INVERSENAME;
  164. UA_UInt32 offset = 0;
  165. UA_ByteString_newMembers(&addNodesItem.nodeAttributes.body,
  166. UA_ReferenceTypeAttributes_calcSizeBinary(&refTypeAttr));
  167. UA_ReferenceTypeAttributes_encodeBinary(&refTypeAttr,
  168. &addNodesItem.nodeAttributes.body, &offset);
  169. addSingleNode(ns0, &addNodesItem);
  170. UA_ReferenceTypeAttributes_deleteMembers(&refTypeAttr);
  171. UA_AddNodesItem_deleteMembers(&addNodesItem);
  172. }
  173. UA_Server * UA_Server_new(UA_String *endpointUrl,
  174. UA_ByteString *serverCertificate, UA_NodeStoreInterface *ns0Nodestore,
  175. UA_Boolean useOpen62541NodeStore) {
  176. UA_Server *server = UA_alloc(sizeof(UA_Server));
  177. if (!server)
  178. return server;
  179. UA_ApplicationDescription_init(&server->description);
  180. //add namespace zero
  181. UA_NodeStoreInterface nodestoreInterface;
  182. UA_NamespaceManager_init(&server->namespaceManager);
  183. if (!useOpen62541NodeStore) {
  184. nodestoreInterface = *ns0Nodestore;
  185. }
  186. UA_Server_registerNS0Operations(server, &nodestoreInterface);
  187. UA_NamespaceManager_createNamespace(&server->namespaceManager, 0,
  188. &nodestoreInterface);
  189. // mockup application description
  190. UA_ApplicationDescription_init(&server->description);
  191. UA_String_copycstring("urn:servername:open62541:application",
  192. &server->description.productUri);
  193. UA_String_copycstring("http://open62541.info/applications/4711",
  194. &server->description.applicationUri);
  195. UA_LocalizedText_copycstring("The open62541 application",
  196. &server->description.applicationName);
  197. server->description.applicationType = UA_APPLICATIONTYPE_SERVER;
  198. UA_ByteString_init(&server->serverCertificate);
  199. if (serverCertificate)
  200. UA_ByteString_copy(serverCertificate, &server->serverCertificate);
  201. // mockup endpoint description
  202. server->endpointDescriptionsSize = 1;
  203. UA_EndpointDescription *endpoint = UA_alloc(sizeof(UA_EndpointDescription)); // todo: check return code
  204. endpoint->securityMode = UA_MESSAGESECURITYMODE_NONE;
  205. UA_String_copycstring("http://opcfoundation.org/UA/SecurityPolicy#None",
  206. &endpoint->securityPolicyUri);
  207. UA_String_copycstring(
  208. "http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary",
  209. &endpoint->transportProfileUri);
  210. endpoint->userIdentityTokensSize = 1;
  211. endpoint->userIdentityTokens = UA_alloc(sizeof(UA_UserTokenPolicy));
  212. UA_UserTokenPolicy_init(endpoint->userIdentityTokens);
  213. UA_String_copycstring("my-anonymous-policy",
  214. &endpoint->userIdentityTokens->policyId); // defined per server
  215. endpoint->userIdentityTokens->tokenType = UA_USERTOKENTYPE_ANONYMOUS;
  216. UA_String_copy(endpointUrl, &endpoint->endpointUrl);
  217. /* The standard says "the HostName specified in the Server Certificate is the
  218. same as the HostName contained in the endpointUrl provided in the
  219. EndpointDescription */
  220. UA_String_copy(&server->serverCertificate, &endpoint->serverCertificate);
  221. UA_ApplicationDescription_copy(&server->description, &endpoint->server);
  222. server->endpointDescriptions = endpoint;
  223. #define MAXCHANNELCOUNT 100
  224. #define STARTCHANNELID 1
  225. #define TOKENLIFETIME 10000
  226. #define STARTTOKENID 1
  227. UA_SecureChannelManager_init(&server->secureChannelManager, MAXCHANNELCOUNT,
  228. TOKENLIFETIME, STARTCHANNELID, STARTTOKENID, endpointUrl);
  229. #define MAXSESSIONCOUNT 1000
  230. #define SESSIONLIFETIME 10000
  231. #define STARTSESSIONID 1
  232. UA_SessionManager_init(&server->sessionManager, MAXSESSIONCOUNT,
  233. SESSIONLIFETIME, STARTSESSIONID);
  234. //ns0: C2UA_STRING("http://opcfoundation.org/UA/"));
  235. //ns1: C2UA_STRING("http://localhost:16664/open62541/"));
  236. /**************/
  237. /* References */
  238. /**************/
  239. // ReferenceType Ids
  240. UA_ExpandedNodeId RefTypeId_References;
  241. NS0EXPANDEDNODEID(RefTypeId_References, 31);
  242. UA_ExpandedNodeId RefTypeId_NonHierarchicalReferences;
  243. NS0EXPANDEDNODEID(RefTypeId_NonHierarchicalReferences, 32);
  244. UA_ExpandedNodeId RefTypeId_HierarchicalReferences;
  245. NS0EXPANDEDNODEID(RefTypeId_HierarchicalReferences, 33);
  246. UA_ExpandedNodeId RefTypeId_HasChild;
  247. NS0EXPANDEDNODEID(RefTypeId_HasChild, 34);
  248. UA_ExpandedNodeId RefTypeId_Organizes;
  249. NS0EXPANDEDNODEID(RefTypeId_Organizes, 35);
  250. UA_ExpandedNodeId RefTypeId_HasEventSource;
  251. NS0EXPANDEDNODEID(RefTypeId_HasEventSource, 36);
  252. UA_ExpandedNodeId RefTypeId_HasModellingRule;
  253. NS0EXPANDEDNODEID(RefTypeId_HasModellingRule, 37);
  254. UA_ExpandedNodeId RefTypeId_HasEncoding;
  255. NS0EXPANDEDNODEID(RefTypeId_HasEncoding, 38);
  256. UA_ExpandedNodeId RefTypeId_HasDescription;
  257. NS0EXPANDEDNODEID(RefTypeId_HasDescription, 39);
  258. UA_ExpandedNodeId RefTypeId_HasTypeDefinition;
  259. NS0EXPANDEDNODEID(RefTypeId_HasTypeDefinition, 40);
  260. UA_ExpandedNodeId RefTypeId_GeneratesEvent;
  261. NS0EXPANDEDNODEID(RefTypeId_GeneratesEvent, 41);
  262. UA_ExpandedNodeId RefTypeId_Aggregates;
  263. NS0EXPANDEDNODEID(RefTypeId_Aggregates, 44);
  264. UA_ExpandedNodeId RefTypeId_HasSubtype;
  265. NS0EXPANDEDNODEID(RefTypeId_HasSubtype, 45);
  266. UA_ExpandedNodeId RefTypeId_HasProperty;
  267. NS0EXPANDEDNODEID(RefTypeId_HasProperty, 46);
  268. UA_ExpandedNodeId RefTypeId_HasComponent;
  269. NS0EXPANDEDNODEID(RefTypeId_HasComponent, 47);
  270. UA_ExpandedNodeId RefTypeId_HasNotifier;
  271. NS0EXPANDEDNODEID(RefTypeId_HasNotifier, 48);
  272. UA_ExpandedNodeId RefTypeId_HasOrderedComponent;
  273. NS0EXPANDEDNODEID(RefTypeId_HasOrderedComponent, 49);
  274. UA_ExpandedNodeId RefTypeId_HasModelParent;
  275. NS0EXPANDEDNODEID(RefTypeId_HasModelParent, 50);
  276. UA_ExpandedNodeId RefTypeId_FromState;
  277. NS0EXPANDEDNODEID(RefTypeId_FromState, 51);
  278. UA_ExpandedNodeId RefTypeId_ToState;
  279. NS0EXPANDEDNODEID(RefTypeId_ToState, 52);
  280. UA_ExpandedNodeId RefTypeId_HasCause;
  281. NS0EXPANDEDNODEID(RefTypeId_HasCause, 53);
  282. UA_ExpandedNodeId RefTypeId_HasEffect;
  283. NS0EXPANDEDNODEID(RefTypeId_HasEffect, 54);
  284. UA_ExpandedNodeId RefTypeId_HasHistoricalConfiguration;
  285. NS0EXPANDEDNODEID(RefTypeId_HasHistoricalConfiguration, 56);
  286. /*
  287. #define ADDREFERENCE(NODE, REFTYPE, INVERSE, TARGET_NODEID) do { \
  288. static struct UA_ReferenceNode NODE##REFTYPE##TARGET_NODEID; \
  289. UA_ReferenceNode_init(&NODE##REFTYPE##TARGET_NODEID); \
  290. NODE##REFTYPE##TARGET_NODEID.referenceTypeId = REFTYPE.nodeId; \
  291. NODE##REFTYPE##TARGET_NODEID.isInverse = INVERSE; \
  292. NODE##REFTYPE##TARGET_NODEID.targetId = TARGET_NODEID; \
  293. AddReference(server->nodestore, (UA_Node *)NODE, &NODE##REFTYPE##TARGET_NODEID); \
  294. } while(0)
  295. */
  296. // ObjectTypes (Ids only)
  297. // UA_ExpandedNodeId ObjTypeId_FolderType; NS0EXPANDEDNODEID(ObjTypeId_FolderType, 61);
  298. // Objects (Ids only)
  299. UA_ExpandedNodeId ObjId_Null;
  300. NS0EXPANDEDNODEID(ObjId_Null, 0);
  301. UA_ExpandedNodeId ObjId_Root;
  302. NS0EXPANDEDNODEID(ObjId_Root, 84);
  303. UA_ExpandedNodeId ObjId_ObjectsFolder;
  304. NS0EXPANDEDNODEID(ObjId_ObjectsFolder, 85);
  305. UA_ExpandedNodeId ObjId_TypesFolder;
  306. NS0EXPANDEDNODEID(ObjId_TypesFolder, 86);
  307. UA_ExpandedNodeId ObjId_ViewsFolder;
  308. NS0EXPANDEDNODEID(ObjId_ViewsFolder, 87);
  309. UA_ExpandedNodeId ObjId_ReferenceTypesFolder;
  310. NS0EXPANDEDNODEID(ObjId_ReferenceTypesFolder, 91);
  311. UA_ExpandedNodeId ObjId_Server;
  312. NS0EXPANDEDNODEID(ObjId_Server, 2253);
  313. //UA_ExpandedNodeId VarId_ServerArray;
  314. //NS0EXPANDEDNODEID(VarId_ServerArray, 2254);
  315. UA_ExpandedNodeId VarId_NamespaceArray;
  316. NS0EXPANDEDNODEID(VarId_NamespaceArray, 2255);
  317. UA_ExpandedNodeId VarId_ServerStatus;
  318. NS0EXPANDEDNODEID(VarId_ServerStatus, 2256);
  319. // UA_ExpandedNodeId ObjId_ServerCapabilities; NS0EXPANDEDNODEID(ObjId_ServerCapabilities, 2268);
  320. UA_ExpandedNodeId VarId_State;
  321. NS0EXPANDEDNODEID(VarId_State, 2259);
  322. ns0_addObjectNode(server, RefTypeId_Organizes.nodeId, ObjId_Root,
  323. ObjId_Null, "Root", "Root", "Root");
  324. ns0_addObjectNode(server, RefTypeId_Organizes.nodeId, ObjId_ObjectsFolder,
  325. ObjId_Root, "Objects", "Objects", "Objects");
  326. ns0_addObjectNode(server, RefTypeId_Organizes.nodeId, ObjId_Server,
  327. ObjId_ObjectsFolder, "Server", "Server", "Server");
  328. UA_DataValue serverArrayValue;
  329. UA_DataValue_init(&serverArrayValue);
  330. UA_UInt32 namespaceArraySize = 2;
  331. UA_Array_new((void**) &serverArrayValue.value.storage.data.dataPtr,
  332. namespaceArraySize, &UA_TYPES[UA_STRING]);
  333. UA_String_copycstring("http://opcfoundation.org/UA/",
  334. &((UA_String *) (serverArrayValue.value.storage.data.dataPtr))[0]);
  335. UA_String_copycstring("http://namespace123",
  336. &((UA_String *) (serverArrayValue.value.storage.data.dataPtr))[1]);
  337. UA_Int32 *arrayDim = UA_NULL;
  338. UA_UInt32 arrayDimSize = -1;
  339. serverArrayValue.value.vt = &UA_TYPES[UA_STRING];
  340. serverArrayValue.value.storage.data.arrayDimensions = arrayDim;
  341. serverArrayValue.value.storage.data.arrayDimensionsLength = arrayDimSize; // added to ensure encoding in readreponse
  342. serverArrayValue.value.storage.data.arrayLength = namespaceArraySize;
  343. serverArrayValue.value.storageType = UA_VARIANT_DATA;
  344. {
  345. UA_QualifiedName browseName;
  346. UA_LocalizedText description;
  347. UA_LocalizedText displayName;
  348. UA_QualifiedName_copycstring("NamespaceArray", &browseName);
  349. UA_LocalizedText_copycstring("NamespaceArray", &description);
  350. UA_LocalizedText_copycstring("NamespaceArray", &displayName);
  351. ns0_addVariableNode(server, RefTypeId_HasComponent.nodeId,
  352. VarId_NamespaceArray, ObjId_Server, &browseName, &description,
  353. &displayName, &serverArrayValue, 1);
  354. UA_QualifiedName_deleteMembers(&browseName);
  355. UA_LocalizedText_deleteMembers(&description);
  356. UA_LocalizedText_deleteMembers(&displayName);
  357. }
  358. UA_DataValue_deleteMembers(&serverArrayValue);
  359. // ServerStatus
  360. UA_DataValue serverStatusValue;
  361. UA_DataValue_init(&serverStatusValue);
  362. UA_ServerStatusDataType status;
  363. UA_ServerStatusDataType_init(&status);
  364. status.startTime = UA_DateTime_now();
  365. status.currentTime = UA_DateTime_now();
  366. status.state = UA_SERVERSTATE_RUNNING;
  367. UA_String_copycstring("open62541.org", &status.buildInfo.productUri);
  368. UA_String_copycstring("open62541", &status.buildInfo.manufacturerName);
  369. UA_String_copycstring("open62541", &status.buildInfo.productName);
  370. UA_String_copycstring("0.0", &status.buildInfo.softwareVersion);
  371. UA_String_copycstring("0.0", &status.buildInfo.buildNumber);
  372. status.buildInfo.buildDate = UA_DateTime_now();
  373. UA_String_copycstring("en", &status.shutdownReason.locale);
  374. UA_String_copycstring("because", &status.shutdownReason.text);
  375. status.secondsTillShutdown = 99999999;
  376. serverStatusValue.value.vt = &UA_TYPES[UA_SERVERSTATUSDATATYPE]; // gets encoded as an extensionobject
  377. serverStatusValue.value.storage.data.arrayLength = 0;
  378. serverStatusValue.value.storage.data.dataPtr = &status;
  379. serverStatusValue.value.storage.data.arrayDimensionsLength = 0;
  380. {
  381. UA_QualifiedName browseName;
  382. UA_LocalizedText description;
  383. UA_LocalizedText displayName;
  384. UA_QualifiedName_copycstring("ServerStatus", &browseName);
  385. UA_LocalizedText_copycstring("ServerStatus", &description);
  386. UA_LocalizedText_copycstring("ServerStatus", &displayName);
  387. ns0_addVariableNode(server, RefTypeId_HasComponent.nodeId,
  388. VarId_ServerStatus, ObjId_Server, &browseName, &description,
  389. &displayName, &serverStatusValue, -1);
  390. UA_QualifiedName_deleteMembers(&browseName);
  391. UA_LocalizedText_deleteMembers(&description);
  392. UA_LocalizedText_deleteMembers(&displayName);
  393. }
  394. UA_ServerStatusDataType_deleteMembers(&status);
  395. // State (Component of ServerStatus)
  396. UA_DataValue stateValue;
  397. UA_DataValue_init(&stateValue);
  398. stateValue.value.vt = &UA_TYPES[UA_SERVERSTATE];
  399. stateValue.value.storage.data.arrayDimensionsLength = 0; // added to ensure encoding in readreponse
  400. stateValue.value.storage.data.arrayLength = 0;
  401. stateValue.value.storage.data.dataPtr = &status.state; // points into the other object.
  402. stateValue.value.storageType = UA_VARIANT_DATA;
  403. {
  404. UA_QualifiedName browseName;
  405. UA_LocalizedText description;
  406. UA_LocalizedText displayName;
  407. UA_QualifiedName_copycstring("State", &browseName);
  408. UA_LocalizedText_copycstring("State", &description);
  409. UA_LocalizedText_copycstring("State", &displayName);
  410. ns0_addVariableNode(server, RefTypeId_HasComponent.nodeId, VarId_State,
  411. ObjId_Server, &browseName, &description, &displayName,
  412. &stateValue, -1);
  413. UA_QualifiedName_deleteMembers(&browseName);
  414. UA_LocalizedText_deleteMembers(&description);
  415. UA_LocalizedText_deleteMembers(&displayName);
  416. }
  417. ns0_addObjectNode(server, RefTypeId_Organizes.nodeId, ObjId_TypesFolder,
  418. ObjId_Root, "Types", "Types", "Types");
  419. ns0_addObjectNode(server, RefTypeId_Organizes.nodeId, ObjId_TypesFolder,
  420. ObjId_Root, "Types", "Types", "Types");
  421. ns0_addObjectNode(server, RefTypeId_Organizes.nodeId,
  422. ObjId_ReferenceTypesFolder, ObjId_TypesFolder, "ReferenceTypes",
  423. "ReferenceTypes", "ReferenceTypes");
  424. ns0_addReferenceTypeNode(server, RefTypeId_Organizes.nodeId,
  425. RefTypeId_References, ObjId_ReferenceTypesFolder, "References",
  426. "References", "References", UA_TRUE, UA_TRUE);
  427. ns0_addObjectNode(server, RefTypeId_Organizes.nodeId, ObjId_ViewsFolder,
  428. ObjId_Root, "Views", "Views", "Views");
  429. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  430. RefTypeId_NonHierarchicalReferences, RefTypeId_References,
  431. "NonHierarchicalReferences", "NonHierarchicalReferences",
  432. "NonHierarchicalReferences", UA_TRUE, UA_FALSE);
  433. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  434. RefTypeId_HasModelParent, RefTypeId_NonHierarchicalReferences,
  435. "HasModelParent", "HasModelParent", "HasModelParent", UA_TRUE,
  436. UA_FALSE);
  437. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  438. RefTypeId_GeneratesEvent, RefTypeId_NonHierarchicalReferences,
  439. "GeneratesEvent", "GeneratesEvent", "GeneratesEvent", UA_TRUE,
  440. UA_FALSE);
  441. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  442. RefTypeId_HasEncoding, RefTypeId_NonHierarchicalReferences,
  443. "HasEncoding", "HasEncoding", "HasEncoding", UA_TRUE, UA_FALSE);
  444. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  445. RefTypeId_HasModellingRule, RefTypeId_NonHierarchicalReferences,
  446. "HasModellingRule", "HasModellingRule", "HasModellingRule", UA_TRUE,
  447. UA_FALSE);
  448. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  449. RefTypeId_HasDescription, RefTypeId_NonHierarchicalReferences,
  450. "HasDescription", "HasDescription", "HasDescription", UA_TRUE,
  451. UA_FALSE);
  452. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  453. RefTypeId_HasTypeDefinition, RefTypeId_NonHierarchicalReferences,
  454. "HasTypeDefinition", "HasTypeDefinition", "HasTypeDefinition",
  455. UA_TRUE, UA_FALSE);
  456. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  457. RefTypeId_FromState, RefTypeId_NonHierarchicalReferences,
  458. "FromState", "FromState", "FromState", UA_TRUE, UA_FALSE);
  459. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  460. RefTypeId_ToState, RefTypeId_NonHierarchicalReferences, "ToState",
  461. "ToState", "ToState", UA_TRUE, UA_FALSE);
  462. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  463. RefTypeId_HasCause, RefTypeId_NonHierarchicalReferences, "HasCause",
  464. "HasCause", "HasCause", UA_TRUE, UA_FALSE);
  465. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  466. RefTypeId_HasEffect, RefTypeId_NonHierarchicalReferences,
  467. "HasEffect", "HasEffect", "HasEffect", UA_TRUE, UA_FALSE);
  468. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  469. RefTypeId_HasHistoricalConfiguration,
  470. RefTypeId_NonHierarchicalReferences, "HasHistoricalConfiguration",
  471. "HasHistoricalConfiguration", "HasHistoricalConfiguration", UA_TRUE,
  472. UA_FALSE);
  473. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  474. RefTypeId_HierarchicalReferences, RefTypeId_References,
  475. "HierarchicalReferences", "HierarchicalReferences",
  476. "HierarchicalReferences", UA_TRUE, UA_FALSE);
  477. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  478. RefTypeId_HasEventSource, RefTypeId_HierarchicalReferences,
  479. "HasEventSource", "HasEventSource", "HasEventSource", UA_TRUE,
  480. UA_FALSE);
  481. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  482. RefTypeId_HasNotifier, RefTypeId_HasEventSource, "HasEventSource",
  483. "HasEventSource", "HasEventSource", UA_TRUE, UA_FALSE);
  484. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  485. RefTypeId_HasChild, RefTypeId_HierarchicalReferences, "HasChild",
  486. "HasChild", "HasChild", UA_TRUE, UA_FALSE);
  487. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  488. RefTypeId_Aggregates, RefTypeId_HasChild, "Aggregates",
  489. "Aggregates", "Aggregates",
  490. UA_TRUE, UA_FALSE);
  491. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  492. RefTypeId_HasProperty, RefTypeId_Aggregates, "HasProperty",
  493. "HasProperty", "HasProperty",
  494. UA_TRUE, UA_FALSE);
  495. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  496. RefTypeId_HasComponent, RefTypeId_Aggregates, "HasComponent",
  497. "HasComponent", "HasComponent", UA_TRUE, UA_FALSE);
  498. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  499. RefTypeId_HasOrderedComponent, RefTypeId_HasComponent,
  500. "HasOrderedComponent", "HasOrderedComponent", "HasOrderedComponent",
  501. UA_TRUE, UA_FALSE);
  502. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  503. RefTypeId_HasSubtype, RefTypeId_HasChild, "HasSubtype",
  504. "HasSubtype", "HasSubtype",
  505. UA_TRUE, UA_FALSE);
  506. ns0_addReferenceTypeNode(server, RefTypeId_HasSubtype.nodeId,
  507. RefTypeId_Organizes, RefTypeId_HierarchicalReferences, "Organizes",
  508. "Organizes", "Organizes", UA_TRUE, UA_FALSE);
  509. return server;
  510. }
  511. void UA_Server_addScalarVariableNode(UA_Server *server,
  512. UA_QualifiedName *browseName, void *value, const UA_VTable_Entry *vt,
  513. UA_ExpandedNodeId *parentNodeId, UA_NodeId *referenceTypeId) {
  514. UA_DataValue dataValue;
  515. UA_DataValue_init(&dataValue);
  516. /*UA_LocalizedText_copycstring("integer value", &tmpNode->description); */
  517. UA_LocalizedText displayName;
  518. UA_LocalizedText description;
  519. UA_LocalizedText_init(&displayName);
  520. UA_LocalizedText_init(&description);
  521. UA_String_copy(&browseName->name, &displayName.text);
  522. UA_String_copy(&browseName->name, &description.text);
  523. dataValue.value.vt = vt;
  524. dataValue.value.storage.data.dataPtr = value;
  525. dataValue.value.storageType = UA_VARIANT_DATA_NODELETE;
  526. dataValue.value.storage.data.arrayLength = 1;
  527. UA_ExpandedNodeId reqNodeId;
  528. UA_ExpandedNodeId_init(&reqNodeId);
  529. reqNodeId.namespaceUri.length = -1;
  530. reqNodeId.nodeId.namespaceIndex = 0;
  531. reqNodeId.nodeId.identifier.numeric = 222;
  532. reqNodeId.nodeId.identifierType = UA_NODEIDTYPE_NUMERIC;
  533. ns0_addVariableNode(server, *referenceTypeId, reqNodeId, *parentNodeId,
  534. browseName, &displayName, &description, &dataValue, -1);
  535. UA_DataValue_deleteMembers(&dataValue);
  536. UA_LocalizedText_deleteMembers(&displayName);
  537. UA_LocalizedText_deleteMembers(&description);
  538. }
  539. UA_Int32 UA_Server_addNamespace(UA_Server *server, UA_UInt16 namespaceIndex,
  540. UA_NodeStoreInterface *nodeStore) {
  541. return (UA_Int32) UA_NamespaceManager_createNamespace(
  542. &server->namespaceManager, namespaceIndex, nodeStore);
  543. }