@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,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, objectType, objectInstance, propertyId, arrayIndex) => {
7
7
  if (objectType <= baEnum.ASN1_MAX_OBJECT) {
@@ -11,7 +11,7 @@ module.exports.encode = (buffer, objectType, objectInstance, propertyId, arrayIn
11
11
  baAsn1.encodeContextEnumerated(buffer, 1, propertyId);
12
12
  }
13
13
  if (arrayIndex !== baEnum.ASN1_ARRAY_ALL) {
14
- baAsn1.encodeContextUnsigned(buffer, 2, arrayIndex || baEnum.ASN1_ARRAY_ALL);
14
+ baAsn1.encodeContextUnsigned(buffer, 2, (arrayIndex || arrayIndex === 0) ? arrayIndex : baEnum.ASN1_ARRAY_ALL);
15
15
  }
16
16
  };
17
17
 
@@ -19,16 +19,22 @@ module.exports.decode = (buffer, offset, apduLen) => {
19
19
  let len = 0;
20
20
  let result;
21
21
  let decodedValue;
22
- if (apduLen < 7) return;
23
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
22
+ if (apduLen < 7) {
23
+ return undefined;
24
+ }
25
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
26
+ return undefined;
27
+ }
24
28
  len++;
25
29
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
26
30
  len += decodedValue.len;
27
- const objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
28
- const property = {};
31
+ let objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
32
+ let property = {};
29
33
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
30
34
  len += result.len;
31
- if (result.tagNumber !== 1) return;
35
+ if (result.tagNumber !== 1) {
36
+ return undefined;
37
+ }
32
38
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
33
39
  len += decodedValue.len;
34
40
  property.id = decodedValue.value;
@@ -41,14 +47,16 @@ module.exports.decode = (buffer, offset, apduLen) => {
41
47
  len += decodedValue.len;
42
48
  property.index = decodedValue.value;
43
49
  } else {
44
- return;
50
+ return undefined;
45
51
  }
46
52
  }
47
- if (len < apduLen) return;
53
+ if (len < apduLen) {
54
+ return undefined;
55
+ }
48
56
  return {
49
- len: len,
50
- objectId: objectId,
51
- property: property
57
+ len,
58
+ objectId,
59
+ property
52
60
  };
53
61
  };
54
62
 
@@ -68,9 +76,11 @@ module.exports.encodeAcknowledge = (buffer, objectId, propertyId, arrayIndex, va
68
76
  module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
69
77
  let result;
70
78
  let decodedValue;
71
- const objectId = {};
72
- const property = {};
73
- if (!baAsn1.decodeIsContextTag(buffer, offset, 0)) return;
79
+ let objectId = {};
80
+ let property = {};
81
+ if (!baAsn1.decodeIsContextTag(buffer, offset, 0)) {
82
+ return undefined;
83
+ }
74
84
  let len = 1;
75
85
  result = baAsn1.decodeObjectId(buffer, offset + len);
76
86
  len += result.len;
@@ -78,7 +88,9 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
78
88
  objectId.instance = result.instance;
79
89
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
80
90
  len += result.len;
81
- if (result.tagNumber !== 1) return;
91
+ if (result.tagNumber !== 1) {
92
+ return undefined;
93
+ }
82
94
  result = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
83
95
  len += result.len;
84
96
  property.id = result.value;
@@ -92,21 +104,27 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
92
104
  property.index = baEnum.ASN1_ARRAY_ALL;
93
105
  }
94
106
  const values = [];
95
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 3)) return;
107
+ if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 3)) {
108
+ return undefined;
109
+ }
96
110
  len++;
97
111
  while ((apduLen - len) > 1) {
98
112
  result = baAsn1.bacappDecodeApplicationData(buffer, offset + len, apduLen + offset, objectId.type, property.id);
99
- if (!result) return;
113
+ if (!result) {
114
+ return undefined;
115
+ }
100
116
  len += result.len;
101
117
  delete result.len;
102
118
  values.push(result);
103
119
  }
104
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 3)) return;
120
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 3)) {
121
+ return undefined;
122
+ }
105
123
  len++;
106
124
  return {
107
- len: len,
108
- objectId: objectId,
109
- property: property,
110
- values: values
125
+ len,
126
+ objectId,
127
+ property,
128
+ values
111
129
  };
112
130
  };
@@ -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, objectId, propertyId, arrayIndex, requestType, position, time, count) => {
7
7
  baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance);
@@ -42,15 +42,19 @@ module.exports.decode = (buffer, offset, apduLen) => {
42
42
  let position;
43
43
  let time;
44
44
  let count;
45
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
45
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
46
+ return undefined;
47
+ }
46
48
  len++;
