@bitpoolos/edge-bacnet 1.0.6 → 1.1.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.
Files changed (181) hide show
  1. package/bacnet_client.js +650 -233
  2. package/bacnet_device.js +65 -16
  3. package/bacnet_gateway.html +242 -99
  4. package/bacnet_gateway.js +211 -27
  5. package/bacnet_object.js +1 -1
  6. package/bacnet_read.html +211 -133
  7. package/bacnet_read.js +24 -24
  8. package/bacnet_server.js +321 -0
  9. package/bacnet_write.html +24 -15
  10. package/bacnet_write.js +0 -2
  11. package/common.js +95 -9
  12. package/edge-bacnet-datastore.cfg +0 -0
  13. package/package.json +6 -4
  14. package/resources/confirmationservice.min.js +1 -0
  15. package/resources/confirmdialog.min.js +1 -0
  16. package/resources/fonts/primeicons.woff2 +0 -0
  17. package/resources/node-bacnet/CHANGELOG.md +481 -0
  18. package/resources/{bacstack → node-bacnet}/LICENSE.md +3 -1
  19. package/resources/node-bacnet/README.md +91 -0
  20. package/resources/node-bacnet/docs/Client.html +4422 -0
  21. package/resources/node-bacnet/docs/bacnet-icon-quad.png +0 -0
  22. package/resources/node-bacnet/docs/bacnet-icon-quad128.png +0 -0
  23. package/resources/node-bacnet/docs/bacnet-icon-quad64.png +0 -0
  24. package/resources/node-bacnet/docs/bacnet-icon-small.xcf +0 -0
  25. package/resources/node-bacnet/docs/bacnet-icon.xcf +0 -0
  26. package/resources/node-bacnet/docs/bacnet.html +7032 -0
  27. package/resources/node-bacnet/docs/client.js.html +1759 -0
  28. package/resources/node-bacnet/docs/enum.js.html +2530 -0
  29. package/resources/node-bacnet/docs/global.html +2068 -0
  30. package/resources/node-bacnet/docs/images/mocha-logo.svg +65 -0
  31. package/resources/node-bacnet/docs/index.html +283 -0
  32. package/resources/node-bacnet/docs/scripts/collapse.js +11 -0
  33. package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +4 -0
  34. package/resources/node-bacnet/docs/scripts/linenumber.js +26 -0
  35. package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
  36. package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +2 -0
  37. package/resources/node-bacnet/docs/scripts/prettify/prettify.js +28 -0
  38. package/resources/node-bacnet/docs/scripts/search.js +47 -0
  39. package/resources/node-bacnet/docs/services_i-am.js.html +157 -0
  40. package/resources/node-bacnet/docs/services_time-sync.js.html +118 -0
  41. package/resources/node-bacnet/docs/services_who-is.js.html +138 -0
  42. package/resources/node-bacnet/docs/styles/jsdoc.css +683 -0
  43. package/resources/node-bacnet/docs/styles/prettify.css +82 -0
  44. package/resources/node-bacnet/examples/discover-devices.js +66 -0
  45. package/resources/node-bacnet/examples/read-device.js +510 -0
  46. package/resources/node-bacnet/examples/subscribe-cov.js +75 -0
  47. package/resources/{bacstack → node-bacnet}/index.js +3 -0
  48. package/resources/{bacstack → node-bacnet}/lib/apdu.js +56 -39
  49. package/resources/{bacstack → node-bacnet}/lib/asn1.js +550 -532
  50. package/resources/node-bacnet/lib/bvlc.js +90 -0
  51. package/resources/node-bacnet/lib/client.js +1695 -0
  52. package/resources/node-bacnet/lib/enum.js +2463 -0
  53. package/resources/node-bacnet/lib/npdu.js +123 -0
  54. package/resources/{bacstack → node-bacnet}/lib/services/add-list-element.js +12 -6
  55. package/resources/{bacstack → node-bacnet}/lib/services/alarm-acknowledge.js +3 -3
  56. package/resources/{bacstack → node-bacnet}/lib/services/alarm-summary.js +5 -4
  57. package/resources/{bacstack → node-bacnet}/lib/services/atomic-read-file.js +49 -26
  58. package/resources/{bacstack → node-bacnet}/lib/services/atomic-write-file.js +40 -23
  59. package/resources/{bacstack → node-bacnet}/lib/services/cov-notify.js +33 -17
  60. package/resources/{bacstack → node-bacnet}/lib/services/create-object.js +23 -13
  61. package/resources/{bacstack → node-bacnet}/lib/services/delete-object.js +7 -2
  62. package/resources/{bacstack → node-bacnet}/lib/services/device-communication-control.js +8 -3
  63. package/resources/{bacstack → node-bacnet}/lib/services/error.js +7 -0
  64. package/resources/{bacstack → node-bacnet}/lib/services/event-information.js +10 -9
  65. package/resources/{bacstack → node-bacnet}/lib/services/event-notify-data.js +38 -16
  66. package/resources/{bacstack → node-bacnet}/lib/services/get-enrollment-summary.js +24 -11
  67. package/resources/{bacstack → node-bacnet}/lib/services/get-event-information.js +28 -13
  68. package/resources/node-bacnet/lib/services/i-am.js +90 -0
  69. package/resources/{bacstack/lib/services/i-have-broadcast.js → node-bacnet/lib/services/i-have.js} +3 -2
  70. package/resources/{bacstack → node-bacnet}/lib/services/index.js +7 -4
  71. package/resources/{bacstack → node-bacnet}/lib/services/life-safety-operation.js +3 -2
  72. package/resources/{bacstack → node-bacnet}/lib/services/private-transfer.js +3 -2
  73. package/resources/{bacstack → node-bacnet}/lib/services/read-property-multiple.js +11 -6
  74. package/resources/{bacstack → node-bacnet}/lib/services/read-property.js +42 -24
  75. package/resources/{bacstack → node-bacnet}/lib/services/read-range.js +37 -27
  76. package/resources/node-bacnet/lib/services/register-foreign-device.js +18 -0
  77. package/resources/{bacstack → node-bacnet}/lib/services/reinitialize-device.js +9 -4
  78. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-cov.js +9 -4
  79. package/resources/{bacstack → node-bacnet}/lib/services/subscribe-property.js +18 -8
  80. package/resources/{bacstack → node-bacnet}/lib/services/time-sync.js +28 -5
  81. package/resources/{bacstack → node-bacnet}/lib/services/who-has.js +3 -3
  82. package/resources/{bacstack → node-bacnet}/lib/services/who-is.js +42 -9
  83. package/resources/{bacstack → node-bacnet}/lib/services/write-property-multiple.js +33 -16
  84. package/resources/{bacstack → node-bacnet}/lib/services/write-property.js +23 -13
  85. package/resources/node-bacnet/lib/transport.js +82 -0
  86. package/resources/node-bacnet/package.json +92 -0
  87. package/resources/primeicons.css +90 -2
  88. package/resources/bacstack/.codeclimate.yml +0 -15
  89. package/resources/bacstack/.dockerignore +0 -5
  90. package/resources/bacstack/.editorconfig +0 -13
  91. package/resources/bacstack/.eslintrc.yml +0 -13
  92. package/resources/bacstack/.github/ISSUE_TEMPLATE.md +0 -26
  93. package/resources/bacstack/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  94. package/resources/bacstack/.github/workflows/ci.yml +0 -39
  95. package/resources/bacstack/.jscsrc +0 -8
  96. package/resources/bacstack/.jshintrc +0 -50
  97. package/resources/bacstack/.travis.yml +0 -27
  98. package/resources/bacstack/CHANGELOG.md +0 -232
  99. package/resources/bacstack/CODE_OF_CONDUCT.md +0 -74
  100. package/resources/bacstack/CONTRIBUTING.md +0 -77
  101. package/resources/bacstack/Dockerfile +0 -15
  102. package/resources/bacstack/FAQ.md +0 -64
  103. package/resources/bacstack/README.md +0 -157
  104. package/resources/bacstack/docker-compose.yml +0 -9
  105. package/resources/bacstack/lib/adpu.js +0 -190
  106. package/resources/bacstack/lib/bvlc.js +0 -43
  107. package/resources/bacstack/lib/client.js +0 -1028
  108. package/resources/bacstack/lib/enum.js +0 -1314
  109. package/resources/bacstack/lib/npdu.js +0 -119
  110. package/resources/bacstack/lib/services/i-am-broadcast.js +0 -51
  111. package/resources/bacstack/lib/services.js +0 -1963
  112. package/resources/bacstack/lib/transport.js +0 -52
  113. package/resources/bacstack/package-lock.json +0 -7974
  114. package/resources/bacstack/package.json +0 -84
  115. package/resources/bacstack/test/compliance/who-is.spec.js +0 -37
  116. package/resources/bacstack/test/integration/acknowledge-alarm.spec.js +0 -14
  117. package/resources/bacstack/test/integration/add-list-element.spec.js +0 -16
  118. package/resources/bacstack/test/integration/confirmed-event-notification.spec.js +0 -30
  119. package/resources/bacstack/test/integration/confirmed-private-transfer.spec.js +0 -15
  120. package/resources/bacstack/test/integration/create-object.spec.js +0 -16
  121. package/resources/bacstack/test/integration/delete-object.spec.js +0 -14
  122. package/resources/bacstack/test/integration/device-communication-control.spec.js +0 -14
  123. package/resources/bacstack/test/integration/get-alarm-summary.spec.js +0 -14
  124. package/resources/bacstack/test/integration/get-enrollment-summary.spec.js +0 -15
  125. package/resources/bacstack/test/integration/get-event-information.spec.js +0 -14
  126. package/resources/bacstack/test/integration/read-file.spec.js +0 -14
  127. package/resources/bacstack/test/integration/read-property-multiple.spec.js +0 -110
  128. package/resources/bacstack/test/integration/read-property.spec.js +0 -14
  129. package/resources/bacstack/test/integration/read-range.spec.js +0 -14
  130. package/resources/bacstack/test/integration/reinitialize-sevice.spec.js +0 -14
  131. package/resources/bacstack/test/integration/remove-list-element.spec.js +0 -16
  132. package/resources/bacstack/test/integration/subscribe-cov.spec.js +0 -14
  133. package/resources/bacstack/test/integration/subscribe-property.spec.js +0 -14
  134. package/resources/bacstack/test/integration/time-sync-utc.spec.js +0 -10
  135. package/resources/bacstack/test/integration/time-sync.spec.js +0 -10
  136. package/resources/bacstack/test/integration/unconfirmed-event-notification.spec.js +0 -28
  137. package/resources/bacstack/test/integration/unconfirmed-private-transfer.spec.js +0 -11
  138. package/resources/bacstack/test/integration/utils.js +0 -30
  139. package/resources/bacstack/test/integration/who-is.spec.js +0 -17
  140. package/resources/bacstack/test/integration/write-file.spec.js +0 -14
  141. package/resources/bacstack/test/integration/write-property-multiple.spec.js +0 -19
  142. package/resources/bacstack/test/integration/write-property.spec.js +0 -14
  143. package/resources/bacstack/test/unit/apdu.spec.js +0 -162
  144. package/resources/bacstack/test/unit/asn1.spec.js +0 -39
  145. package/resources/bacstack/test/unit/bacnet-apdu.spec.js +0 -161
  146. package/resources/bacstack/test/unit/bacnet-asn1.spec.js +0 -32
  147. package/resources/bacstack/test/unit/bacnet-bvlc.spec.js +0 -57
  148. package/resources/bacstack/test/unit/bacnet-npdu.spec.js +0 -118
  149. package/resources/bacstack/test/unit/bacnet-services.spec.js +0 -2052
  150. package/resources/bacstack/test/unit/bvlc.spec.js +0 -58
  151. package/resources/bacstack/test/unit/npdu.spec.js +0 -119
  152. package/resources/bacstack/test/unit/service-add-list-element.spec.js +0 -24
  153. package/resources/bacstack/test/unit/service-alarm-acknowledge.spec.js +0 -71
  154. package/resources/bacstack/test/unit/service-alarm-summary.spec.js +0 -22
  155. package/resources/bacstack/test/unit/service-atomic-read-file.spec.js +0 -54
  156. package/resources/bacstack/test/unit/service-atomic-write-file.spec.js +0 -56
  157. package/resources/bacstack/test/unit/service-cov-notify.spec.js +0 -98
  158. package/resources/bacstack/test/unit/service-create-object.spec.js +0 -90
  159. package/resources/bacstack/test/unit/service-delete-object.spec.js +0 -17
  160. package/resources/bacstack/test/unit/service-device-communication-control.spec.js +0 -29
  161. package/resources/bacstack/test/unit/service-error.spec.js +0 -17
  162. package/resources/bacstack/test/unit/service-event-information.spec.js +0 -48
  163. package/resources/bacstack/test/unit/service-event-notify-data.spec.js +0 -310
  164. package/resources/bacstack/test/unit/service-get-enrollment-summary.spec.js +0 -45
  165. package/resources/bacstack/test/unit/service-get-event-information.spec.js +0 -62
  166. package/resources/bacstack/test/unit/service-i-am.spec.js +0 -19
  167. package/resources/bacstack/test/unit/service-i-have-broadcast.spec.js +0 -18
  168. package/resources/bacstack/test/unit/service-life-safety-operation.spec.js +0 -19
  169. package/resources/bacstack/test/unit/service-private-transfer.spec.js +0 -18
  170. package/resources/bacstack/test/unit/service-read-property-multiple.spec.js +0 -131
  171. package/resources/bacstack/test/unit/service-read-property.spec.js +0 -541
  172. package/resources/bacstack/test/unit/service-read-range.spec.js +0 -97
  173. package/resources/bacstack/test/unit/service-reinitialize-device.spec.js +0 -27
  174. package/resources/bacstack/test/unit/service-subscribe-cov.spec.js +0 -32
  175. package/resources/bacstack/test/unit/service-subscribe-property.spec.js +0 -50
  176. package/resources/bacstack/test/unit/service-time-sync.spec.js +0 -18
  177. package/resources/bacstack/test/unit/service-who-has.spec.js +0 -33
  178. package/resources/bacstack/test/unit/service-who-is.spec.js +0 -17
  179. package/resources/bacstack/test/unit/service-write-property-multiple.spec.js +0 -143
  180. package/resources/bacstack/test/unit/service-write-property.spec.js +0 -198
  181. package/resources/bacstack/test/unit/utils.js +0 -6
