ua_server.h 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  4. *
  5. * Copyright 2014-2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
  6. * Copyright 2015-2016 (c) Sten Grüner
  7. * Copyright 2014-2015, 2017 (c) Florian Palm
  8. * Copyright 2015-2016 (c) Chris Iatrou
  9. * Copyright 2015-2016 (c) Oleksiy Vasylyev
  10. * Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
  11. */
  12. #ifndef UA_SERVER_H_
  13. #define UA_SERVER_H_
  14. #include "ua_types.h"
  15. #include "ua_types_generated.h"
  16. #include "ua_types_generated_handling.h"
  17. #include "ua_nodeids.h"
  18. _UA_BEGIN_DECLS
  19. /* Forward declarations */
  20. struct UA_ServerConfig;
  21. typedef struct UA_ServerConfig UA_ServerConfig;
  22. struct UA_Server;
  23. typedef struct UA_Server UA_Server;
  24. struct UA_Client;
  25. /**
  26. * .. _server:
  27. *
  28. * Server
  29. * ======
  30. *
  31. * .. include:: server_config.rst
  32. *
  33. * .. _server-lifecycle:
  34. *
  35. * Server Lifecycle
  36. * ---------------- */
  37. UA_Server UA_EXPORT * UA_Server_new(const UA_ServerConfig *config);
  38. void UA_EXPORT UA_Server_delete(UA_Server *server);
  39. /* Runs the main loop of the server. In each iteration, this calls into the
  40. * networklayers to see if messages have arrived.
  41. *
  42. * @param server The server object.
  43. * @param running The loop is run as long as *running is true.
  44. * Otherwise, the server shuts down.
  45. * @return Returns the statuscode of the UA_Server_run_shutdown method */
  46. UA_StatusCode UA_EXPORT
  47. UA_Server_run(UA_Server *server, volatile UA_Boolean *running);
  48. /* The prologue part of UA_Server_run (no need to use if you call
  49. * UA_Server_run) */
  50. UA_StatusCode UA_EXPORT
  51. UA_Server_run_startup(UA_Server *server);
  52. /* Executes a single iteration of the server's main loop.
  53. *
  54. * @param server The server object.
  55. * @param waitInternal Should we wait for messages in the networklayer?
  56. * Otherwise, the timouts for the networklayers are set to zero.
  57. * The default max wait time is 50millisec.
  58. * @return Returns how long we can wait until the next scheduled
  59. * callback (in ms) */
  60. UA_UInt16 UA_EXPORT
  61. UA_Server_run_iterate(UA_Server *server, UA_Boolean waitInternal);
  62. /* The epilogue part of UA_Server_run (no need to use if you call
  63. * UA_Server_run) */
  64. UA_StatusCode UA_EXPORT
  65. UA_Server_run_shutdown(UA_Server *server);
  66. /**
  67. * Repeated Callbacks
  68. * ------------------ */
  69. typedef void (*UA_ServerCallback)(UA_Server *server, void *data);
  70. /* Add a callback for cyclic repetition to the server.
  71. *
  72. * @param server The server object.
  73. * @param callback The callback that shall be added.
  74. * @param interval The callback shall be repeatedly executed with the given interval
  75. * (in ms). The interval must be larger than 5ms. The first execution
  76. * occurs at now() + interval at the latest.
  77. * @param callbackId Set to the identifier of the repeated callback . This can be used to cancel
  78. * the callback later on. If the pointer is null, the identifier is not set.
  79. * @return Upon success, UA_STATUSCODE_GOOD is returned.
  80. * An error code otherwise. */
  81. UA_StatusCode UA_EXPORT
  82. UA_Server_addRepeatedCallback(UA_Server *server, UA_ServerCallback callback,
  83. void *data, UA_UInt32 interval, UA_UInt64 *callbackId);
  84. UA_StatusCode UA_EXPORT
  85. UA_Server_changeRepeatedCallbackInterval(UA_Server *server, UA_UInt64 callbackId,
  86. UA_UInt32 interval);
  87. /* Remove a repeated callback.
  88. *
  89. * @param server The server object.
  90. * @param callbackId The id of the callback that shall be removed.
  91. * @return Upon success, UA_STATUSCODE_GOOD is returned.
  92. * An error code otherwise. */
  93. UA_StatusCode UA_EXPORT
  94. UA_Server_removeRepeatedCallback(UA_Server *server, UA_UInt64 callbackId);
  95. /**
  96. * Reading and Writing Node Attributes
  97. * -----------------------------------
  98. * The functions for reading and writing node attributes call the regular read
  99. * and write service in the background that are also used over the network.
  100. *
  101. * The following attributes cannot be read, since the local "admin" user always
  102. * has full rights.
  103. *
  104. * - UserWriteMask
  105. * - UserAccessLevel
  106. * - UserExecutable */
  107. /* Read an attribute of a node. The specialized functions below provide a more
  108. * concise syntax.
  109. *
  110. * @param server The server object.
  111. * @param item ReadValueIds contain the NodeId of the target node, the id of the
  112. * attribute to read and (optionally) an index range to read parts
  113. * of an array only. See the section on NumericRange for the format
  114. * used for array ranges.
  115. * @param timestamps Which timestamps to return for the attribute.
  116. * @return Returns a DataValue that contains either an error code, or a variant
  117. * with the attribute value and the timestamps. */
  118. UA_DataValue UA_EXPORT
  119. UA_Server_read(UA_Server *server, const UA_ReadValueId *item,
  120. UA_TimestampsToReturn timestamps);
  121. /* Don't use this function. There are typed versions for every supported
  122. * attribute. */
  123. UA_StatusCode UA_EXPORT
  124. __UA_Server_read(UA_Server *server, const UA_NodeId *nodeId,
  125. UA_AttributeId attributeId, void *v);
  126. static UA_INLINE UA_StatusCode
  127. UA_Server_readNodeId(UA_Server *server, const UA_NodeId nodeId,
  128. UA_NodeId *outNodeId) {
  129. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_NODEID, outNodeId);
  130. }
  131. static UA_INLINE UA_StatusCode
  132. UA_Server_readNodeClass(UA_Server *server, const UA_NodeId nodeId,
  133. UA_NodeClass *outNodeClass) {
  134. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_NODECLASS,
  135. outNodeClass);
  136. }
  137. static UA_INLINE UA_StatusCode
  138. UA_Server_readBrowseName(UA_Server *server, const UA_NodeId nodeId,
  139. UA_QualifiedName *outBrowseName) {
  140. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_BROWSENAME,
  141. outBrowseName);
  142. }
  143. static UA_INLINE UA_StatusCode
  144. UA_Server_readDisplayName(UA_Server *server, const UA_NodeId nodeId,
  145. UA_LocalizedText *outDisplayName) {
  146. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_DISPLAYNAME,
  147. outDisplayName);
  148. }
  149. static UA_INLINE UA_StatusCode
  150. UA_Server_readDescription(UA_Server *server, const UA_NodeId nodeId,
  151. UA_LocalizedText *outDescription) {
  152. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_DESCRIPTION,
  153. outDescription);
  154. }
  155. static UA_INLINE UA_StatusCode
  156. UA_Server_readWriteMask(UA_Server *server, const UA_NodeId nodeId,
  157. UA_UInt32 *outWriteMask) {
  158. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_WRITEMASK,
  159. outWriteMask);
  160. }
  161. static UA_INLINE UA_StatusCode
  162. UA_Server_readIsAbstract(UA_Server *server, const UA_NodeId nodeId,
  163. UA_Boolean *outIsAbstract) {
  164. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_ISABSTRACT,
  165. outIsAbstract);
  166. }
  167. static UA_INLINE UA_StatusCode
  168. UA_Server_readSymmetric(UA_Server *server, const UA_NodeId nodeId,
  169. UA_Boolean *outSymmetric) {
  170. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_SYMMETRIC,
  171. outSymmetric);
  172. }
  173. static UA_INLINE UA_StatusCode
  174. UA_Server_readInverseName(UA_Server *server, const UA_NodeId nodeId,
  175. UA_LocalizedText *outInverseName) {
  176. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_INVERSENAME,
  177. outInverseName);
  178. }
  179. static UA_INLINE UA_StatusCode
  180. UA_Server_readContainsNoLoop(UA_Server *server, const UA_NodeId nodeId,
  181. UA_Boolean *outContainsNoLoops) {
  182. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_CONTAINSNOLOOPS,
  183. outContainsNoLoops);
  184. }
  185. static UA_INLINE UA_StatusCode
  186. UA_Server_readEventNotifier(UA_Server *server, const UA_NodeId nodeId,
  187. UA_Byte *outEventNotifier) {
  188. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER,
  189. outEventNotifier);
  190. }
  191. static UA_INLINE UA_StatusCode
  192. UA_Server_readValue(UA_Server *server, const UA_NodeId nodeId,
  193. UA_Variant *outValue) {
  194. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_VALUE, outValue);
  195. }
  196. static UA_INLINE UA_StatusCode
  197. UA_Server_readDataType(UA_Server *server, const UA_NodeId nodeId,
  198. UA_NodeId *outDataType) {
  199. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_DATATYPE,
  200. outDataType);
  201. }
  202. static UA_INLINE UA_StatusCode
  203. UA_Server_readValueRank(UA_Server *server, const UA_NodeId nodeId,
  204. UA_Int32 *outValueRank) {
  205. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_VALUERANK,
  206. outValueRank);
  207. }
  208. /* Returns a variant with an int32 array */
  209. static UA_INLINE UA_StatusCode
  210. UA_Server_readArrayDimensions(UA_Server *server, const UA_NodeId nodeId,
  211. UA_Variant *outArrayDimensions) {
  212. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_ARRAYDIMENSIONS,
  213. outArrayDimensions);
  214. }
  215. static UA_INLINE UA_StatusCode
  216. UA_Server_readAccessLevel(UA_Server *server, const UA_NodeId nodeId,
  217. UA_Byte *outAccessLevel) {
  218. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_ACCESSLEVEL,
  219. outAccessLevel);
  220. }
  221. static UA_INLINE UA_StatusCode
  222. UA_Server_readMinimumSamplingInterval(UA_Server *server, const UA_NodeId nodeId,
  223. UA_Double *outMinimumSamplingInterval) {
  224. return __UA_Server_read(server, &nodeId,
  225. UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL,
  226. outMinimumSamplingInterval);
  227. }
  228. static UA_INLINE UA_StatusCode
  229. UA_Server_readHistorizing(UA_Server *server, const UA_NodeId nodeId,
  230. UA_Boolean *outHistorizing) {
  231. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_HISTORIZING,
  232. outHistorizing);
  233. }
  234. static UA_INLINE UA_StatusCode
  235. UA_Server_readExecutable(UA_Server *server, const UA_NodeId nodeId,
  236. UA_Boolean *outExecutable) {
  237. return __UA_Server_read(server, &nodeId, UA_ATTRIBUTEID_EXECUTABLE,
  238. outExecutable);
  239. }
  240. /**
  241. * The following node attributes cannot be changed once a node has been created:
  242. *
  243. * - NodeClass
  244. * - NodeId
  245. * - Symmetric
  246. * - ContainsNoLoop
  247. *
  248. * The following attributes cannot be written from the server, as they are
  249. * specific to the different users and set by the access control callback:
  250. *
  251. * - UserWriteMask
  252. * - UserAccessLevel
  253. * - UserExecutable
  254. */
  255. /* Overwrite an attribute of a node. The specialized functions below provide a
  256. * more concise syntax.
  257. *
  258. * @param server The server object.
  259. * @param value WriteValues contain the NodeId of the target node, the id of the
  260. * attribute to overwritten, the actual value and (optionally) an
  261. * index range to replace parts of an array only. of an array only.
  262. * See the section on NumericRange for the format used for array
  263. * ranges.
  264. * @return Returns a status code. */
  265. UA_StatusCode UA_EXPORT
  266. UA_Server_write(UA_Server *server, const UA_WriteValue *value);
  267. /* Don't use this function. There are typed versions with no additional
  268. * overhead. */
  269. UA_StatusCode UA_EXPORT
  270. __UA_Server_write(UA_Server *server, const UA_NodeId *nodeId,
  271. const UA_AttributeId attributeId,
  272. const UA_DataType *attr_type, const void *attr);
  273. static UA_INLINE UA_StatusCode
  274. UA_Server_writeBrowseName(UA_Server *server, const UA_NodeId nodeId,
  275. const UA_QualifiedName browseName) {
  276. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_BROWSENAME,
  277. &UA_TYPES[UA_TYPES_QUALIFIEDNAME], &browseName);
  278. }
  279. static UA_INLINE UA_StatusCode
  280. UA_Server_writeDisplayName(UA_Server *server, const UA_NodeId nodeId,
  281. const UA_LocalizedText displayName) {
  282. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_DISPLAYNAME,
  283. &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &displayName);
  284. }
  285. static UA_INLINE UA_StatusCode
  286. UA_Server_writeDescription(UA_Server *server, const UA_NodeId nodeId,
  287. const UA_LocalizedText description) {
  288. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_DESCRIPTION,
  289. &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &description);
  290. }
  291. static UA_INLINE UA_StatusCode
  292. UA_Server_writeWriteMask(UA_Server *server, const UA_NodeId nodeId,
  293. const UA_UInt32 writeMask) {
  294. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_WRITEMASK,
  295. &UA_TYPES[UA_TYPES_UINT32], &writeMask);
  296. }
  297. static UA_INLINE UA_StatusCode
  298. UA_Server_writeIsAbstract(UA_Server *server, const UA_NodeId nodeId,
  299. const UA_Boolean isAbstract) {
  300. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_ISABSTRACT,
  301. &UA_TYPES[UA_TYPES_BOOLEAN], &isAbstract);
  302. }
  303. static UA_INLINE UA_StatusCode
  304. UA_Server_writeInverseName(UA_Server *server, const UA_NodeId nodeId,
  305. const UA_LocalizedText inverseName) {
  306. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_INVERSENAME,
  307. &UA_TYPES[UA_TYPES_LOCALIZEDTEXT], &inverseName);
  308. }
  309. static UA_INLINE UA_StatusCode
  310. UA_Server_writeEventNotifier(UA_Server *server, const UA_NodeId nodeId,
  311. const UA_Byte eventNotifier) {
  312. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_EVENTNOTIFIER,
  313. &UA_TYPES[UA_TYPES_BYTE], &eventNotifier);
  314. }
  315. static UA_INLINE UA_StatusCode
  316. UA_Server_writeValue(UA_Server *server, const UA_NodeId nodeId,
  317. const UA_Variant value) {
  318. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_VALUE,
  319. &UA_TYPES[UA_TYPES_VARIANT], &value);
  320. }
  321. static UA_INLINE UA_StatusCode
  322. UA_Server_writeDataType(UA_Server *server, const UA_NodeId nodeId,
  323. const UA_NodeId dataType) {
  324. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_DATATYPE,
  325. &UA_TYPES[UA_TYPES_NODEID], &dataType);
  326. }
  327. static UA_INLINE UA_StatusCode
  328. UA_Server_writeValueRank(UA_Server *server, const UA_NodeId nodeId,
  329. const UA_Int32 valueRank) {
  330. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_VALUERANK,
  331. &UA_TYPES[UA_TYPES_INT32], &valueRank);
  332. }
  333. static UA_INLINE UA_StatusCode
  334. UA_Server_writeArrayDimensions(UA_Server *server, const UA_NodeId nodeId,
  335. const UA_Variant arrayDimensions) {
  336. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_VALUE,
  337. &UA_TYPES[UA_TYPES_VARIANT], &arrayDimensions);
  338. }
  339. static UA_INLINE UA_StatusCode
  340. UA_Server_writeAccessLevel(UA_Server *server, const UA_NodeId nodeId,
  341. const UA_Byte accessLevel) {
  342. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_ACCESSLEVEL,
  343. &UA_TYPES[UA_TYPES_BYTE], &accessLevel);
  344. }
  345. static UA_INLINE UA_StatusCode
  346. UA_Server_writeMinimumSamplingInterval(UA_Server *server, const UA_NodeId nodeId,
  347. const UA_Double miniumSamplingInterval) {
  348. return __UA_Server_write(server, &nodeId,
  349. UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL,
  350. &UA_TYPES[UA_TYPES_DOUBLE],
  351. &miniumSamplingInterval);
  352. }
  353. static UA_INLINE UA_StatusCode
  354. UA_Server_writeHistorizing(UA_Server *server, const UA_NodeId nodeId,
  355. const UA_Boolean historizing) {
  356. return __UA_Server_write(server, &nodeId,
  357. UA_ATTRIBUTEID_HISTORIZING,
  358. &UA_TYPES[UA_TYPES_BOOLEAN],
  359. &historizing);
  360. }
  361. static UA_INLINE UA_StatusCode
  362. UA_Server_writeExecutable(UA_Server *server, const UA_NodeId nodeId,
  363. const UA_Boolean executable) {
  364. return __UA_Server_write(server, &nodeId, UA_ATTRIBUTEID_EXECUTABLE,
  365. &UA_TYPES[UA_TYPES_BOOLEAN], &executable); }
  366. /**
  367. * Browsing
  368. * -------- */
  369. UA_BrowseResult UA_EXPORT
  370. UA_Server_browse(UA_Server *server, UA_UInt32 maxrefs,
  371. const UA_BrowseDescription *descr);
  372. UA_BrowseResult UA_EXPORT
  373. UA_Server_browseNext(UA_Server *server, UA_Boolean releaseContinuationPoint,
  374. const UA_ByteString *continuationPoint);
  375. UA_BrowsePathResult UA_EXPORT
  376. UA_Server_translateBrowsePathToNodeIds(UA_Server *server,
  377. const UA_BrowsePath *browsePath);
  378. /* A simplified TranslateBrowsePathsToNodeIds based on the
  379. * SimpleAttributeOperand type (Part 4, 7.4.4.5).
  380. *
  381. * This specifies a relative path using a list of BrowseNames instead of the
  382. * RelativePath structure. The list of BrowseNames is equivalent to a
  383. * RelativePath that specifies forward references which are subtypes of the
  384. * HierarchicalReferences ReferenceType. All Nodes followed by the browsePath
  385. * shall be of the NodeClass Object or Variable. */
  386. UA_BrowsePathResult UA_EXPORT
  387. UA_Server_browseSimplifiedBrowsePath(UA_Server *server, const UA_NodeId origin,
  388. size_t browsePathSize,
  389. const UA_QualifiedName *browsePath);
  390. #ifndef HAVE_NODEITER_CALLBACK
  391. #define HAVE_NODEITER_CALLBACK
  392. /* Iterate over all nodes referenced by parentNodeId by calling the callback
  393. * function for each child node (in ifdef because GCC/CLANG handle include order
  394. * differently) */
  395. typedef UA_StatusCode
  396. (*UA_NodeIteratorCallback)(UA_NodeId childId, UA_Boolean isInverse,
  397. UA_NodeId referenceTypeId, void *handle);
  398. #endif
  399. UA_StatusCode UA_EXPORT
  400. UA_Server_forEachChildNodeCall(UA_Server *server, UA_NodeId parentNodeId,
  401. UA_NodeIteratorCallback callback, void *handle);
  402. #ifdef UA_ENABLE_DISCOVERY
  403. /**
  404. * Discovery
  405. * --------- */
  406. /* Register the given server instance at the discovery server.
  407. * This should be called periodically.
  408. * The semaphoreFilePath is optional. If the given file is deleted,
  409. * the server will automatically be unregistered. This could be
  410. * for example a pid file which is deleted if the server crashes.
  411. *
  412. * When the server shuts down you need to call unregister.
  413. *
  414. * @param server
  415. * @param client the client which is used to call the RegisterServer. It must
  416. * already be connected to the correct endpoint
  417. * @param semaphoreFilePath optional parameter pointing to semaphore file. */
  418. UA_StatusCode UA_EXPORT
  419. UA_Server_register_discovery(UA_Server *server, struct UA_Client *client,
  420. const char* semaphoreFilePath);
  421. /* Unregister the given server instance from the discovery server.
  422. * This should only be called when the server is shutting down.
  423. * @param server
  424. * @param client the client which is used to call the RegisterServer. It must
  425. * already be connected to the correct endpoint */
  426. UA_StatusCode UA_EXPORT
  427. UA_Server_unregister_discovery(UA_Server *server, struct UA_Client *client);
  428. /* Adds a periodic callback to register the server with the LDS (local discovery server)
  429. * periodically. The interval between each register call is given as second parameter.
  430. * It should be 10 minutes by default (= 10*60*1000).
  431. *
  432. * The delayFirstRegisterMs parameter indicates the delay for the first register call.
  433. * If it is 0, the first register call will be after intervalMs milliseconds,
  434. * otherwise the server's first register will be after delayFirstRegisterMs.
  435. *
  436. * When you manually unregister the server, you also need to cancel the
  437. * periodic callback, otherwise it will be automatically be registered again.
  438. *
  439. * If you call this method multiple times for the same discoveryServerUrl, the older
  440. * periodic callback will be removed.
  441. *
  442. * @param server
  443. * @param client the client which is used to call the RegisterServer.
  444. * It must not yet be connected and will be connected for every register call
  445. * to the given discoveryServerUrl.
  446. * @param discoveryServerUrl if set to NULL, the default value
  447. * 'opc.tcp://localhost:4840' will be used
  448. * @param intervalMs
  449. * @param delayFirstRegisterMs
  450. * @param periodicCallbackId */
  451. UA_StatusCode UA_EXPORT
  452. UA_Server_addPeriodicServerRegisterCallback(UA_Server *server, struct UA_Client *client,
  453. const char* discoveryServerUrl,
  454. UA_UInt32 intervalMs,
  455. UA_UInt32 delayFirstRegisterMs,
  456. UA_UInt64 *periodicCallbackId);
  457. /* Callback for RegisterServer. Data is passed from the register call */
  458. typedef void (*UA_Server_registerServerCallback)(const UA_RegisteredServer *registeredServer,
  459. void* data);
  460. /* Set the callback which is called if another server registeres or unregisters
  461. * with this instance. If called multiple times, previous data will be
  462. * overwritten.
  463. *
  464. * @param server
  465. * @param cb the callback
  466. * @param data data passed to the callback
  467. * @return UA_STATUSCODE_SUCCESS on success */
  468. void UA_EXPORT
  469. UA_Server_setRegisterServerCallback(UA_Server *server, UA_Server_registerServerCallback cb,
  470. void* data);
  471. #ifdef UA_ENABLE_DISCOVERY_MULTICAST
  472. /* Callback for server detected through mDNS. Data is passed from the register
  473. * call
  474. *
  475. * @param isServerAnnounce indicates if the server has just been detected. If
  476. * set to false, this means the server is shutting down.
  477. * @param isTxtReceived indicates if we already received the corresponding TXT
  478. * record with the path and caps data */
  479. typedef void (*UA_Server_serverOnNetworkCallback)(const UA_ServerOnNetwork *serverOnNetwork,
  480. UA_Boolean isServerAnnounce,
  481. UA_Boolean isTxtReceived, void* data);
  482. /* Set the callback which is called if another server is found through mDNS or
  483. * deleted. It will be called for any mDNS message from the remote server, thus
  484. * it may be called multiple times for the same instance. Also the SRV and TXT
  485. * records may arrive later, therefore for the first call the server
  486. * capabilities may not be set yet. If called multiple times, previous data will
  487. * be overwritten.
  488. *
  489. * @param server
  490. * @param cb the callback
  491. * @param data data passed to the callback
  492. * @return UA_STATUSCODE_SUCCESS on success */
  493. void UA_EXPORT
  494. UA_Server_setServerOnNetworkCallback(UA_Server *server,
  495. UA_Server_serverOnNetworkCallback cb,
  496. void* data);
  497. #endif /* UA_ENABLE_DISCOVERY_MULTICAST */
  498. #endif /* UA_ENABLE_DISCOVERY */
  499. /**
  500. * Information Model Callbacks
  501. * ---------------------------
  502. *
  503. * There are three places where a callback from an information model to
  504. * user-defined code can happen.
  505. *
  506. * - Custom node constructors and destructors
  507. * - Linking VariableNodes with an external data source
  508. * - MethodNode callbacks
  509. *
  510. * .. _node-lifecycle:
  511. *
  512. * Node Lifecycle: Constructors, Destructors and Node Contexts
  513. * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  514. *
  515. * To finalize the instantiation of a node, a (user-defined) constructor
  516. * callback is executed. There can be both a global constructor for all nodes
  517. * and node-type constructor specific to the TypeDefinition of the new node
  518. * (attached to an ObjectTypeNode or VariableTypeNode).
  519. *
  520. * In the hierarchy of ObjectTypes and VariableTypes, only the constructor of
  521. * the (lowest) type defined for the new node is executed. Note that every
  522. * Object and Variable can have only one ``isTypeOf`` reference. But type-nodes
  523. * can technically have several ``hasSubType`` references to implement multiple
  524. * inheritance. Issues of (multiple) inheritance in the constructor need to be
  525. * solved by the user.
  526. *
  527. * When a node is destroyed, the node-type destructor is called before the
  528. * global destructor. So the overall node lifecycle is as follows:
  529. *
  530. * 1. Global Constructor (set in the server config)
  531. * 2. Node-Type Constructor (for VariableType or ObjectTypes)
  532. * 3. (Usage-period of the Node)
  533. * 4. Node-Type Destructor
  534. * 5. Global Destructor
  535. *
  536. * The constructor and destructor callbacks can be set to ``NULL`` and are not
  537. * used in that case. If the node-type constructor fails, the global destructor
  538. * will be called before removing the node. The destructors are assumed to never
  539. * fail.
  540. *
  541. * Every node carries a user-context and a constructor-context pointer. The
  542. * user-context is used to attach custom data to a node. But the (user-defined)
  543. * constructors and destructors may replace the user-context pointer if they
  544. * wish to do so. The initial value for the constructor-context is ``NULL``.
  545. * When the ``AddNodes`` service is used over the network, the user-context
  546. * pointer of the new node is also initially set to ``NULL``. */
  547. /* To be set in the server config. */
  548. typedef struct {
  549. /* Can be NULL. May replace the nodeContext */
  550. UA_StatusCode (*constructor)(UA_Server *server,
  551. const UA_NodeId *sessionId, void *sessionContext,
  552. const UA_NodeId *nodeId, void **nodeContext);
  553. /* Can be NULL. The context cannot be replaced since the node is destroyed
  554. * immediately afterwards anyway. */
  555. void (*destructor)(UA_Server *server,
  556. const UA_NodeId *sessionId, void *sessionContext,
  557. const UA_NodeId *nodeId, void *nodeContext);
  558. } UA_GlobalNodeLifecycle;
  559. typedef struct {
  560. /* Can be NULL. May replace the nodeContext */
  561. UA_StatusCode (*constructor)(UA_Server *server,
  562. const UA_NodeId *sessionId, void *sessionContext,
  563. const UA_NodeId *typeNodeId, void *typeNodeContext,
  564. const UA_NodeId *nodeId, void **nodeContext);
  565. /* Can be NULL. May replace the nodeContext. */
  566. void (*destructor)(UA_Server *server,
  567. const UA_NodeId *sessionId, void *sessionContext,
  568. const UA_NodeId *typeNodeId, void *typeNodeContext,
  569. const UA_NodeId *nodeId, void **nodeContext);
  570. } UA_NodeTypeLifecycle;
  571. UA_StatusCode UA_EXPORT
  572. UA_Server_setNodeTypeLifecycle(UA_Server *server, UA_NodeId nodeId,
  573. UA_NodeTypeLifecycle lifecycle);
  574. UA_StatusCode UA_EXPORT
  575. UA_Server_getNodeContext(UA_Server *server, UA_NodeId nodeId,
  576. void **nodeContext);
  577. /* Careful! The user has to ensure that the destructor callbacks still work. */
  578. UA_StatusCode UA_EXPORT
  579. UA_Server_setNodeContext(UA_Server *server, UA_NodeId nodeId,
  580. void *nodeContext);
  581. /**
  582. * .. _datasource:
  583. *
  584. * Data Source Callback
  585. * ^^^^^^^^^^^^^^^^^^^^
  586. *
  587. * The server has a unique way of dealing with the content of variables. Instead
  588. * of storing a variant attached to the variable node, the node can point to a
  589. * function with a local data provider. Whenever the value attribute is read,
  590. * the function will be called and asked to provide a UA_DataValue return value
  591. * that contains the value content and additional timestamps.
  592. *
  593. * It is expected that the read callback is implemented. The write callback can
  594. * be set to a null-pointer. */
  595. typedef struct {
  596. /* Copies the data from the source into the provided value.
  597. *
  598. * !! ZERO-COPY OPERATIONS POSSIBLE !!
  599. * It is not required to return a copy of the actual content data. You can
  600. * return a pointer to memory owned by the user. Memory can be reused
  601. * between read callbacks of a DataSource, as the result is already encoded
  602. * on the network buffer between each read operation.
  603. *
  604. * To use zero-copy reads, set the value of the `value->value` Variant
  605. * without copying, e.g. with `UA_Variant_setScalar`. Then, also set
  606. * `value->value.storageType` to `UA_VARIANT_DATA_NODELETE` to prevent the
  607. * memory being cleaned up. Don't forget to also set `value->hasValue` to
  608. * true to indicate the presence of a value.
  609. *
  610. * @param server The server executing the callback
  611. * @param sessionId The identifier of the session
  612. * @param sessionContext Additional data attached to the session in the
  613. * access control layer
  614. * @param nodeId The identifier of the node being read from
  615. * @param nodeContext Additional data attached to the node by the user
  616. * @param includeSourceTimeStamp If true, then the datasource is expected to
  617. * set the source timestamp in the returned value
  618. * @param range If not null, then the datasource shall return only a
  619. * selection of the (nonscalar) data. Set
  620. * UA_STATUSCODE_BADINDEXRANGEINVALID in the value if this does not
  621. * apply
  622. * @param value The (non-null) DataValue that is returned to the client. The
  623. * data source sets the read data, the result status and optionally a
  624. * sourcetimestamp.
  625. * @return Returns a status code for logging. Error codes intended for the
  626. * original caller are set in the value. If an error is returned,
  627. * then no releasing of the value is done
  628. */
  629. UA_StatusCode (*read)(UA_Server *server, const UA_NodeId *sessionId,
  630. void *sessionContext, const UA_NodeId *nodeId,
  631. void *nodeContext, UA_Boolean includeSourceTimeStamp,
  632. const UA_NumericRange *range, UA_DataValue *value);
  633. /* Write into a data source. This method pointer can be NULL if the
  634. * operation is unsupported.
  635. *
  636. * @param server The server executing the callback
  637. * @param sessionId The identifier of the session
  638. * @param sessionContext Additional data attached to the session in the
  639. * access control layer
  640. * @param nodeId The identifier of the node being written to
  641. * @param nodeContext Additional data attached to the node by the user
  642. * @param range If not NULL, then the datasource shall return only a
  643. * selection of the (nonscalar) data. Set
  644. * UA_STATUSCODE_BADINDEXRANGEINVALID in the value if this does not
  645. * apply
  646. * @param value The (non-NULL) DataValue that has been written by the client.
  647. * The data source contains the written data, the result status and
  648. * optionally a sourcetimestamp
  649. * @return Returns a status code for logging. Error codes intended for the
  650. * original caller are set in the value. If an error is returned,
  651. * then no releasing of the value is done
  652. */
  653. UA_StatusCode (*write)(UA_Server *server, const UA_NodeId *sessionId,
  654. void *sessionContext, const UA_NodeId *nodeId,
  655. void *nodeContext, const UA_NumericRange *range,
  656. const UA_DataValue *value);
  657. } UA_DataSource;
  658. UA_StatusCode UA_EXPORT
  659. UA_Server_setVariableNode_dataSource(UA_Server *server, const UA_NodeId nodeId,
  660. const UA_DataSource dataSource);
  661. /**
  662. * .. _value-callback:
  663. *
  664. * Value Callback
  665. * ^^^^^^^^^^^^^^
  666. * Value Callbacks can be attached to variable and variable type nodes. If
  667. * not ``NULL``, they are called before reading and after writing respectively. */
  668. typedef struct {
  669. /* Called before the value attribute is read. It is possible to write into the
  670. * value attribute during onRead (using the write service). The node is
  671. * re-opened afterwards so that changes are considered in the following read
  672. * operation.
  673. *
  674. * @param handle Points to user-provided data for the callback.
  675. * @param nodeid The identifier of the node.
  676. * @param data Points to the current node value.
  677. * @param range Points to the numeric range the client wants to read from
  678. * (or NULL). */
  679. void (*onRead)(UA_Server *server, const UA_NodeId *sessionId,
  680. void *sessionContext, const UA_NodeId *nodeid,
  681. void *nodeContext, const UA_NumericRange *range,
  682. const UA_DataValue *value);
  683. /* Called after writing the value attribute. The node is re-opened after
  684. * writing so that the new value is visible in the callback.
  685. *
  686. * @param server The server executing the callback
  687. * @sessionId The identifier of the session
  688. * @sessionContext Additional data attached to the session
  689. * in the access control layer
  690. * @param nodeid The identifier of the node.
  691. * @param nodeUserContext Additional data attached to the node by
  692. * the user.
  693. * @param nodeConstructorContext Additional data attached to the node
  694. * by the type constructor(s).
  695. * @param range Points to the numeric range the client wants to write to (or
  696. * NULL). */
  697. void (*onWrite)(UA_Server *server, const UA_NodeId *sessionId,
  698. void *sessionContext, const UA_NodeId *nodeId,
  699. void *nodeContext, const UA_NumericRange *range,
  700. const UA_DataValue *data);
  701. } UA_ValueCallback;
  702. UA_StatusCode UA_EXPORT
  703. UA_Server_setVariableNode_valueCallback(UA_Server *server,
  704. const UA_NodeId nodeId,
  705. const UA_ValueCallback callback);
  706. /**
  707. * .. _local-monitoreditems:
  708. *
  709. * Local MonitoredItems
  710. * ^^^^^^^^^^^^^^^^^^^^
  711. *
  712. * MonitoredItems are used with the Subscription mechanism of OPC UA to
  713. * transported notifications for data changes and events. MonitoredItems can
  714. * also be registered locally. Notifications are then forwarded to a
  715. * user-defined callback instead of a remote client. */
  716. #ifdef UA_ENABLE_SUBSCRIPTIONS
  717. typedef void (*UA_Server_DataChangeNotificationCallback)
  718. (UA_Server *server, UA_UInt32 monitoredItemId, void *monitoredItemContext,
  719. const UA_NodeId *nodeId, void *nodeContext, UA_UInt32 attributeId,
  720. const UA_DataValue *value);
  721. typedef void (*UA_Server_EventNotificationCallback)
  722. (UA_Server *server, UA_UInt32 monId, void *monContext,
  723. size_t nEventFields, const UA_Variant *eventFields);
  724. /* Create a local MonitoredItem with a sampling interval that detects data
  725. * changes.
  726. *
  727. * @param server The server executing the MonitoredItem
  728. * @timestampsToReturn Shall timestamps be added to the value for the callback?
  729. * @item The parameters of the new MonitoredItem. Note that the attribute of the
  730. * ReadValueId (the node that is monitored) can not be
  731. * ``UA_ATTRIBUTEID_EVENTNOTIFIER``. A different callback type needs to be
  732. * registered for event notifications.
  733. * @monitoredItemContext A pointer that is forwarded with the callback
  734. * @callback The callback that is executed on detected data changes
  735. *
  736. * @return Returns a description of the created MonitoredItem. The structure
  737. * also contains a StatusCode (in case of an error) and the identifier of the
  738. * new MonitoredItem. */
  739. UA_MonitoredItemCreateResult UA_EXPORT
  740. UA_Server_createDataChangeMonitoredItem(UA_Server *server,
  741. UA_TimestampsToReturn timestampsToReturn,
  742. const UA_MonitoredItemCreateRequest item,
  743. void *monitoredItemContext,
  744. UA_Server_DataChangeNotificationCallback callback);
  745. /* UA_MonitoredItemCreateResult UA_EXPORT */
  746. /* UA_Server_createEventMonitoredItem(UA_Server *server, */
  747. /* UA_TimestampsToReturn timestampsToReturn, */
  748. /* const UA_MonitoredItemCreateRequest item, void *context, */
  749. /* UA_Server_EventNotificationCallback callback); */
  750. UA_StatusCode UA_EXPORT
  751. UA_Server_deleteMonitoredItem(UA_Server *server, UA_UInt32 monitoredItemId);
  752. #endif
  753. /**
  754. * Method Callbacks
  755. * ^^^^^^^^^^^^^^^^
  756. * Method callbacks are set to `NULL` (not executable) when a method node is
  757. * added over the network. In theory, it is possible to add a callback via
  758. * ``UA_Server_setMethodNode_callback`` within the global constructor when
  759. * adding methods over the network is really wanted. See the Section
  760. * :ref:`object-interaction` for calling methods on an object. */
  761. typedef UA_StatusCode
  762. (*UA_MethodCallback)(UA_Server *server, const UA_NodeId *sessionId,
  763. void *sessionContext, const UA_NodeId *methodId,
  764. void *methodContext, const UA_NodeId *objectId,
  765. void *objectContext, size_t inputSize,
  766. const UA_Variant *input, size_t outputSize,
  767. UA_Variant *output);
  768. #ifdef UA_ENABLE_METHODCALLS
  769. UA_StatusCode UA_EXPORT
  770. UA_Server_setMethodNode_callback(UA_Server *server,
  771. const UA_NodeId methodNodeId,
  772. UA_MethodCallback methodCallback);
  773. #endif
  774. /**
  775. * .. _object-interaction:
  776. *
  777. * Interacting with Objects
  778. * ------------------------
  779. * Objects in the information model are represented as ObjectNodes. Some
  780. * convenience functions are provided to simplify the interaction with objects.
  781. */
  782. /* Write an object property. The property is represented as a VariableNode with
  783. * a ``HasProperty`` reference from the ObjectNode. The VariableNode is
  784. * identified by its BrowseName. Writing the property sets the value attribute
  785. * of the VariableNode.
  786. *
  787. * @param server The server object
  788. * @param objectId The identifier of the object (node)
  789. * @param propertyName The name of the property
  790. * @param value The value to be set for the event attribute
  791. * @return The StatusCode for setting the event attribute */
  792. UA_StatusCode UA_EXPORT
  793. UA_Server_writeObjectProperty(UA_Server *server, const UA_NodeId objectId,
  794. const UA_QualifiedName propertyName,
  795. const UA_Variant value);
  796. /* Directly point to the scalar value instead of a variant */
  797. UA_StatusCode UA_EXPORT
  798. UA_Server_writeObjectProperty_scalar(UA_Server *server, const UA_NodeId objectId,
  799. const UA_QualifiedName propertyName,
  800. const void *value, const UA_DataType *type);
  801. /* Read an object property.
  802. *
  803. * @param server The server object
  804. * @param objectId The identifier of the object (node)
  805. * @param propertyName The name of the property
  806. * @param value Contains the property value after reading. Must not be NULL.
  807. * @return The StatusCode for setting the event attribute */
  808. UA_StatusCode UA_EXPORT
  809. UA_Server_readObjectProperty(UA_Server *server, const UA_NodeId objectId,
  810. const UA_QualifiedName propertyName,
  811. UA_Variant *value);
  812. #ifdef UA_ENABLE_METHODCALLS
  813. UA_CallMethodResult UA_EXPORT
  814. UA_Server_call(UA_Server *server, const UA_CallMethodRequest *request);
  815. #endif
  816. /**
  817. * .. _addnodes:
  818. *
  819. * Node Addition and Deletion
  820. * --------------------------
  821. * When creating dynamic node instances at runtime, chances are that you will
  822. * not care about the specific NodeId of the new node, as long as you can
  823. * reference it later. When passing numeric NodeIds with a numeric identifier 0,
  824. * the stack evaluates this as "select a random unassigned numeric NodeId in
  825. * that namespace". To find out which NodeId was actually assigned to the new
  826. * node, you may pass a pointer `outNewNodeId`, which will (after a successful
  827. * node insertion) contain the nodeId of the new node. You may also pass a
  828. * ``NULL`` pointer if this result is not needed.
  829. *
  830. * See the Section :ref:`node-lifecycle` on constructors and on attaching
  831. * user-defined data to nodes.
  832. *
  833. * The methods for node addition and deletion take mostly const arguments that
  834. * are not modified. When creating a node, a deep copy of the node identifier,
  835. * node attributes, etc. is created. Therefore, it is possible to call for
  836. * example ``UA_Server_addVariablenode`` with a value attribute (a
  837. * :ref:`variant`) pointing to a memory location on the stack. If you need
  838. * changes to a variable value to manifest at a specific memory location, please
  839. * use a :ref:`datasource` or a :ref:`value-callback`. */
  840. /* Protect against redundant definitions for server/client */
  841. #ifndef UA_DEFAULT_ATTRIBUTES_DEFINED
  842. #define UA_DEFAULT_ATTRIBUTES_DEFINED
  843. /* The default for variables is "BaseDataType" for the datatype, -2 for the
  844. * valuerank and a read-accesslevel. */
  845. UA_EXPORT extern const UA_VariableAttributes UA_VariableAttributes_default;
  846. UA_EXPORT extern const UA_VariableTypeAttributes UA_VariableTypeAttributes_default;
  847. /* Methods are executable by default */
  848. UA_EXPORT extern const UA_MethodAttributes UA_MethodAttributes_default;
  849. /* The remaining attribute definitions are currently all zeroed out */
  850. UA_EXPORT extern const UA_ObjectAttributes UA_ObjectAttributes_default;
  851. UA_EXPORT extern const UA_ObjectTypeAttributes UA_ObjectTypeAttributes_default;
  852. UA_EXPORT extern const UA_ReferenceTypeAttributes UA_ReferenceTypeAttributes_default;
  853. UA_EXPORT extern const UA_DataTypeAttributes UA_DataTypeAttributes_default;
  854. UA_EXPORT extern const UA_ViewAttributes UA_ViewAttributes_default;
  855. #endif
  856. /* Don't use this function. There are typed versions as inline functions. */
  857. UA_StatusCode UA_EXPORT
  858. __UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass,
  859. const UA_NodeId *requestedNewNodeId,
  860. const UA_NodeId *parentNodeId,
  861. const UA_NodeId *referenceTypeId,
  862. const UA_QualifiedName browseName,
  863. const UA_NodeId *typeDefinition,
  864. const UA_NodeAttributes *attr,
  865. const UA_DataType *attributeType,
  866. void *nodeContext, UA_NodeId *outNewNodeId);
  867. static UA_INLINE UA_StatusCode
  868. UA_Server_addVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
  869. const UA_NodeId parentNodeId,
  870. const UA_NodeId referenceTypeId,
  871. const UA_QualifiedName browseName,
  872. const UA_NodeId typeDefinition,
  873. const UA_VariableAttributes attr,
  874. void *nodeContext, UA_NodeId *outNewNodeId) {
  875. return __UA_Server_addNode(server, UA_NODECLASS_VARIABLE, &requestedNewNodeId,
  876. &parentNodeId, &referenceTypeId, browseName,
  877. &typeDefinition, (const UA_NodeAttributes*)&attr,
  878. &UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],
  879. nodeContext, outNewNodeId);
  880. }
  881. static UA_INLINE UA_StatusCode
  882. UA_Server_addVariableTypeNode(UA_Server *server,
  883. const UA_NodeId requestedNewNodeId,
  884. const UA_NodeId parentNodeId,
  885. const UA_NodeId referenceTypeId,
  886. const UA_QualifiedName browseName,
  887. const UA_NodeId typeDefinition,
  888. const UA_VariableTypeAttributes attr,
  889. void *nodeContext, UA_NodeId *outNewNodeId) {
  890. return __UA_Server_addNode(server, UA_NODECLASS_VARIABLETYPE,
  891. &requestedNewNodeId, &parentNodeId, &referenceTypeId,
  892. browseName, &typeDefinition,
  893. (const UA_NodeAttributes*)&attr,
  894. &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES],
  895. nodeContext, outNewNodeId);
  896. }
  897. static UA_INLINE UA_StatusCode
  898. UA_Server_addObjectNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
  899. const UA_NodeId parentNodeId,
  900. const UA_NodeId referenceTypeId,
  901. const UA_QualifiedName browseName,
  902. const UA_NodeId typeDefinition,
  903. const UA_ObjectAttributes attr,
  904. void *nodeContext, UA_NodeId *outNewNodeId) {
  905. return __UA_Server_addNode(server, UA_NODECLASS_OBJECT, &requestedNewNodeId,
  906. &parentNodeId, &referenceTypeId, browseName,
  907. &typeDefinition, (const UA_NodeAttributes*)&attr,
  908. &UA_TYPES[UA_TYPES_OBJECTATTRIBUTES],
  909. nodeContext, outNewNodeId);
  910. }
  911. static UA_INLINE UA_StatusCode
  912. UA_Server_addObjectTypeNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
  913. const UA_NodeId parentNodeId,
  914. const UA_NodeId referenceTypeId,
  915. const UA_QualifiedName browseName,
  916. const UA_ObjectTypeAttributes attr,
  917. void *nodeContext, UA_NodeId *outNewNodeId) {
  918. return __UA_Server_addNode(server, UA_NODECLASS_OBJECTTYPE, &requestedNewNodeId,
  919. &parentNodeId, &referenceTypeId, browseName,
  920. &UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
  921. &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES],
  922. nodeContext, outNewNodeId);
  923. }
  924. static UA_INLINE UA_StatusCode
  925. UA_Server_addViewNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
  926. const UA_NodeId parentNodeId,
  927. const UA_NodeId referenceTypeId,
  928. const UA_QualifiedName browseName,
  929. const UA_ViewAttributes attr,
  930. void *nodeContext, UA_NodeId *outNewNodeId) {
  931. return __UA_Server_addNode(server, UA_NODECLASS_VIEW, &requestedNewNodeId,
  932. &parentNodeId, &referenceTypeId, browseName,
  933. &UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
  934. &UA_TYPES[UA_TYPES_VIEWATTRIBUTES],
  935. nodeContext, outNewNodeId);
  936. }
  937. static UA_INLINE UA_StatusCode
  938. UA_Server_addReferenceTypeNode(UA_Server *server,
  939. const UA_NodeId requestedNewNodeId,
  940. const UA_NodeId parentNodeId,
  941. const UA_NodeId referenceTypeId,
  942. const UA_QualifiedName browseName,
  943. const UA_ReferenceTypeAttributes attr,
  944. void *nodeContext, UA_NodeId *outNewNodeId) {
  945. return __UA_Server_addNode(server, UA_NODECLASS_REFERENCETYPE,
  946. &requestedNewNodeId, &parentNodeId, &referenceTypeId,
  947. browseName, &UA_NODEID_NULL,
  948. (const UA_NodeAttributes*)&attr,
  949. &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES],
  950. nodeContext, outNewNodeId);
  951. }
  952. static UA_INLINE UA_StatusCode
  953. UA_Server_addDataTypeNode(UA_Server *server,
  954. const UA_NodeId requestedNewNodeId,
  955. const UA_NodeId parentNodeId,
  956. const UA_NodeId referenceTypeId,
  957. const UA_QualifiedName browseName,
  958. const UA_DataTypeAttributes attr,
  959. void *nodeContext, UA_NodeId *outNewNodeId) {
  960. return __UA_Server_addNode(server, UA_NODECLASS_DATATYPE, &requestedNewNodeId,
  961. &parentNodeId, &referenceTypeId, browseName,
  962. &UA_NODEID_NULL, (const UA_NodeAttributes*)&attr,
  963. &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES],
  964. nodeContext, outNewNodeId);
  965. }
  966. UA_StatusCode UA_EXPORT
  967. UA_Server_addDataSourceVariableNode(UA_Server *server,
  968. const UA_NodeId requestedNewNodeId,
  969. const UA_NodeId parentNodeId,
  970. const UA_NodeId referenceTypeId,
  971. const UA_QualifiedName browseName,
  972. const UA_NodeId typeDefinition,
  973. const UA_VariableAttributes attr,
  974. const UA_DataSource dataSource,
  975. void *nodeContext, UA_NodeId *outNewNodeId);
  976. #ifdef UA_ENABLE_METHODCALLS
  977. UA_StatusCode UA_EXPORT
  978. UA_Server_addMethodNodeEx(UA_Server *server, const UA_NodeId requestedNewNodeId,
  979. const UA_NodeId parentNodeId,
  980. const UA_NodeId referenceTypeId,
  981. const UA_QualifiedName browseName,
  982. const UA_MethodAttributes attr, UA_MethodCallback method,
  983. size_t inputArgumentsSize, const UA_Argument *inputArguments,
  984. const UA_NodeId inputArgumentsRequestedNewNodeId,
  985. UA_NodeId *inputArgumentsOutNewNodeId,
  986. size_t outputArgumentsSize, const UA_Argument *outputArguments,
  987. const UA_NodeId outputArgumentsRequestedNewNodeId,
  988. UA_NodeId *outputArgumentsOutNewNodeId,
  989. void *nodeContext, UA_NodeId *outNewNodeId);
  990. static UA_INLINE UA_StatusCode
  991. UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
  992. const UA_NodeId parentNodeId, const UA_NodeId referenceTypeId,
  993. const UA_QualifiedName browseName, const UA_MethodAttributes attr,
  994. UA_MethodCallback method,
  995. size_t inputArgumentsSize, const UA_Argument *inputArguments,
  996. size_t outputArgumentsSize, const UA_Argument *outputArguments,
  997. void *nodeContext, UA_NodeId *outNewNodeId) {
  998. return UA_Server_addMethodNodeEx(server, requestedNewNodeId, parentNodeId,
  999. referenceTypeId, browseName, attr, method,
  1000. inputArgumentsSize, inputArguments, UA_NODEID_NULL, NULL,
  1001. outputArgumentsSize, outputArguments, UA_NODEID_NULL, NULL,
  1002. nodeContext, outNewNodeId);
  1003. }
  1004. #endif
  1005. /**
  1006. * The method pair UA_Server_addNode_begin and _finish splits the AddNodes
  1007. * service in two parts. This is useful if the node shall be modified before
  1008. * finish the instantiation. For example to add children with specific NodeIds.
  1009. * Otherwise, mandatory children (e.g. of an ObjectType) are added with
  1010. * pseudo-random unique NodeIds. Existing children are detected during the
  1011. * _finish part via their matching BrowseName.
  1012. *
  1013. * The _begin method:
  1014. * - prepares the node and adds it to the nodestore
  1015. * - copies some unassigned attributes from the TypeDefinition node internally
  1016. * - adds the references to the parent (and the TypeDefinition if applicable)
  1017. * - performs type-checking of variables.
  1018. *
  1019. * You can add an object node without a parent if you set the parentNodeId and
  1020. * referenceTypeId to UA_NODE_ID_NULL. Then you need to add the parent reference
  1021. * and hasTypeDef reference yourself before calling the _finish method.
  1022. * Not that this is only allowed for object nodes.
  1023. *
  1024. * The _finish method:
  1025. * - copies mandatory children
  1026. * - calls the node constructor(s) at the end
  1027. * - may remove the node if it encounters an error.
  1028. *
  1029. * The special UA_Server_addMethodNode_finish method needs to be used for
  1030. * method nodes, since there you need to explicitly specifiy the input
  1031. * and output arguments which are added in the finish step (if not yet already there)
  1032. **/
  1033. /* The ``attr`` argument must have a type according to the NodeClass.
  1034. * ``VariableAttributes`` for variables, ``ObjectAttributes`` for objects, and
  1035. * so on. Missing attributes are taken from the TypeDefinition node if
  1036. * applicable. */
  1037. UA_StatusCode UA_EXPORT
  1038. UA_Server_addNode_begin(UA_Server *server, const UA_NodeClass nodeClass,
  1039. const UA_NodeId requestedNewNodeId,
  1040. const UA_NodeId parentNodeId,
  1041. const UA_NodeId referenceTypeId,
  1042. const UA_QualifiedName browseName,
  1043. const UA_NodeId typeDefinition,
  1044. const void *attr, const UA_DataType *attributeType,
  1045. void *nodeContext, UA_NodeId *outNewNodeId);
  1046. UA_StatusCode UA_EXPORT
  1047. UA_Server_addNode_finish(UA_Server *server, const UA_NodeId nodeId);
  1048. #ifdef UA_ENABLE_METHODCALLS
  1049. UA_StatusCode UA_EXPORT
  1050. UA_Server_addMethodNode_finish(UA_Server *server, const UA_NodeId nodeId,
  1051. UA_MethodCallback method,
  1052. size_t inputArgumentsSize, const UA_Argument* inputArguments,
  1053. size_t outputArgumentsSize, const UA_Argument* outputArguments);
  1054. #endif
  1055. /* Deletes a node and optionally all references leading to the node. */
  1056. UA_StatusCode UA_EXPORT
  1057. UA_Server_deleteNode(UA_Server *server, const UA_NodeId nodeId,
  1058. UA_Boolean deleteReferences);
  1059. /**
  1060. * Reference Management
  1061. * -------------------- */
  1062. UA_StatusCode UA_EXPORT
  1063. UA_Server_addReference(UA_Server *server, const UA_NodeId sourceId,
  1064. const UA_NodeId refTypeId,
  1065. const UA_ExpandedNodeId targetId, UA_Boolean isForward);
  1066. UA_StatusCode UA_EXPORT
  1067. UA_Server_deleteReference(UA_Server *server, const UA_NodeId sourceNodeId,
  1068. const UA_NodeId referenceTypeId, UA_Boolean isForward,
  1069. const UA_ExpandedNodeId targetNodeId,
  1070. UA_Boolean deleteBidirectional);
  1071. /**
  1072. * .. _events:
  1073. *
  1074. * Events
  1075. * ------
  1076. * The method ``UA_Server_createEvent`` creates an event and represents it as node. The node receives a unique `EventId`
  1077. * which is automatically added to the node.
  1078. * The method returns a `NodeId` to the object node which represents the event through ``outNodeId``. The `NodeId` can
  1079. * be used to set the attributes of the event. The generated `NodeId` is always numeric. ``outNodeId`` cannot be
  1080. * ``NULL``.
  1081. *
  1082. * Note: In order to see an event in UAExpert, the field `Time` must be given a value!
  1083. *
  1084. * The method ``UA_Server_triggerEvent`` "triggers" an event by adding it to all monitored items of the specified
  1085. * origin node and those of all its parents. Any filters specified by the monitored items are automatically applied.
  1086. * Using this method deletes the node generated by ``UA_Server_createEvent``. The `EventId` for the new event is
  1087. * generated automatically and is returned through ``outEventId``.``NULL`` can be passed if the `EventId` is not
  1088. * needed. ``deleteEventNode`` specifies whether the node representation of the event should be deleted after invoking
  1089. * the method. This can be useful if events with the similar attributes are triggered frequently. ``UA_TRUE`` would
  1090. * cause the node to be deleted. */
  1091. #ifdef UA_ENABLE_SUBSCRIPTIONS_EVENTS
  1092. /* The EventQueueOverflowEventType is defined as abstract, therefore we can not
  1093. * create an instance of that type directly, but need to create a subtype. The
  1094. * following is an arbitrary number which shall refer to our internal overflow
  1095. * type. This is already posted on the OPC Foundation bug tracker under the
  1096. * following link for clarification:
  1097. * https://opcfoundation-onlineapplications.org/mantis/view.php?id=4206 */
  1098. # define UA_NS0ID_SIMPLEOVERFLOWEVENTTYPE 4035
  1099. /* Creates a node representation of an event
  1100. *
  1101. * @param server The server object
  1102. * @param eventType The type of the event for which a node should be created
  1103. * @param outNodeId The NodeId of the newly created node for the event
  1104. * @return The StatusCode of the UA_Server_createEvent method */
  1105. UA_StatusCode UA_EXPORT
  1106. UA_Server_createEvent(UA_Server *server, const UA_NodeId eventType,
  1107. UA_NodeId *outNodeId);
  1108. /* Triggers a node representation of an event by applying EventFilters and
  1109. adding the event to the appropriate queues.
  1110. * @param server The server object
  1111. * @param eventNodeId The NodeId of the node representation of the event which should be triggered
  1112. * @param outEvent the EventId of the new event
  1113. * @param deleteEventNode Specifies whether the node representation of the event should be deleted
  1114. * @return The StatusCode of the UA_Server_triggerEvent method */
  1115. UA_StatusCode UA_EXPORT
  1116. UA_Server_triggerEvent(UA_Server *server, const UA_NodeId eventNodeId, const UA_NodeId originId,
  1117. UA_ByteString *outEventId, const UA_Boolean deleteEventNode);
  1118. #endif /* UA_ENABLE_SUBSCRIPTIONS_EVENTS */
  1119. UA_StatusCode UA_EXPORT
  1120. UA_Server_updateCertificate(UA_Server *server,
  1121. const UA_ByteString *oldCertificate,
  1122. const UA_ByteString *newCertificate,
  1123. const UA_ByteString *newPrivateKey,
  1124. UA_Boolean closeSessions,
  1125. UA_Boolean closeSecureChannels);
  1126. /**
  1127. * Utility Functions
  1128. * ----------------- */
  1129. /* Add a new namespace to the server. Returns the index of the new namespace */
  1130. UA_UInt16 UA_EXPORT UA_Server_addNamespace(UA_Server *server, const char* name);
  1131. UA_ServerConfig*
  1132. UA_Server_getConfig(UA_Server *server);
  1133. /* Get namespace by name from the server. */
  1134. UA_StatusCode UA_EXPORT
  1135. UA_Server_getNamespaceByName(UA_Server *server, const UA_String namespaceUri,
  1136. size_t* foundIndex);
  1137. _UA_END_DECLS
  1138. #endif /* UA_SERVER_H_ */