47
49
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len, 0);
48
50
  len += decodedValue.len;
49
- const objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
50
- const property = {};
51
+ let objectId = {type: decodedValue.objectType, instance: decodedValue.instance};
52
+ let property = {};
51
53
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
52
54
  len += result.len;
53
- if (result.tagNumber !== 1) return;
55
+ if (result.tagNumber !== 1) {
56
+ return undefined;
57
+ }
54
58
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
55
59
  len += decodedValue.len;
56
60
  property.id = decodedValue.value;
@@ -67,7 +71,7 @@ module.exports.decode = (buffer, offset, apduLen) => {
67
71
  result = baAsn1.decodeTagNumber(buffer, offset + len);
68
72
  len += result.len;
69
73
  switch (result.tagNumber) {
70
- case 3: {
74
+ case 3:
71
75
  requestType = baEnum.ReadRangeType.BY_POSITION;
72
76
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
73
77
  len += result.len;
@@ -80,7 +84,7 @@ module.exports.decode = (buffer, offset, apduLen) => {
80
84
  len += decodedValue.len;
81
85
  count = decodedValue.value;
82
86
  break;
83
- } case 6: {
87
+ case 6:
84
88
  requestType = baEnum.ReadRangeType.BY_SEQUENCE_NUMBER;
85
89
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
86
90
  len += result.len;
@@ -93,7 +97,7 @@ module.exports.decode = (buffer, offset, apduLen) => {
93
97
  len += decodedValue.len;
94
98
  count = decodedValue.value;
95
99
  break;
96
- } case 7: {
100
+ case 7:
97
101
  requestType = baEnum.ReadRangeType.BY_TIME_REFERENCE_TIME_COUNT;
98
102
  decodedValue = baAsn1.decodeApplicationDate(buffer, offset + len);
99
103
  len += decodedValue.len;
@@ -108,20 +112,20 @@ module.exports.decode = (buffer, offset, apduLen) => {
108
112
  len += decodedValue.len;
109
113
  count = decodedValue.value;
110
114
  break;
111
- } default:
112
- return;
115
+ default:
116
+ return undefined;
113
117
  }
114
118
  result = baAsn1.decodeTagNumber(buffer, offset + len);
115
119
  len += result.len;
116
120
  }
117
121
  return {
118
- len: len,
119
- objectId: objectId,
120
- property: property,
121
- requestType: requestType,
122
- position: position,
123
- time: time,
124
- count: count
122
+ len,
123
+ objectId,
124
+ property,
125
+ requestType,
126
+ position,
127
+ time,
128
+ count
125
129
  };
126
130
  };
127
131
 
@@ -148,7 +152,9 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
148
152
  let len = 0;
149
153
  let result;
150
154
  let decodedValue;
151
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
155
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
156
+ return undefined;
157
+ }
152
158
  len++;
153
159
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
154
160
  len += decodedValue.len;
@@ -156,7 +162,9 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
156
162
  const property = {index: baEnum.ASN1_ARRAY_ALL};
157
163
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
158
164
  len += result.len;
159
- if (result.tagNumber !== 1) return;
165
+ if (result.tagNumber !== 1) {
166
+ return undefined;
167
+ }
160
168
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
161
169
  len += decodedValue.len;
162
170
  property.id = decodedValue.value;
@@ -177,15 +185,17 @@ module.exports.decodeAcknowledge = (buffer, offset, apduLen) => {
177
185
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
178
186
  len += decodedValue.len;
179
187
  const itemCount = decodedValue.value;
180
- if (!(baAsn1.decodeIsOpeningTag(buffer, offset + len))) return;
188
+ if (!(baAsn1.decodeIsOpeningTag(buffer, offset + len))) {
189
+ return undefined;
190
+ }
181
191
  len++;
182
192
  const rangeBuffer = buffer.slice(offset + len, apduLen - 3);
183
193
  return {
184
- objectId: objectId,
185
- property: property,
186
- resultFlag: resultFlag,
187
- itemCount: itemCount,
188
- rangeBuffer: rangeBuffer,
189
- len: len
194
+ objectId,
195
+ property,
196
+ resultFlag,
197
+ itemCount,
198
+ rangeBuffer,
199
+ len
190
200
  };
191
201
  };
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ const baAsn1 = require('../asn1');
4
+ const baEnum = require('../enum');
5
+
6
+ module.exports.encode = (buffer, ttl, length = 2) => {
7
+ baAsn1.encodeUnsigned(buffer, ttl, length);
8
+ };
9
+
10
+ module.exports.decode = (buffer, offset, length = 2) => {
11
+ let len = 0;
12
+ let result = baAsn1.decodeUnsigned(buffer, offset + len, length);
13
+ len += result.len;
14
+ return {
15
+ len,
16
+ ttl: result.value,
17
+ };
18
+ };
@@ -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, state, password) => {
6
7
  baAsn1.encodeContextEnumerated(buffer, 0, state);
@@ -11,16 +12,20 @@ module.exports.encode = (buffer, state, password) => {
11
12
 
12
13
  module.exports.decode = (buffer, offset, apduLen) => {
13
14
  let len = 0;
14
- const value = {};
15
+ let value = {};
15
16
  let result;
16
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
17
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
18
+ return undefined;
19
+ }
17
20
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
18
21
  len += result.len;
19
22
  let decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
20
23
  value.state = decodedValue.value;
21
24
  len += decodedValue.len;
22
25
  if (len < apduLen) {
23
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
26
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) {
27
+ return undefined;
28
+ }
24
29
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
25
30
  len += result.len;
26
31
  decodedValue = baAsn1.decodeCharacterString(buffer, offset + len, apduLen - (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, subscriberProcessId, monitoredObjectId, cancellationRequest, issueConfirmedNotifications, lifetime) => {
6
7
  baAsn1.encodeContextUnsigned(buffer, 0, subscriberProcessId);
@@ -13,16 +14,20 @@ module.exports.encode = (buffer, subscriberProcessId, monitoredObjectId, cancell
13
14
 
14
15
  module.exports.decode = (buffer, offset, apduLen) => {
15
16
  let len = 0;
16
- const value = {};
17
+ let value = {};
17
18
  let result;
18
19
  let decodedValue;
19
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
20
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
21
+ return undefined;
22
+ }
20
23
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
21
24
  len += result.len;
22
25
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
23
26
  len += decodedValue.len;
24
27
  value.subscriberProcessId = decodedValue.value;
25
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
28
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) {
29
+ return undefined;
30
+ }
26
31
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
27
32
  len += result.len;
28
33
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
@@ -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, subscriberProcessId, monitoredObjectId, cancellationRequest, issueConfirmedNotifications, lifetime, monitoredProperty, covIncrementPresent, covIncrement) => {
7
7
  baAsn1.encodeContextUnsigned(buffer, 0, subscriberProcessId);
@@ -23,16 +23,20 @@ module.exports.encode = (buffer, subscriberProcessId, monitoredObjectId, cancell
23
23
 
24
24
  module.exports.decode = (buffer, offset) => {
25
25
  let len = 0;
26
- const value = {};
26
+ let value = {};
27
27
  let result;
28
28
  let decodedValue;
29
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
29
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
30
+ return undefined;
31
+ }
30
32
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
31
33
  len += result.len;
32
34
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
33
35
  len += decodedValue.len;
34
36
  value.subscriberProcessId = decodedValue.value;
35
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) return;
37
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 1)) {
38
+ return undefined;
39
+ }
36
40
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
37
41
  len += result.len;
38
42
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
@@ -55,10 +59,14 @@ module.exports.decode = (buffer, offset) => {
55
59
  len += decodedValue.len;
56
60
  value.lifetime = decodedValue.value;
57
61
  }
58
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 4)) return;
62
+ if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 4)) {
63
+ return undefined;
64
+ }
59
65
  len++;