@@ -1,14 +1,19 @@
1
1
  'use strict';
2
2
 
3
3
  const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
4
5
 
5
6
  module.exports.decode = (buffer, offset, apduLen) => {
6
7
  const result = baAsn1.decodeTagNumberAndValue(buffer, offset);
7
- if (result.tagNumber !== 12) return;
8
+ if (result.tagNumber !== 12) {
9
+ return undefined;
10
+ }
8
11
  let len = 1;
9
12
  const value = baAsn1.decodeObjectId(buffer, offset + len);
10
13
  len += value.len;
11
- if (len !== apduLen) return;
14
+ if (len !== apduLen) {
15
+ return undefined;
16
+ }
12
17
  value.len = len;
13
18
  return value;
14
19
  };
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
4
5
 
5
6
  module.exports.encode = (buffer, timeDuration, enableDisable, password) => {
6
7
  if (timeDuration > 0) {
@@ -14,7 +15,7 @@ module.exports.encode = (buffer, timeDuration, enableDisable, password) => {
14
15
 
15
16
  module.exports.decode = (buffer, offset, apduLen) => {
16
17
  let len = 0;
17
- const value = {};
18
+ let value = {};
18
19
  let decodedValue;
19
20
  let result;
20
21
  if (baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
@@ -24,14 +25,18 @@ module.exports.decode = (buffer, offset, apduLen) => {
24
25
  value.timeDuration = decodedValue.value;
25
26
  len += decodedValue.len;
26
27
  }
27
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
28
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) {
29
+ return undefined;
30
+ }
28
31
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
29
32
  len += result.len;
30
33
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
31
34
  value.enableDisable = decodedValue.value;
32
35
  len += decodedValue.len;
33
36
  if (len < apduLen) {
34
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 2)) return;
37
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 2)) {
38
+ return undefined;
39
+ }
35
40
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
36
41
  len += result.len;
37
42
  decodedValue = baAsn1.decodeCharacterString(buffer, offset + len, apduLen - (offset + len), result.value);
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
4
5
 
5
6
  module.exports.encode = (buffer, errorClass, errorCode) => {
6
7
  baAsn1.encodeApplicationEnumerated(buffer, errorClass);
@@ -24,3 +25,9 @@ module.exports.decode = (buffer, offset) => {
24
25
  code: errorCode.value
25
26
  };
26
27
  };
28
+
29
+ module.exports.buildMessage = function (result) {
30
+ return 'BacnetError Class: ' + baEnum.ErrorClassName[result.class] + ' ' +
31
+ '(' + result.class + ') ' +
32
+ 'Code: ' + baEnum.ErrorCodeName[result.code] + ' (' + result.code + ')';
33
+ };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
5
5
 
6
6
  module.exports.encode = (buffer, events, moreEvents) => {
7
7
  baAsn1.encodeOpeningTag(buffer, 0);
@@ -33,8 +33,9 @@ module.exports.decode = (buffer, offset, apduLen) => {
33
33
  let decodedValue;
34
34
  len++;
35
35
  const alarms = [];
36
+ let moreEvents;
36
37
  while ((apduLen - 3 - len) > 0) {
37
- const value = {};
38
+ let value = {};
38
39
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
39
40
  len += result.len;
40
41
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
@@ -54,14 +55,14 @@ module.exports.decode = (buffer, offset, apduLen) => {
54
55
  len += result.len;
55
56
  value.eventTimeStamps = [];
56
57
  for (let i = 0; i < 3; i++) {
57
- if (result.tagNumber !== baEnum.ApplicationTags.NULL) {
58
+ if (result.tagNumber !== baEnum.ApplicationTag.NULL) {
58
59
  decodedValue = baAsn1.decodeApplicationDate(buffer, offset + len);
59
60
  len += decodedValue.len;
60
61
  const date = decodedValue.value.value;
61
62
  decodedValue = baAsn1.decodeApplicationTime(buffer, offset + len);
62
63
  len += decodedValue.len;
63
64
  const time = decodedValue.value.value;
64
- value.eventTimeStamps[i] = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());
65
+ value.eventTimeStamps[i] = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());
65
66
  } else {
66
67
  len += result.value;
67
68
  }
@@ -89,10 +90,10 @@ module.exports.decode = (buffer, offset, apduLen) => {
89
90
  len++;
90
91
  alarms.push(value);
91
92
  }
92
- const moreEvents = (buffer[apduLen - 1] === 1);
93
+ moreEvents = (buffer[apduLen - 1] === 1);
93
94
  return {
94
- len: len,
95
- alarms: alarms,
96
- moreEvents: moreEvents
95
+ len,
96
+ alarms,
97
+ moreEvents
97
98
  };
98
99
  };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
5
5
 
6
6
  module.exports.encode = (buffer, data) => {
7
7
  baAsn1.encodeContextUnsigned(buffer, 0, data.processId);
@@ -48,10 +48,10 @@ module.exports.encode = (buffer, data) => {
48
48
  baAsn1.encodeOpeningTag(buffer, 2);
49
49
  baAsn1.encodeOpeningTag(buffer, 0);
50
50
  switch (data.changeOfValueTag) {
51
- case baEnum.CovTypes.REAL:
51
+ case baEnum.CovType.REAL:
52
52
  baAsn1.encodeContextReal(buffer, 1, data.changeOfValueChangeValue);
53
53
  break;
54
- case baEnum.CovTypes.BIT_STRING:
54
+ case baEnum.CovType.BIT_STRING:
55
55
  baAsn1.encodeContextBitstring(buffer, 0, data.changeOfValueChangedBits);
56
56
  break;
57
57
  default:
@@ -118,26 +118,34 @@ module.exports.decode = (buffer, offset) => {
118
118
  let len = 0;
119
119
  let result;
120
120
  let decodedValue;
121
- const eventData = {};
122
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
121
+ let eventData = {};
122
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
123
+ return undefined;
124
+ }
123
125
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
124
126
  len += result.len;
125
127
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
126
128
  len += decodedValue.len;
127
129
  eventData.processId = decodedValue.value;
128
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
130
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) {
131
+ return undefined;
132
+ }
129
133
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
130
134
  len += result.len;
131
135
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
132
136
  len += decodedValue.len;
133
137
  eventData.initiatingObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
134
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 2)) return;
138
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 2)) {
139
+ return undefined;
140
+ }
135
141
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
136
142
  len += result.len;
137
143
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
138
144
  len += decodedValue.len;
139
145
  eventData.eventObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
140
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 3)) return;
146
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 3)) {
147
+ return undefined;
148
+ }
141
149
  len += 2;
