node-opcua-samples 2.117.0 → 2.119.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env ts-node
2
+ export {};
@@ -0,0 +1,599 @@
1
+ #!/usr/bin/env ts-node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const util_1 = __importDefault(require("util"));
10
+ const util_2 = require("util");
11
+ const yargs_1 = __importDefault(require("yargs/yargs"));
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const easy_table_1 = __importDefault(require("easy-table"));
14
+ const node_opcua_1 = require("node-opcua");
15
+ const node_opcua_crypto_1 = require("node-opcua-crypto");
16
+ const node_opcua_client_crawler_1 = require("node-opcua-client-crawler");
17
+ const { asTree, TreeObject } = require("treeify");
18
+ function w(str, l) {
19
+ return str.padEnd(l).substring(0, l);
20
+ }
21
+ async function enumerateAllConditionTypes(session) {
22
+ const tree = {};
23
+ const conditionEventTypes = {};
24
+ async function findAllNodeOfType(tree1, typeNodeId1, browseName) {
25
+ const browseDesc1 = {
26
+ nodeId: typeNodeId1,
27
+ referenceTypeId: (0, node_opcua_1.resolveNodeId)("HasSubtype"),
28
+ browseDirection: node_opcua_1.BrowseDirection.Forward,
29
+ includeSubtypes: true,
30
+ resultMask: 63
31
+ };
32
+ const browseDesc2 = {
33
+ nodeId: typeNodeId1,
34
+ referenceTypeId: (0, node_opcua_1.resolveNodeId)("HasTypeDefinition"),
35
+ browseDirection: node_opcua_1.BrowseDirection.Inverse,
36
+ includeSubtypes: true,
37
+ resultMask: 63
38
+ };
39
+ const browseDesc3 = {
40
+ nodeId: typeNodeId1,
41
+ referenceTypeId: (0, node_opcua_1.resolveNodeId)("HasTypeDefinition"),
42
+ browseDirection: node_opcua_1.BrowseDirection.Forward,
43
+ includeSubtypes: true,
44
+ resultMask: 63
45
+ };
46
+ const nodesToBrowse = [browseDesc1, browseDesc2, browseDesc3];
47
+ const browseResults = await session.browse(nodesToBrowse);
48
+ tree1[browseName] = {};
49
+ browseResults[0].references = browseResults[0].references || [];
50
+ const promises = [];
51
+ for (const reference of browseResults[0].references) {
52
+ conditionEventTypes[reference.nodeId.toString()] = reference.browseName.toString();
53
+ promises.push(findAllNodeOfType(tree1[browseName], reference.nodeId, reference.browseName.toString()));
54
+ }
55
+ await Promise.all(promises);
56
+ }
57
+ const typeNodeId = (0, node_opcua_1.resolveNodeId)("ConditionType");
58
+ await findAllNodeOfType(tree, typeNodeId, "ConditionType");
59
+ return tree;
60
+ }
61
+ async function enumerateAllAlarmAndConditionInstances(session) {
62
+ const conditions = {};
63
+ const found = [];
64
+ function isConditionEventType(nodeId) {
65
+ return Object.prototype.hasOwnProperty.call(conditions, nodeId.toString());
66
+ }
67
+ async function exploreForObjectOfType(session1, nodeId) {
68
+ async function worker(element) {
69
+ const nodeToBrowse = {
70
+ nodeId: element.nodeId,
71
+ referenceTypeId: (0, node_opcua_1.resolveNodeId)("HierarchicalReferences"),
72
+ browseDirection: node_opcua_1.BrowseDirection.Forward,
73
+ includeSubtypes: true,
74
+ nodeClassMask: 0x1, // Objects
75
+ resultMask: 63
76
+ };
77
+ const browseResult = await session1.browse(nodeToBrowse);
78
+ for (const ref of browseResult.references) {
79
+ if (isConditionEventType(ref.typeDefinition)) {
80
+ //
81
+ const alarm = {
82
+ parent: element.nodeId,
83
+ alarmNodeId: ref.nodeId,
84
+ browseName: ref.browseName,
85
+ typeDefinition: ref.typeDefinition,
86
+ typeDefinitionName: conditions[ref.typeDefinition.toString()]
87
+ };
88
+ found.push(alarm);
89
+ }
90
+ else {
91
+ await worker(ref.nodeId);
92
+ }
93
+ }
94
+ }
95
+ await worker(nodeId);
96
+ }
97
+ await enumerateAllConditionTypes(session);
98
+ await exploreForObjectOfType(session, (0, node_opcua_1.resolveNodeId)("RootFolder"));
99
+ return Object.values(conditions);
100
+ }
101
+ async function _getAllEventTypes(session, baseNodeId, tree) {
102
+ const browseDesc1 = {
103
+ nodeId: baseNodeId,
104
+ referenceTypeId: (0, node_opcua_1.resolveNodeId)("HasSubtype"),
105
+ browseDirection: node_opcua_1.BrowseDirection.Forward,
106
+ includeSubtypes: true,
107
+ nodeClassMask: node_opcua_1.NodeClassMask.ObjectType, // Objects
108
+ resultMask: 63
109
+ };
110
+ const browseResult = await session.browse(browseDesc1);
111
+ // to do continuation points
112
+ for (const reference of browseResult.references) {
113
+ const subtree = { nodeId: reference.nodeId.toString() };
114
+ tree[reference.browseName.toString()] = subtree;
115
+ await _getAllEventTypes(session, reference.nodeId, subtree);
116
+ }
117
+ }
118
+ /**
119
+ * getAllEventType recursively
120
+ */
121
+ async function getAllEventTypes(session) {
122
+ const baseNodeId = (0, node_opcua_1.makeNodeId)(node_opcua_1.ObjectTypeIds.BaseEventType);
123
+ const result = {};
124
+ await _getAllEventTypes(session, baseNodeId, result);
125
+ return result;
126
+ }
127
+ async function monitorAlarm(session, subscription, alarmNodeId) {
128
+ try {
129
+ await (0, node_opcua_1.callConditionRefresh)(session, subscription.subscriptionId);
130
+ }
131
+ catch (err) {
132
+ if (util_2.types.isNativeError(err)) {
133
+ console.log(" monitorAlarm failed , may be your server doesn't support A&E", err.message);
134
+ }
135
+ }
136
+ }
137
+ function getTick() {
138
+ return Date.now();
139
+ }
140
+ (async () => {
141
+ // ts-node bin/simple_client.ts --endpoint opc.tcp://localhost:53530/OPCUA/SimulationServer --node "ns=5;s=Sinusoid1"
142
+ const argv = await (0, yargs_1.default)(process.argv.slice(2)).options({
143
+ endpoint: {
144
+ alias: "e",
145
+ demandOption: true,
146
+ string: true,
147
+ describe: "the end point to connect to "
148
+ },
149
+ securityMode: {
150
+ alias: "s",
151
+ default: "None",
152
+ describe: "the security mode ( None Sign SignAndEncrypt )"
153
+ },
154
+ securityPolicy: {
155
+ alias: "P",
156
+ default: "None",
157
+ describe: "the policy mode : (" + Object.keys(node_opcua_1.SecurityPolicy).join(" - ") + ")"
158
+ },
159
+ userName: {
160
+ alias: "u",
161
+ describe: "specify the user name of a UserNameIdentityToken"
162
+ },
163
+ password: {
164
+ alias: "p",
165
+ describe: "specify the password of a UserNameIdentityToken"
166
+ },
167
+ node: {
168
+ alias: "n",
169
+ describe: "the nodeId of the value to monitor"
170
+ },
171
+ timeout: {
172
+ alias: "t",
173
+ describe: " the timeout of the session in second => (-1 for infinity)"
174
+ },
175
+ debug: {
176
+ alias: "d",
177
+ boolean: true,
178
+ describe: " display more verbose information"
179
+ },
180
+ history: {
181
+ alias: "h",
182
+ describe: "make an historical read"
183
+ },
184
+ crawl: {
185
+ alias: "c",
186
+ describe: "crawl"
187
+ },
188
+ discovery: {
189
+ alias: "D",
190
+ describe: "specify the endpoint uri of discovery server (by default same as server endpoint uri)"
191
+ }
192
+ }).argv;
193
+ const securityMode = (0, node_opcua_1.coerceMessageSecurityMode)(argv.securityMode);
194
+ if (securityMode === node_opcua_1.MessageSecurityMode.Invalid) {
195
+ throw new Error("Invalid Security mode");
196
+ }
197
+ const securityPolicy = (0, node_opcua_1.coerceSecurityPolicy)(argv.securityPolicy);
198
+ if (securityPolicy === node_opcua_1.SecurityPolicy.Invalid) {
199
+ throw new Error("Invalid securityPolicy");
200
+ }
201
+ const timeout = argv.timeout * 1000 || 20000;
202
+ const monitored_node = (0, node_opcua_1.coerceNodeId)(argv.node || (0, node_opcua_1.makeNodeId)(node_opcua_1.VariableIds.Server_ServerStatus_CurrentTime));
203
+ console.log(chalk_1.default.cyan("securityMode = "), securityMode.toString());
204
+ console.log(chalk_1.default.cyan("securityPolicy = "), securityPolicy.toString());
205
+ console.log(chalk_1.default.cyan("timeout = "), timeout ? timeout : " Infinity ");
206
+ console.log(" monitoring node id = ", monitored_node);
207
+ if (!argv.endpoint) {
208
+ // y.showHelp();
209
+ process.exit(0);
210
+ }
211
+ const discoveryUrl = argv.discovery ? argv.discovery : argv.endpoint || "";
212
+ const doCrawling = !!argv.crawl;
213
+ const doHistory = !!argv.history;
214
+ async function exploreEndpoint(endpointUrl) {
215
+ const optionsInitial = {
216
+ securityMode,
217
+ securityPolicy,
218
+ endpointMustExist: false,
219
+ keepSessionAlive: true,
220
+ connectionStrategy: {
221
+ initialDelay: 2000,
222
+ maxDelay: 10 * 1000,
223
+ maxRetry: 10
224
+ },
225
+ discoveryUrl
226
+ };
227
+ const client = node_opcua_1.OPCUAClient.create(optionsInitial);
228
+ client.on("backoff", (retry, delay) => {
229
+ console.log(chalk_1.default.bgWhite.yellow("backoff attempt #"), retry, " retrying in ", delay / 1000.0, " seconds");
230
+ });
231
+ console.log(" connecting to ", chalk_1.default.cyan.bold(endpointUrl));
232
+ console.log(" strategy", client.connectionStrategy);
233
+ try {
234
+ await client.connect(endpointUrl);
235
+ console.log(" Connected ! exact endpoint url is ", client.endpointUrl);
236
+ }
237
+ catch (err) {
238
+ console.log(chalk_1.default.red(" Cannot connect to ") + endpointUrl);
239
+ if (util_2.types.isNativeError(err)) {
240
+ console.log(" Error = ", err.message);
241
+ }
242
+ throw new Error("Cannot connect to endpoint");
243
+ }
244
+ const endpoints = await client.getEndpoints();
245
+ if (argv.debug) {
246
+ fs_1.default.writeFileSync("tmp/endpoints.log", JSON.stringify(endpoints, null, " "));
247
+ console.log(endpoints);
248
+ }
249
+ const table = new easy_table_1.default();
250
+ let serverCertificate;
251
+ let i = 0;
252
+ for (const endpoint of endpoints) {
253
+ table.cell("endpoint", endpoint.endpointUrl + "");
254
+ table.cell("Application URI", endpoint.server.applicationUri);
255
+ table.cell("Product URI", endpoint.server.productUri);
256
+ table.cell("Application Name", endpoint.server.applicationName.text);
257
+ table.cell("Security Mode", node_opcua_1.MessageSecurityMode[endpoint.securityMode].toString());
258
+ table.cell("securityPolicyUri", endpoint.securityPolicyUri);
259
+ table.cell("Type", node_opcua_1.ApplicationType[endpoint.server.applicationType]);
260
+ table.cell("certificate", "..." /*endpoint.serverCertificate*/);
261
+ endpoint.server.discoveryUrls = endpoint.server.discoveryUrls || [];
262
+ table.cell("discoveryUrls", endpoint.server.discoveryUrls.join(" - "));
263
+ serverCertificate = endpoint.serverCertificate;
264
+ const certificate_filename = path_1.default.join(__dirname, "../certificates/PKI/server_certificate" + i + ".pem");
265
+ if (serverCertificate) {
266
+ fs_1.default.writeFile(certificate_filename, (0, node_opcua_crypto_1.toPem)(serverCertificate, "CERTIFICATE"), () => {
267
+ /**/
268
+ });
269
+ }
270
+ table.newRow();
271
+ i++;
272
+ }
273
+ console.log(table.toString());
274
+ for (const endpoint of endpoints) {
275
+ console.log("Identify Token for : Security Mode=", endpoint.securityMode.toString(), " Policy=", endpoint.securityPolicyUri);
276
+ const table2 = new easy_table_1.default();
277
+ for (const token of endpoint.userIdentityTokens) {
278
+ table2.cell("policyId", token.policyId);
279
+ table2.cell("tokenType", token.tokenType.toString());
280
+ table2.cell("issuedTokenType", token.issuedTokenType);
281
+ table2.cell("issuerEndpointUrl", token.issuerEndpointUrl);
282
+ table2.cell("securityPolicyUri", token.securityPolicyUri);
283
+ table2.newRow();
284
+ }
285
+ console.log(table2.toString());
286
+ }
287
+ await client.disconnect();
288
+ // reconnect using the correct end point URL now
289
+ console.log(chalk_1.default.cyan("Server Certificate :"));
290
+ console.log(chalk_1.default.yellow((0, node_opcua_1.hexDump)(serverCertificate)));
291
+ console.log(" adjusted endpoint Url =", client.endpointUrl);
292
+ return { endpointUrl: client.endpointUrl, serverCertificate };
293
+ }
294
+ async function main() {
295
+ const { endpointUrl, serverCertificate } = await exploreEndpoint(argv.endpoint);
296
+ const options = {
297
+ securityMode,
298
+ securityPolicy,
299
+ // we can specify here server certificate
300
+ serverCertificate,
301
+ defaultSecureTokenLifetime: 40000,
302
+ endpointMustExist: false,
303
+ connectionStrategy: {
304
+ initialDelay: 2000,
305
+ maxDelay: 10 * 1000,
306
+ maxRetry: 10
307
+ }
308
+ };
309
+ console.log("Options = ", options.securityMode.toString(), options.securityPolicy.toString());
310
+ const client = node_opcua_1.OPCUAClient.create(options);
311
+ console.log(" --------------------------------- Now connecting again to ", chalk_1.default.cyan.bold(endpointUrl));
312
+ await client.connect(endpointUrl);
313
+ console.log(" Connected ! exact endpoint url is ", client.endpointUrl);
314
+ let userIdentity = { type: node_opcua_1.UserTokenType.Anonymous }; // anonymous
315
+ if (argv.userName && argv.password) {
316
+ userIdentity = {
317
+ type: node_opcua_1.UserTokenType.UserName,
318
+ password: argv.password,
319
+ userName: argv.userName
320
+ };
321
+ }
322
+ console.log(" now creating Session !");
323
+ const session = await client.createSession(userIdentity);
324
+ client.on("connection_reestablished", () => {
325
+ console.log(chalk_1.default.bgWhite.red(" !!!!!!!!!!!!!!!!!!!!!!!! CONNECTION RE-ESTABLISHED !!!!!!!!!!!!!!!!!!!"));
326
+ });
327
+ console.log(chalk_1.default.yellow(" session created"));
328
+ console.log(" sessionId : ", session.sessionId.toString());
329
+ client.on("backoff", (retry, delay) => {
330
+ console.log(chalk_1.default.bgWhite.yellow("backoff attempt #"), retry, " retrying in ", delay / 1000.0, " seconds");
331
+ });
332
+ client.on("start_reconnection", () => {
333
+ console.log(chalk_1.default.bgWhite.red(" !!!!!!!!!!!!!!!!!!!!!!!! Starting Reconnection !!!!!!!!!!!!!!!!!!!"));
334
+ });
335
+ // -----------------------------------------------------------------------------------------------------------
336
+ // NAMESPACE
337
+ // display namespace array
338
+ // -----------------------------------------------------------------------------------------------------------
339
+ const server_NamespaceArray_Id = (0, node_opcua_1.makeNodeId)(node_opcua_1.VariableIds.Server_NamespaceArray); // ns=0;i=2006
340
+ const dataValue = await session.readVariableValue(server_NamespaceArray_Id);
341
+ console.log(" --- NAMESPACE ARRAY ---");
342
+ const namespaceArray = dataValue.value.value;
343
+ for (const namespace of namespaceArray) {
344
+ console.log(" Namespace ", namespace.index, " : ", namespace);
345
+ }
346
+ console.log(" -----------------------");
347
+ // -----------------------------------------------------------------------------------------------------------
348
+ // enumerate all EVENT TYPES
349
+ // -----------------------------------------------------------------------------------------------------------
350
+ const result = await getAllEventTypes(session);
351
+ console.log(chalk_1.default.cyan("---------------------------------------------------- All Event Types "));
352
+ console.log(asTree(result, true, true));
353
+ console.log(" -----------------------");
354
+ // -----------------------------------------------------------------------------------------------------------
355
+ // Node Crawling
356
+ // -----------------------------------------------------------------------------------------------------------
357
+ let t1;
358
+ let t2;
359
+ function print_stat() {
360
+ t2 = Date.now();
361
+ const str = util_1.default.format("R= %d W= %d T=%d t= %d", client.bytesRead, client.bytesWritten, client.transactionsPerformed, t2 - t1);
362
+ console.log(chalk_1.default.yellow.bold(str));
363
+ }
364
+ if (doCrawling) {
365
+ (0, node_opcua_1.assert)(session !== null && typeof session === "object");
366
+ const crawler = new node_opcua_client_crawler_1.NodeCrawler(session);
367
+ let t5 = Date.now();
368
+ client.on("send_request", () => {
369
+ t1 = Date.now();
370
+ });
371
+ client.on("receive_response", print_stat);
372
+ t5 = Date.now();
373
+ // xx crawler.on("browsed", function (element) {
374
+ // xx console.log("->",(new Date()).getTime()-t,element.browseName.name,element.nodeId.toString());
375
+ // xx });
376
+ const nodeId = "ObjectsFolder";
377
+ console.log("now crawling object folder ...please wait...");
378
+ const obj = await crawler.read(nodeId);
379
+ console.log(" Time = ", new Date().getTime() - t5);
380
+ console.log(" read = ", crawler.readCounter);
381
+ console.log(" browse = ", crawler.browseCounter);
382
+ console.log(" browseNext = ", crawler.browseNextCounter);
383
+ console.log(" transaction = ", crawler.transactionCounter);
384
+ crawler.dispose();
385
+ }
386
+ client.removeListener("receive_response", print_stat);
387
+ // -----------------------------------------------------------------------------------------------------------------
388
+ // enumerate all Condition Types exposed by the server
389
+ // -----------------------------------------------------------------------------------------------------------------
390
+ console.log("--------------------------------------------------------------- Enumerate all Condition Types exposed by the server");
391
+ const conditionTree = await enumerateAllConditionTypes(session);
392
+ console.log(asTree(conditionTree, true, true));
393
+ console.log(" -----------------------------------------------------------------------------------------------------------------");
394
+ // -----------------------------------------------------------------------------------------------------------------
395
+ // enumerate all objects that have an Alarm & Condition instances
396
+ // -----------------------------------------------------------------------------------------------------------------
397
+ const alarms = await enumerateAllAlarmAndConditionInstances(session);
398
+ console.log(" -------------------------------------------------------------- Alarms & Conditions ------------------------");
399
+ for (const alarm of alarms) {
400
+ console.log("parent = ", chalk_1.default.cyan(w(alarm.parent.toString(), 30)), chalk_1.default.green.bold(w(alarm.typeDefinitionName, 30)), "alarmName = ", chalk_1.default.cyan(w(alarm.browseName.toString(), 30)), chalk_1.default.yellow(w(alarm.alarmNodeId.toString(), 40)));
401
+ }
402
+ console.log(" -----------------------------------------------------------------------------------------------------------------");
403
+ // -----------------------------------------------------------------------------------------------------------------
404
+ // Testing if server implements QueryFirst
405
+ // -----------------------------------------------------------------------------------------------------------------
406
+ try {
407
+ console.log(" ---------------------------------------------------------- Testing QueryFirst");
408
+ const queryFirstRequest = {
409
+ view: {
410
+ viewId: node_opcua_1.NodeId.nullNodeId
411
+ },
412
+ nodeTypes: [
413
+ {
414
+ typeDefinitionNode: (0, node_opcua_1.makeExpandedNodeId)("i=58"),
415
+ includeSubTypes: true,
416
+ dataToReturn: [
417
+ {
418
+ attributeId: node_opcua_1.AttributeIds.AccessLevel,
419
+ relativePath: undefined
420
+ }
421
+ ]
422
+ }
423
+ ]
424
+ };
425
+ const queryFirstResult = await session.queryFirst(queryFirstRequest);
426
+ console.log(" -----------------------------------------------------------------------------------------------------------------");
427
+ }
428
+ catch (err) {
429
+ if (util_2.types.isNativeError(err)) {
430
+ console.log(" Server is not supporting queryFirst err=", err.message);
431
+ }
432
+ }
433
+ // create Read
434
+ if (doHistory) {
435
+ console.log(" ---------------------------------------------------------- History Read------------------------");
436
+ const now = Date.now();
437
+ const start = now - 1000; // read 1 seconds of history
438
+ const historicalReadResult = await session.readHistoryValue(monitored_node, new Date(start), new Date(now));
439
+ console.log(historicalReadResult.toString());
440
+ console.log(" -----------------------------------------------------------------------------------------------------------------");
441
+ }
442
+ // ----------------------------------------------------------------------------------
443
+ // create subscription
444
+ // ----------------------------------------------------------------------------------
445
+ console.log(" ---------------------------------------------------------- Create Subscription ");
446
+ const parameters = {
447
+ maxNotificationsPerPublish: 10,
448
+ priority: 10,
449
+ publishingEnabled: true,
450
+ requestedLifetimeCount: 1000,
451
+ requestedMaxKeepAliveCount: 12,
452
+ requestedPublishingInterval: 2000
453
+ };
454
+ const subscription = await session.createSubscription2(parameters);
455
+ let t = getTick();
456
+ console.log("started subscription :", subscription.subscriptionId);
457
+ console.log(" revised parameters ");
458
+ console.log(" revised maxKeepAliveCount ", subscription.maxKeepAliveCount, " ( requested ", parameters.requestedMaxKeepAliveCount + ")");
459
+ console.log(" revised lifetimeCount ", subscription.lifetimeCount, " ( requested ", parameters.requestedLifetimeCount + ")");
460
+ console.log(" revised publishingInterval ", subscription.publishingInterval, " ( requested ", parameters.requestedPublishingInterval + ")");
461
+ subscription
462
+ .on("internal_error", (err) => {
463
+ console.log(" received internal error", err.message);
464
+ })
465
+ .on("keepalive", () => {
466
+ const t4 = getTick();
467
+ const span = t4 - t;
468
+ t = t4;
469
+ console.log("keepalive ", span / 1000, "sec", " pending request on server = ", subscription.getPublishEngine().nbPendingPublishRequests);
470
+ })
471
+ .on("terminated", () => {
472
+ /* */
473
+ });
474
+ try {
475
+ const results1 = await subscription.getMonitoredItems();
476
+ console.log("MonitoredItems clientHandles", results1.clientHandles);
477
+ console.log("MonitoredItems serverHandles", results1.serverHandles);
478
+ }
479
+ catch (err) {
480
+ if (util_2.types.isNativeError(err)) {
481
+ console.log("Server doesn't seems to implement getMonitoredItems method ", err.message);
482
+ }
483
+ }
484
+ // get_monitored_item
485
+ // monitor_a_variable_node_value
486
+ console.log("Monitoring monitor_a_variable_node_value");
487
+ // ---------------------------------------------------------------
488
+ // monitor a variable node value
489
+ // ---------------------------------------------------------------
490
+ console.log(" Monitoring node ", monitored_node.toString());
491
+ const monitoredItem = node_opcua_1.ClientMonitoredItem.create(subscription, {
492
+ attributeId: node_opcua_1.AttributeIds.Value,
493
+ nodeId: monitored_node
494
+ }, {
495
+ discardOldest: true,
496
+ queueSize: 10000,
497
+ samplingInterval: 1000
498
+ // xx filter: { parameterTypeId: "ns=0;i=0", encodingMask: 0 },
499
+ });
500
+ monitoredItem.on("initialized", () => {
501
+ console.log("monitoredItem initialized");
502
+ });
503
+ monitoredItem.on("changed", (dataValue1) => {
504
+ console.log(monitoredItem.itemToMonitor.nodeId.toString(), " value has changed to " + dataValue1.value.toString());
505
+ });
506
+ monitoredItem.on("err", (err_message) => {
507
+ console.log(monitoredItem.itemToMonitor.nodeId.toString(), chalk_1.default.red(" ERROR"), err_message);
508
+ });
509
+ const results = await subscription.getMonitoredItems();
510
+ console.log("MonitoredItems clientHandles", results.clientHandles);
511
+ console.log("MonitoredItems serverHandles", results.serverHandles);
512
+ console.log("Monitoring monitor_the_object_events");
513
+ // ---------------------------------------------------------------
514
+ // monitor the object events
515
+ // ---------------------------------------------------------------
516
+ const baseEventTypeId = "i=2041"; // BaseEventType;
517
+ const serverObjectId = "i=2253";
518
+ const fields = [
519
+ "EventId",
520
+ "EventType",
521
+ "SourceNode",
522
+ "SourceName",
523
+ "Time",
524
+ "ReceiveTime",
525
+ "Message",
526
+ "Severity",
527
+ // ConditionType
528
+ "ConditionClassId",
529
+ "ConditionClassName",
530
+ "ConditionName",
531
+ "BranchId",
532
+ "Retain",
533
+ "EnabledState",
534
+ "Quality",
535
+ "LastSeverity",
536
+ "Comment",
537
+ "ClientUserId",
538
+ // AcknowledgeConditionType
539
+ "AckedState",
540
+ "ConfirmedState",
541
+ // AlarmConditionType
542
+ "ActiveState",
543
+ "InputNode",
544
+ "SuppressedState",
545
+ "HighLimit",
546
+ "LowLimit",
547
+ "HighHighLimit",
548
+ "LowLowLimit",
549
+ "Value"
550
+ ];
551
+ const eventFilter = (0, node_opcua_1.constructEventFilter)(fields, (0, node_opcua_1.ofType)("ConditionType"));
552
+ const event_monitoringItem = node_opcua_1.ClientMonitoredItem.create(subscription, {
553
+ attributeId: node_opcua_1.AttributeIds.EventNotifier,
554
+ nodeId: serverObjectId
555
+ }, {
556
+ discardOldest: true,
557
+ filter: eventFilter,
558
+ queueSize: 100000
559
+ });
560
+ event_monitoringItem.on("initialized", () => {
561
+ console.log("event_monitoringItem initialized");
562
+ });
563
+ event_monitoringItem.on("changed", (eventFields) => {
564
+ (0, node_opcua_1.dumpEvent)(session, fields, eventFields);
565
+ });
566
+ event_monitoringItem.on("err", (err_message) => {
567
+ console.log(chalk_1.default.red("event_monitoringItem ", baseEventTypeId, " ERROR"), err_message);
568
+ });
569
+ console.log("--------------------------------------------- Monitoring alarms");
570
+ const alarmNodeId = (0, node_opcua_1.coerceNodeId)("ns=2;s=1:Colours/EastTank?Green");
571
+ await monitorAlarm(session, subscription, alarmNodeId);
572
+ console.log("Starting timer ", timeout);
573
+ if (timeout > 0) {
574
+ // simulate a connection break at t =timeout/2
575
+ setTimeout(() => {
576
+ console.log(chalk_1.default.red(" -------------------------------------------------------------------- "));
577
+ console.log(chalk_1.default.red(" -- SIMULATE CONNECTION BREAK -- "));
578
+ console.log(chalk_1.default.red(" -------------------------------------------------------------------- "));
579
+ const socket = client._secureChannel._transport._socket;
580
+ socket.end();
581
+ socket.emit("error", new Error("ECONNRESET"));
582
+ }, timeout);
583
+ }
584
+ await new Promise((resolve) => process.once("SIGINT", resolve));
585
+ console.log(" user interruption ...");
586
+ console.log(chalk_1.default.red.bold(" Received client interruption from user "));
587
+ console.log(chalk_1.default.red.bold(" shutting down ..."));
588
+ console.log(" closing session");
589
+ await session.close();
590
+ console.log(" session closed");
591
+ console.log(" Calling disconnect");
592
+ await client.disconnect();
593
+ console.log(chalk_1.default.cyan(" disconnected"));
594
+ console.log("success !! ");
595
+ process.exit(0);
596
+ }
597
+ main();
598
+ })();
599
+ //# sourceMappingURL=client_example_ts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client_example_ts.js","sourceRoot":"","sources":["../bin/client_example_ts.ts"],"names":[],"mappings":"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"}