60
66
  value.monitoredProperty = {};
61
- if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) return;
67
+ if (!baAsn1.decodeIsContextTag(buffer, offset + len, 0)) {
68
+ return undefined;
69
+ }
62
70
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
63
71
  len += result.len;
64
72
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
@@ -72,7 +80,9 @@ module.exports.decode = (buffer, offset) => {
72
80
  len += decodedValue.len;
73
81
  value.monitoredProperty.index = decodedValue.value;
74
82
  }
75
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 4)) return;
83
+ if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 4)) {
84
+ return undefined;
85
+ }
76
86
  len++;
77
87
  value.covIncrement = 0;
78
88
  if (baAsn1.decodeIsContextTag(buffer, offset + len, 5)) {
@@ -1,7 +1,26 @@
1
+ /**
2
+ * The timeSync event represents the request to synchronize the local time to
3
+ * the received time.
4
+ *
5
+ * @event bacnet.timeSync
6
+ * @param {date} dateTime - The time to be synchronized to.
7
+ *
8
+ * @example
9
+ * const bacnet = require('node-bacnet');
10
+ * const client = new bacnet();
11
+ *
12
+ * client.on('timeSync', (msg) => {
13
+ * console.log(
14
+ * 'address: ', msg.header.address,
15
+ * ' - dateTime: ', msg.payload.dateTime
16
+ * );
17
+ * });
18
+ */
19
+
1
20
  'use strict';
2
21
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
22
+ const baAsn1 = require('../asn1');
23
+ const baEnum = require('../enum');
5
24
 
6
25
  module.exports.encode = (buffer, time) => {
7
26
  baAsn1.encodeApplicationDate(buffer, time);
@@ -13,16 +32,20 @@ module.exports.decode = (buffer, offset, length) => {
13
32
  let result;
14
33
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
15
34
  len += result.len;
16
- if (result.tagNumber !== baEnum.ApplicationTags.DATE) return;
35
+ if (result.tagNumber !== baEnum.ApplicationTag.DATE) {
36
+ return undefined;
37
+ }
17
38
  const date = baAsn1.decodeDate(buffer, offset + len);
18
39
  len += date.len;
19
40
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
20
41
  len += result.len;
21
- if (result.tagNumber !== baEnum.ApplicationTags.TIME) return;
42
+ if (result.tagNumber !== baEnum.ApplicationTag.TIME) {
43
+ return undefined;
44
+ }
22
45
  const time = baAsn1.decodeBacnetTime(buffer, offset + len);
23
46
  len += time.len;
24
47
  return {
25
- len: len,
48
+ len,
26
49
  value: new Date(date.value.getFullYear(), date.value.getMonth(), date.value.getDate(), time.value.getHours(), time.value.getMinutes(), time.value.getSeconds(), time.value.getMilliseconds())
27
50
  };
28
51
  };
@@ -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, lowLimit, highLimit, objectId, objectName) => {
7
7
  if ((lowLimit >= 0) && (lowLimit <= baEnum.ASN1_MAX_INSTANCE) && (highLimit >= 0) && (highLimit <= baEnum.ASN1_MAX_INSTANCE)) {
@@ -17,7 +17,7 @@ module.exports.encode = (buffer, lowLimit, highLimit, objectId, objectName) => {
17
17
 
18
18
  module.exports.decode = (buffer, offset, apduLen) => {
19
19
  let len = 0;
20
- const value = {};
20
+ let value = {};
21
21
  let decodedValue;
22
22
  let result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
23
23
  len += result.len;
@@ -1,7 +1,28 @@
1
+ /**
2
+ * The whoIs event represents the request for an IAm reponse to detect all
3
+ * devices in a BACNET network.
4
+ *
5
+ * @event bacnet.whoIs
6
+ * @param {number=} lowLimit - The lowest BACnet ID being queried.
7
+ * @param {number=} highLimit - The highest BACnet ID being queried.
8
+ *
9
+ * @example
10
+ * const bacnet = require('node-bacnet');
11
+ * const client = new bacnet();
12
+ *
13
+ * client.on('whoIs', (msg) => {
14
+ * console.log(
15
+ * 'address: ', msg.header.address,
16
+ * ' - lowLimit: ', msg.payload.lowLimit,
17
+ * ' - highLimit: ', msg.payload.highLimit
18
+ * );
19
+ * });
20
+ */
21
+
1
22
  'use strict';
2
23
 
3
- const baAsn1 = require('../asn1');
4
- const baEnum = require('../enum');
24
+ const baAsn1 = require('../asn1');
25
+ const baEnum = require('../enum');
5
26
 
6
27
  module.exports.encode = (buffer, lowLimit, highLimit) => {
7
28
  if ((lowLimit >= 0) && (lowLimit <= baEnum.ASN1_MAX_INSTANCE) && (highLimit >= 0) && (highLimit <= baEnum.ASN1_MAX_INSTANCE)) {
@@ -12,22 +33,34 @@ module.exports.encode = (buffer, lowLimit, highLimit) => {
12
33
 
13
34
  module.exports.decode = (buffer, offset, apduLen) => {
14
35
  let len = 0;
15
- const value = {};
16
- if (apduLen <= 0) return {};
36
+ let value = {};
37
+ if (apduLen <= 0) {
38
+ return {}; // TODO: why??
39
+ }
17
40
  let result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
18
41
  len += result.len;
19
- if (result.tagNumber !== 0) return;
20
- if (apduLen <= len) return;
42
+ if (result.tagNumber !== 0) {
43
+ return undefined;
44
+ }
45
+ if (apduLen <= len) {
46
+ return undefined;
47
+ }
21
48
  let decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
22
49
  len += decodedValue.len;
23
50
  if (decodedValue.value <= baEnum.ASN1_MAX_INSTANCE) {
24
51
  value.lowLimit = decodedValue.value;
25
52
  }
26
- if (apduLen <= len) return;
53
+ if (apduLen <= len) {
54
+ return undefined;
55
+ }
27
56
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
28
57
  len += result.len;
29
- if (result.tagNumber !== 1) return;
30
- if (apduLen <= len) return;
58
+ if (result.tagNumber !== 1) {
59
+ return undefined;
60
+ }
61
+ if (apduLen <= len) {
62
+ return undefined;
63
+ }
31
64
  decodedValue = baAsn1.decodeUnsigned(buffer, offset + len, result.value);
32
65
  len += decodedValue.len;
33
66
  if (decodedValue.value <= baEnum.ASN1_MAX_INSTANCE) {
@@ -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
  const encode = module.exports.encode = (buffer, objectId, values) => {
7
7
  baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance);
@@ -27,28 +27,37 @@ module.exports.decode = (buffer, offset, apduLen) => {
27
27
  let len = 0;
28
28
  let result;
29
29
  let decodedValue;
30
+ let objectId;
30
31
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
31
32
  len += result.len;
32
- if ((result.tagNumber !== 0) || (apduLen <= len)) return;
33
+ if ((result.tagNumber !== 0) || (apduLen <= len)) {
34
+ return undefined;
35
+ }
33
36
  apduLen -= len;
34
- if (apduLen < 4) return;
37
+ if (apduLen < 4) {
38
+ return undefined;
39
+ }
35
40
  decodedValue = baAsn1.decodeObjectId(buffer, offset + len);
36
41
  len += decodedValue.len;
37
- const objectId = {
42
+ objectId = {
38
43
  type: decodedValue.objectType,
39
44
  instance: decodedValue.instance
40
45
  };
41
- if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) return;
46
+ if (!baAsn1.decodeIsOpeningTagNumber(buffer, offset + len, 1)) {
47
+ return undefined;
48
+ }
42
49
  len++;
43
50
  const _values = [];
44
51
  while ((apduLen - len) > 1) {
45
- const newEntry = {};
52
+ let newEntry = {};
46
53
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
47
54
  len += result.len;
48
- if (result.tagNumber !== 0) return;
55
+ if (result.tagNumber !== 0) {
56
+ return undefined;
57
+ }
49
58
  decodedValue = baAsn1.decodeEnumerated(buffer, offset + len, result.value);
50
59
  len += decodedValue.len;
51
- const propertyId = decodedValue.value;
60
+ let propertyId = decodedValue.value;
52
61
  let arrayIndex = baEnum.ASN1_ARRAY_ALL;
53
62
  result = baAsn1.decodeTagNumberAndValue(buffer, offset + len);
54
63
  len += result.len;
@@ -60,11 +69,15 @@ module.exports.decode = (buffer, offset, apduLen) => {
60
69
  len += result.len;
61
70
  }
62
71
  newEntry.property = {id: propertyId, index: arrayIndex};
63
- if ((result.tagNumber !== 2) || (!baAsn1.decodeIsOpeningTag(buffer, offset + len - 1))) return;
72
+ if ((result.tagNumber !== 2) || (!baAsn1.decodeIsOpeningTag(buffer, offset + len - 1))) {
73
+ return undefined;
74
+ }
64
75
  const values = [];
65
76
  while ((len + offset) <= buffer.length && !baAsn1.decodeIsClosingTag(buffer, offset + len)) {
66
- const value = baAsn1.bacappDecodeApplicationData(buffer, offset + len, apduLen + offset, objectId.type, propertyId);
67
- if (!value) return;
77
+ let value = baAsn1.bacappDecodeApplicationData(buffer, offset + len, apduLen + offset, objectId.type, propertyId);
78
+ if (!value) {
79
+ return undefined;
80
+ }
68
81
  len += value.len;
69
82
  delete value.len;
70
83
  values.push(value);
@@ -83,12 +96,16 @@ module.exports.decode = (buffer, offset, apduLen) => {
83
96
  }
84
97
  newEntry.priority = priority;
85
98
  _values.push(newEntry);
99
+ if (baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) {
100
+ len++;
101
+ }
102
+ }
103
+ if (baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) {
104
+ len++;
86
105
  }
87
- if (!baAsn1.decodeIsClosingTagNumber(buffer, offset + len, 1)) return;
88
- len++;
89
106
  return {
90
- len: len,
91
- objectId: objectId,
107
+ len,
108
+ objectId,
92
109
  values: _values
93
110
  };
94
111
  };