142
150
  decodedValue = baAsn1.decodeApplicationDate(buffer, offset + len);
143
151
  len += decodedValue.len;
@@ -148,20 +156,28 @@ module.exports.decode = (buffer, offset) => {
148
156
  eventData.timeStamp = {};
149
157
  eventData.timeStamp = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());
150
158
  len += 2;
151
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 4)) return;
159
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 4)) {
160
+ return undefined;
161
+ }
152
162
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
153
163
  len += result.len;
154
164
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
155
165
  len += decodedValue.len;
156
166
  eventData.notificationClass = decodedValue.value;
157
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 5)) return;
167
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 5)) {
168
+ return undefined;
169
+ }
158
170
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
159
171
  len += result.len;
160
172
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
161
173
  len += decodedValue.len;
162
174
  eventData.priority = decodedValue.value;
163
- if (eventData.priority > 0xFF) return;
164
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 6)) return;
175
+ if (eventData.priority > 0xFF) {
176
+ return undefined;
177
+ }
178
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 6)) {
179
+ return undefined;
180
+ }
165
181
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
166
182
  len += result.len;
167
183
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
@@ -172,7 +188,9 @@ module.exports.decode = (buffer, offset) => {
172
188
  len += decodedValue.len;
173
189
  eventData.messageText = decodedValue.value;
174
190
  }
