1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
// OPCUA for Rust
// SPDX-License-Identifier: MPL-2.0
// Copyright (C) 2017-2024 Adam Lock
#![warn(missing_docs)]
//! The OPC UA Types module contains data types and enumerations for OPC UA.
//!
//! This includes:
//!
//! 1. All of the built-in data types described in OPC Part 6 Chapter 5 that are encodable.
//! 2. All of the standard data types described in OPC Part 3 Chapter 8 (if not covered by 1.).
//! 3. Autogenerated data types and request / responses as described in OPC Part 4.
//!
//! For the built-in data types, the module provides functions
/// Contains constants recognized by OPC UA clients and servers to describe various protocols and
/// profiles used during communication and encryption.
pub mod profiles {
/// Transport profile for OPC UA Binary
pub const TRANSPORT_PROFILE_URI_BINARY: &str =
"http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary";
/// Security policy for anonymous tokens.
pub const SECURITY_USER_TOKEN_POLICY_ANONYMOUS: &str =
"http://opcfoundation.org/UA-Profile/Security/UserToken/Anonymous";
/// Security policy for username and password tokens.
pub const SECURITY_USER_TOKEN_POLICY_USERPASS: &str =
"http://opcfoundation.org/UA-Profile/ Security/UserToken-Server/UserNamePassword";
}
/// Contains a few constants and defaults used in decoding and encoding.
pub mod constants {
/// Default maximum number of elements in an array
pub const MAX_ARRAY_LENGTH: usize = 1000;
/// Default maximum size of a string in chars
pub const MAX_STRING_LENGTH: usize = 65535;
/// Default maximum size of a byte string in bytes
pub const MAX_BYTE_STRING_LENGTH: usize = 65535;
/// Default maximum size of a certificate to send
pub const MAX_CERTIFICATE_LENGTH: usize = 32767;
/// Default maximum size of a message in bytes. 0 is any length, i.e. the other end can send a message of any size which is
/// not recommended in a server configuration. Override in the client / server config.
/// In clients, max message size is only preferred size since it can be adjusted by the server during the handshake.
pub const MAX_MESSAGE_SIZE: usize = 65535 * MAX_CHUNK_COUNT;
/// Default maximum number of chunks in a single message. 0 is any number but this is not recommended
/// as the default since server memory could be exhausted. Default number can be overridden
/// by client / server config which is where it should happen if you want a different figure. In clients
/// chunk size is a preferred value since the server can modify it during the handshake.
pub const MAX_CHUNK_COUNT: usize = 5;
/// Default maximum decoding depth for recursive data structures, i.e. if data is nested deeper than this it is
/// an error during decoding. This is a security measure to stop deeply nested junk being sent to
/// a server / client.
pub const MAX_DECODING_DEPTH: u64 = 10;
/// URI supplied for the None security policy
pub const SECURITY_POLICY_NONE_URI: &str = "http://opcfoundation.org/UA/SecurityPolicy#None";
/// String used as shorthand in config files, debug etc.for `None` security policy
pub const SECURITY_POLICY_NONE: &str = "None";
}
/// Contains constants for known issued token types as defined in the OPC-UA standard.
pub mod issued_token_types {
/// JSON Web Tokens (JWT).
pub const JSON_WEB_TOKEN: &str = "http://opcfoundation.org/UA/UserToken#JWT";
}
use bitflags::bitflags;
// Attributes mask bits
bitflags! {
/// Bitmask for attributes
pub struct AttributesMask: u32 {
/// Indicates if the AccessLevel Attribute is set.
const ACCESS_LEVEL = 1;
/// Indicates if the ArrayDimensions Attribute is set.
const ARRAY_DIMENSIONS = 1 << 1;
/// Indicates if the ContainsNoLoops Attribute is set.
const CONTAINS_NO_LOOPS = 1 << 3;
/// Indicates if the DataType Attribute is set.
const DATA_TYPE = 1 << 4;
/// Indicates if the Description Attribute is set.
const DESCRIPTION = 1 << 5;
/// Indicates if the DisplayName Attribute is set.
const DISPLAY_NAME = 1 << 6;
/// Indicates if the EventNotifier Attribute is set.
const EVENT_NOTIFIER = 1 << 7;
/// Indicates if the Executable Attribute is set.
const EXECUTABLE = 1 << 8;
/// Indicates if the Historizing Attribute is set.
const HISTORIZING = 1 << 9;
/// Indicates if the InverseName Attribute is set.
const INVERSE_NAME = 1 << 10;
/// Indicates if the IsAbstract Attribute is set.
const IS_ABSTRACT = 1 << 11;
/// Indicates if the MinimumSamplingInterval Attribute is set.
const MINIMUM_SAMPLING_INTERVAL = 1 << 12;
/// Indicates if the Symmetric Attribute is set.
const SYMMETRIC = 1 << 15;
/// Indicates if the UserAccessLevel Attribute is set.
const USER_ACCESS_LEVEL = 1 << 16;
/// Indicates if the UserExecutable Attribute is set.
const USER_EXECUTABLE = 1 << 17;
/// Indicates if the UserWriteMask Attribute is set.
const USER_WRITE_MASK = 1 << 18;
/// Indicates if the ValueRank Attribute is set.
const VALUE_RANK = 1 << 19;
/// Indicates if the WriteMask Attribute is set.
const WRITE_MASK = 1 << 20;
/// Indicates if the Value Attribute is set
const VALUE = 1 << 21;
}
}
// Write mask bits (similar but different to AttributesMask)
//
// See Part 3, Table 43
bitflags! {
/// Bitmask for attributes used during write.
pub struct WriteMask: u32 {
/// Indicates if the AccessLevel Attribute is writable.
const ACCESS_LEVEL = 1;
/// Indicates if the ArrayDimensions Attribute is writable.
const ARRAY_DIMENSIONS = 1 << 1;
///Indicates if the BrowseName Attribute is writable.
const BROWSE_NAME = 1 << 2;
/// Indicates if the ContainsNoLoops Attribute is writable.
const CONTAINS_NO_LOOPS = 1 << 3;
/// Indicates if the DataType Attribute is writable.
const DATA_TYPE = 1 << 4;
/// Indicates if the Description Attribute is writable.
const DESCRIPTION = 1 << 5;
/// Indicates if the DisplayName Attribute is writable.
const DISPLAY_NAME = 1 << 6;
/// Indicates if the EventNotifier Attribute is writable.
const EVENT_NOTIFIER = 1 << 7;
/// Indicates if the Executable Attribute is writable.
const EXECUTABLE = 1 << 8;
/// Indicates if the Historizing Attribute is writable.
const HISTORIZING = 1 << 9;
/// Indicates if the InverseName Attribute is writable.
const INVERSE_NAME = 1 << 10;
/// Indicates if the IsAbstract Attribute is writable.
const IS_ABSTRACT = 1 << 11;
/// Indicates if the MinimumSamplingInterval Attribute is writable.
const MINIMUM_SAMPLING_INTERVAL = 1 << 12;
/// Indicates if the NodeClass Attribute is writable.
const NODE_CLASS = 1 << 13;
/// Indicates if the NodeId Attribute is writable.
const NODE_ID = 1 << 14;
/// Indicates if the Symmetric Attribute is writable.
const SYMMETRIC = 1 << 15;
/// Indicates if the UserAccessLevel Attribute is writable.
const USER_ACCESS_LEVEL = 1 << 16;
/// Indicates if the UserExecutable Attribute is writable.
const USER_EXECUTABLE = 1 << 17;
/// Indicates if the UserWriteMask Attribute is writable.
const USER_WRITE_MASK = 1 << 18;
/// Indicates if the ValueRank Attribute is writable.
const VALUE_RANK = 1 << 19;
/// Indicates if the WriteMask Attribute is writable.
const WRITE_MASK = 1 << 20;
/// Indicates if the Value Attribute is writable for a VariableType. It does not apply for Variables
/// since this is handled by the AccessLevel and UserAccessLevel Attributes for the Variable.
/// For Variables this bit shall be set to 0.
const VALUE_FOR_VARIABLE_TYPE = 1 << 21;
/// Indicates if the DataTypeDefinition Attribute is writable.
const DATA_TYPE_DEFINITION = 1 << 22;
/// Indicates if the RolePermissions Attribute is writable.
const ROLE_PERMISSIONS = 1 << 23;
/// Indicates if the AccessRestrictions Attribute is writable
const ACCESS_RESTRICTIONS = 1 << 24;
/// Indicates if the AccessLevelEx Attribute is writable
const ACCESS_LEVEL_EX = 1 << 25;
// Bits 26-31. Reserved for future use. Shall always be zero.
}
}
// Bits that control the reference description coming back from browse()
bitflags! {
#[derive(Debug, Copy, Clone)]
/// Bitmask for fields returned in reference descriptions when browsing.
pub struct BrowseDescriptionResultMask: u32 {
/// Include the reference type of the reference.
const RESULT_MASK_REFERENCE_TYPE = 1;
/// Include the boolean flag indicating whether the reference
/// is forward or inverse.
const RESULT_MASK_IS_FORWARD = 1 << 1;
/// Include the node class of the referenced node.
const RESULT_MASK_NODE_CLASS = 1 << 2;
/// Include the browse name of the referenced node.
const RESULT_MASK_BROWSE_NAME = 1 << 3;
/// Include the display name of the referenced node.
const RESULT_MASK_DISPLAY_NAME = 1 << 4;
/// Include the type definition of the referenced node.
const RESULT_MASK_TYPE_DEFINITION = 1 << 5;
}
}
// Bits for a node class mask
bitflags! {
#[derive(Debug, Copy, Clone)]
/// Bitmask for node classes.
pub struct NodeClassMask: u32 {
/// Object node class.
const OBJECT = 1;
/// Variable node class.
const VARIABLE = 1 << 1;
/// Method node class.
const METHOD = 1 << 2;
/// Object type node class.
const OBJECT_TYPE = 1 << 3;
/// Variable type node class.
const VARIABLE_TYPE = 1 << 4;
/// Reference type node class.
const REFERENCE_TYPE = 1 << 5;
/// Data type node class.
const DATA_TYPE = 1 << 6;
/// View node class.
const VIEW = 1 << 7;
}
}
bitflags! {
#[derive(Debug, Copy, Clone)]
/// Bitmask for browse results.
pub struct BrowseResultMaskFlags: u32 {
/// Include the reference type ID.
const ReferenceTypeId = 1;
/// Include whether the reference is forward or inverse.
const IsForward = 1 << 1;
/// Include the node class.
const NodeClass = 1 << 2;
/// Include the browse name.
const BrowseName = 1 << 3;
/// Include the display name.
const DisplayName = 1 << 4;
/// Include the type definition
const TypeDefinition = 1 << 5;
}
}
// These 2 modules are autogenerated
#[doc(hidden)]
pub mod generated;
mod add_node_attributes;
pub mod argument;
pub mod array;
pub mod attribute;
pub mod basic_types;
pub mod byte_string;
pub mod custom;
pub mod data_change;
pub mod data_type_definition;
pub mod data_types;
pub mod data_value;
pub mod date_time;
pub mod diagnostic_info;
pub mod encoding;
pub mod errors;
pub mod event_field;
pub mod expanded_node_id;
pub mod extension_object;
pub mod guid;
mod impls;
#[cfg(feature = "json")]
pub mod json;
pub mod localized_text;
pub mod namespaces;
pub mod node_id;
pub mod notification_message;
pub mod numeric_range;
pub mod operand;
pub mod qualified_name;
pub mod relative_path;
pub mod request_header;
pub mod response_header;
pub mod status_code;
pub mod string;
pub mod type_loader;
pub mod value_rank;
pub mod variant;
#[cfg(feature = "xml")]
pub mod xml;
#[cfg(feature = "json")]
pub use opcua_macros::{JsonDecodable, JsonEncodable};
#[cfg(feature = "xml")]
pub use opcua_macros::{XmlDecodable, XmlEncodable, XmlType};
pub use opcua_macros::ua_encodable;
pub use opcua_macros::BinaryDecodable;
pub use opcua_macros::BinaryEncodable;
pub use opcua_macros::UaEnum;
pub use opcua_macros::UaNullable;
mod ua_enum;
pub use self::{
add_node_attributes::AddNodeAttributes,
argument::*,
array::*,
attribute::*,
byte_string::*,
data_change::*,
data_type_definition::*,
data_types::*,
data_value::*,
date_time::*,
diagnostic_info::*,
encoding::*,
event_field::*,
expanded_node_id::*,
extension_object::*,
generated::{node_ids::*, types::*},
guid::*,
impls::*,
localized_text::*,
namespaces::*,
node_id::{Identifier, NodeId, NodeIdError},
numeric_range::*,
operand::*,
qualified_name::*,
request_header::*,
response_header::*,
status_code::*,
string::*,
type_loader::*,
ua_enum::*,
variant::*,
};
#[derive(Debug, Clone)]
/// Error type used for certain custom substring methods.
pub struct OutOfRange;
#[cfg(test)]
mod tests;