175
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 8)) return;
191
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 8)) {
192
+ return undefined;
193
+ }
176
194
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
177
195
  len += result.len;
178
196
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
@@ -186,7 +204,9 @@ module.exports.decode = (buffer, offset) => {
186
204
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, 1);
187
205
  len += decodedValue.len;
188
206
  eventData.ackRequired = (decodedValue.value > 0);
189
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 10)) return;
207
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 10)) {
208
+ return undefined;
209
+ }
190
210
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
191
211
  len += result.len;
192
212
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
@@ -196,7 +216,9 @@ module.exports.decode = (buffer, offset) => {
196
216
  default:
197
217
  break;
198
218
  }
199
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 11)) return;
219
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 11)) {
220
+ return undefined;
221
+ }
200
222
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
201
223
  len += result.len;
202
224
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
5
5
 
6
6
  module.exports.encode = (buffer, acknowledgmentFilter, enrollmentFilter, eventStateFilter, eventTypeFilter, priorityFilter, notificationClassFilter) => {
7
7
  baAsn1.encodeContextEnumerated(buffer, 0, acknowledgmentFilter);
@@ -40,7 +40,7 @@ module.exports.decode = (buffer, offset, apduLen) => {
40
40
  let len = 0;
41
41
  let result;
42
42
  let decodedValue;
43
- const value = {};
43
+ let value = {};
44
44
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
45
45
  len += result.len;
46
46
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
@@ -49,7 +49,9 @@ module.exports.decode = (buffer, offset, apduLen) => {
49
49
  if (baAsn1.decodeIsContextTag(buffer, offset + len, 1)) {
50
50
  len++;
51
51
  value.enrollmentFilter = {};
52
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
52
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
53
+ return undefined;
54
+ }
53
55
  len++;
54
56
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
55
57
  len += result.len;
@@ -123,43 +125,54 @@ module.exports.encodeAcknowledge = (buffer, enrollmentSummaries) => {
123
125
  module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
124
126
  let len = 0;
125
127
  let result;
128
+ let decodedValue;
126
129
  const enrollmentSummaries = [];
127
130
  while ((apduLen - len) > 0) {
128
131
  const enrollmentSummary = {};
129
132
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
130
133
  len += result.len;
131
- if (result.tagNumber !== baEnum.ApplicationTags.OBJECTIDENTIFIER) return;
134
+ if (result.tagNumber !== baEnum.ApplicationTag.OBJECTIDENTIFIER) {
135
+ return undefined;
136
+ }
132
137
  result = baAsn1.decodeObjectId(buffer, offset + len);
133
138
  len += result.len;
134
139
  enrollmentSummary.objectId = {type: result.objectType, instance: result.instance};
135
140
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
136
141
  len += result.len;
137
- if (result.tagNumber !== baEnum.ApplicationTags.ENUMERATED) return;
142
+ if (result.tagNumber !== baEnum.ApplicationTag.ENUMERATED) {
143
+ return undefined;
144
+ }
138
145
  result = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
139
146
  len += result.len;
140
147
  enrollmentSummary.eventType = result.value;
141
148
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
142
149
  len += result.len;
143
- if (result.tagNumber !== baEnum.ApplicationTags.ENUMERATED) return;
150
+ if (result.tagNumber !== baEnum.ApplicationTag.ENUMERATED) {
151
+ return undefined;
152
+ }
144
153
  result = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
145
154
  len += result.len;
146
155
  enrollmentSummary.eventState = result.value;
147
156
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
148
157
  len += result.len;
149
- if (result.tagNumber !== baEnum.ApplicationTags.UNSIGNED_INTEGER) return;
158
+ if (result.tagNumber !== baEnum.ApplicationTag.UNSIGNED_INTEGER) {
159
+ return undefined;
160
+ }
150
161
  result = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
151
162
  len += result.len;
152
163
  enrollmentSummary.priority = result.value;
153
164
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
154
165
  len += result.len;
155
- if (result.tagNumber !== baEnum.ApplicationTags.UNSIGNED_INTEGER) return;
166
+ if (result.tagNumber !== baEnum.ApplicationTag.UNSIGNED_INTEGER) {
167
+ return undefined;
168
+ }
156
169
  result = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
157
170
  len += result.len;
158
171
  enrollmentSummary.notificationClass = result.value;
159
172
  enrollmentSummaries.push(enrollmentSummary);
160
173
  }
161
174
  return {
162
- enrollmentSummaries: enrollmentSummaries,
163
- len: len
175
+ enrollmentSummaries,
176
+ len
164
177
  };
165
178
  };
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
5
5
 
6
6
  module.exports.encode = (buffer, lastReceivedObjectId) => {
7
7
  baAsn1.encodeContextObjectId(buffer, 0, lastReceivedObjectId.type, lastReceivedObjectId.instance);
@@ -9,10 +9,12 @@ module.exports.encode = (buffer, lastReceivedObjectId) => {
9
9
 
10
10
  module.exports.decode = (buffer, offset) => {
11
11
  let len = 0;
12
- const value = {};
13
- const result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
12
+ let result;
13
+ let decodedValue;
14
+ let value = {};
15
+ result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
14
16
  len += result.len;
15
- const decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
17
+ decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
16
18
  len += decodedValue.len;
17
19
  value.lastReceivedObjectId = {type: decodedValue.objectType, instance: decodedValue.instance};
18
20
  value.len = len;
@@ -46,12 +48,14 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
46
48
  let len = 0;
47
49
  let result;
48
50
  let decodedValue;
49
- const value = {};
50
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 0)) return;
51
+ let value = {};
52
+ if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 0)) {
53
+ return undefined;
54
+ }
51
55
  len++;
52
56
  value.events = [];
53
57
  while ((apduLen - len) > 3) {
54
- const event = {};
58
+ let event = {};
55
59
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
56
60
  len += result.len;
57
61
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
@@ -67,7 +71,9 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
67
71
  decodedValue = baAsn1.decodeBitstring(buffer, offset + len, result.value);
68
72
  len += decodedValue.len;
69
73
  event.acknowledgedTransitions = decodedValue.value;
70
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 3)) return;
74
+ if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 3)) {
75
+ return undefined;
76
+ }
71
77
  len++;
72
78
  event.eventTimeStamps = [];
73
79
  for (let i = 0; i < 3; i++) {
@@ -77,6 +83,7 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
77
83
  decodedValue = baAsn1.decodeBacnetTime(buffer, offset + len, result.value);
78
84
  len += decodedValue.len;
79
85
  event.eventTimeStamps[i] = {value: decodedValue.value, type: baEnum.TimeStamp.TIME};
86
+
80
87
  } else if (result.tagNumber === baEnum.TimeStamp.SEQUENCE_NUMBER) {
81
88
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
82
89
  len += decodedValue.len;
@@ -92,7 +99,9 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
92
99
  len++;
93
100
  }
94
101
  }
95
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 3)) return;
102
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 3)) {
103
+ return undefined;
104
+ }
96
105
  len++;
97
106
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
98
107
  len += result.len;
@@ -104,7 +113,9 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
104
113
  decodedValue = baAsn1.decodeBitstring(buffer, offset + len, result.value);
105
114
  len += decodedValue.len;
106
115
  event.eventEnable = decodedValue.value;
107
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 6)) return;
116
+ if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 6)) {
117
+ return undefined;
118
+ }
108
119
  len++;
109
120
  event.eventPriorities = [];
110
121
  for (let i = 0; i < 3; i++) {
@@ -114,11 +125,15 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
114
125
  len += decodedValue.len;
115
126
  event.eventPriorities[i] = decodedValue.value;
116
127
  }
117
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 6)) return;
128
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 6)) {
129
+ return undefined;
130
+ }
118
131
  len++;
119
132
  value.events.push(event);
120
133
  }
121
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 0)) return;
134
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 0)) {
135
+ return undefined;
136
+ }
122
137
  len++;
123
138
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
124
139
  len += result.len;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * The iAm event represents the response to a whoIs request to detect all
3
+ * devices in a BACNET network.
4
+ *
5
+ * @event bacnet.iAm
6
+ * @param {number} deviceId - The BACNET device-id of the detected device.
7
+ * @param {number} maxApdu - The max APDU size the detected device supports.
8
+ * @param {number} segmentation - The type of segmentation the detected device supports.
9
+ * @param {number} vendorId - The BACNET vendor-id of the detected device.
10
+ *
11
+ * @example
12
+ * const bacnet = require('node-bacnet');
13
+ * const client = new bacnet();
14
+ *
15
+ * client.on('iAm', (msg) => {
16
+ * console.log(
17
+ * 'address: ', msg.header.address,
18
+ * ' - deviceId: ', msg.payload.deviceId,
19
+ * ' - maxApdu: ', msg.payload.maxApdu,
20
+ * ' - segmentation: ', msg.payload.segmentation,
21
+ * ' - vendorId: ', msg.payload.vendorId
22
+ * );
23
+ * });
24
+ */
25
+
26
+ 'use strict';
27
+
28
+ const baAsn1 = require('../asn1');
29
+ const baEnum = require('../enum');
30
+
31
+ module.exports.encode = (buffer, deviceId, maxApdu, segmentation, vendorId) => {
32
+ baAsn1.encodeApplicationObjectId(buffer, baEnum.ObjectType.DEVICE, deviceId);
33
+ baAsn1.encodeApplicationUnsigned(buffer, maxApdu);
34
+ baAsn1.encodeApplicationEnumerated(buffer, segmentation);
35
+ baAsn1.encodeApplicationUnsigned(buffer, vendorId);
36
+ };
37
+
38
+ module.exports.decode = (buffer, offset) => {
39
+ let result;
40
+ let apduLen = 0;
41
+ const orgOffset = offset;
42
+ result = baAsn1.decodeTagNumberAndValue(buffer, offset + apduLen);
43
+ apduLen += result.len;
44
+ if (result.tagNumber !== baEnum.ApplicationTag.OBJECTIDENTIFIER) {
45
+ return undefined;
46
+ }
47
+ result = baAsn1.decodeObjectId(buffer, offset + apduLen);
48
+ apduLen += result.len;
49
+ if (result.objectType !== baEnum.ObjectType.DEVICE) {
50
+ return undefined;
51
+ }
52
+ const deviceId = result.instance;
53
+ result = baAsn1.decodeTagNumberAndValue(buffer, offset + apduLen);
54
+ apduLen += result.len;
55
+ if (result.tagNumber !== baEnum.ApplicationTag.UNSIGNED_INTEGER) {
56
+ return undefined;
57
+ }
58
+ result = baAsn1.decodeUnsigned(buffer, offset + apduLen, result.value);
59
+ apduLen += result.len;
60
+ const maxApdu = result.value;
61
+ result = baAsn1.decodeTagNumberAndValue(buffer, offset + apduLen);
62
+ apduLen += result.len;
63
+ if (result.tagNumber !== baEnum.ApplicationTag.ENUMERATED) {
64
+ return undefined;
65
+ }
66
+ result = baAsn1.decodeEnumerated(buffer, offset + apduLen, result.value);
67
+ apduLen += result.len;
68
+ if (result.value > baEnum.Segmentation.NO_SEGMENTATION) {
69
+ return undefined;
70
+ }
71
+ const segmentation = result.value;
72
+ result = baAsn1.decodeTagNumberAndValue(buffer, offset + apduLen);
73
+ apduLen += result.len;
74
+ if (result.tagNumber !== baEnum.ApplicationTag.UNSIGNED_INTEGER) {
75
+ return undefined;
76
+ }
77
+ result = baAsn1.decodeUnsigned(buffer, offset + apduLen, result.value);
78
+ apduLen += result.len;
79
+ if (result.value > 0xFFFF) {
80
+ return undefined;
81
+ }
82
+ const vendorId = result.value;
83
+ return {
84
+ len: offset - orgOffset,
85
+ deviceId,
86
+ maxApdu,
87
+ segmentation,
88
+ vendorId
89
+ };
90
+ };
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
4
5
 
5
6
  module.exports.encode = (buffer, deviceId, objectId, objectName) => {
6
7
  baAsn1.encodeApplicationObjectId(buffer, deviceId.type, deviceId.instance);
@@ -12,7 +13,7 @@ module.exports.decode = (buffer, offset, apduLen) => {
12
13
  let len = 0;
13
14
  let result;
14
15
  let decodedValue;
15
- const value = {};
16
+ let value = {};
16
17
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
17
18
  len += result.len;
18
19
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
@@ -6,6 +6,7 @@ module.exports.alarmSummary = require('./alarm-summary');
6
6
  module.exports.atomicReadFile = require('./atomic-read-file');
7
7
  module.exports.atomicWriteFile = require('./atomic-write-file');
8
8
  module.exports.covNotify = require('./cov-notify');
9
+ module.exports.covNotifyUnconfirmed = module.exports.covNotify;
9
10
  module.exports.createObject = require('./create-object');
10
11
  module.exports.deleteObject = require('./delete-object');
11
12
  module.exports.deviceCommunicationControl = require('./device-communication-control');
@@ -14,18 +15,20 @@ module.exports.eventInformation = require('./event-information');
14
15
  module.exports.eventNotifyData = require('./event-notify-data');
15
16
  module.exports.getEnrollmentSummary = require('./get-enrollment-summary');
16
17
  module.exports.getEventInformation = require('./get-event-information');
17
- module.exports.iAmBroadcast = require('./i-am-broadcast');
18
- module.exports.iHaveBroadcast = require('./i-have-broadcast');
18
+ module.exports.iAm = require('./i-am');
19
+ module.exports.iHave = require('./i-have');
19
20
  module.exports.lifeSafetyOperation = require('./life-safety-operation');
20
21
  module.exports.privateTransfer = require('./private-transfer');
21
- module.exports.readPropertyMultiple = require('./read-property-multiple');
22
22
  module.exports.readProperty = require('./read-property');
23
+ module.exports.readPropertyMultiple = require('./read-property-multiple');
23
24
  module.exports.readRange = require('./read-range');
25
+ module.exports.registerForeignDevice = require('./register-foreign-device');
24
26
  module.exports.reinitializeDevice = require('./reinitialize-device');
25
27
  module.exports.subscribeCov = require('./subscribe-cov');
26
28
  module.exports.subscribeProperty = require('./subscribe-property');
27
29
  module.exports.timeSync = require('./time-sync');
30
+ module.exports.timeSyncUTC = module.exports.timeSync;
28
31
  module.exports.whoHas = require('./who-has');
29
32
  module.exports.whoIs = require('./who-is');
30
- module.exports.writePropertyMultiple = require('./write-property-multiple');
31
33
  module.exports.writeProperty = require('./write-property');
34
+ module.exports.writePropertyMultiple = require('./write-property-multiple');
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
4
5
 
5
6
  module.exports.encode = (buffer, processId, requestingSource, operation, targetObjectId) => {
6
7
  baAsn1.encodeContextUnsigned(buffer, 0, processId);
@@ -13,7 +14,7 @@ module.exports.decode = (buffer, offset, apduLen) => {
13
14
  let len = 0;
14
15
  let result;
15
16
  let decodedValue;
16
- const value = {};
17
+ let value = {};
17
18
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
18
19
  len += result.len;
19
20
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
4
5
 
5
6
  module.exports.encode = (buffer, vendorId, serviceNumber, data) => {
6
7
  baAsn1.encodeContextUnsigned(buffer, 0, vendorId);
@@ -16,7 +17,7 @@ module.exports.decode = (buffer, offset, apduLen) => {
16
17
  let len = 0;
17
18
  let result;
18
19
  let decodedValue;
19
- const value = {};
20
+ let value = {};
20
21
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
21
22
  len += result.len;
22
23
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
- const baAsn1 = require('../asn1');
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
4
5
 
5
6
  module.exports.encode = (buffer, properties) => {
6
7
  properties.forEach((value) => {
@@ -13,12 +14,14 @@ module.exports.decode = (buffer, offset, apduLen) => {
13
14
  const values = [];
14
15
  while ((apduLen - len) > 0) {
15
16
  const decodedValue = baAsn1.decodeReadAccessSpecification(buffer, offset + len, apduLen - len);
16
- if (!decodedValue) return;
17
+ if (!decodedValue) {
18
+ return undefined;
19
+ }
17
20
  len += decodedValue.len;
18
21
  values.push(decodedValue.value);
19
22
  }
20
23
  return {
21
- len: len,
24
+ len,
22
25
  properties: values
23
26
  };
24
27
  };
@@ -34,12 +37,14 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
34
37
  const values = [];
35
38
  while ((apduLen - len) > 0) {
36
39
  const result = baAsn1.decodeReadAccessResult(buffer, offset + len, apduLen - len);
37
- if (!result) return;
40
+ if (!result) {
41
+ return undefined;
42
+ }
38
43
  len += result.len;
39
44
  values.push(result.value);
40
45
  }
41
46
  return {
42
- len: len,
43
- values: values
47
+ len,
48
+ values
44
49
  };
45
50
  };