@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,1028 +0,0 @@
1
- // Util Modules
2
- var events = require('events');
3
- var debug = require('debug')('bacstack');
4
-
5
- // Local Modules
6
- var baTransport = require('./transport');
7
- var baServices = require('./services');
8
- var baAsn1 = require('./asn1');
9
- var baAdpu = require('./adpu');
10
- var baNpdu = require('./npdu');
11
- var baBvlc = require('./bvlc');
12
- var baEnum = require('./enum');
13
-
14
- /**
15
- * To be able to communicate to BACNET devices, you have to initialize a new bacstack instance.
16
- * @class bacstack
17
- * @param {object=} settings - The options object used for parameterizing the bacstack.
18
- * @param {number=} [options.port=47808] - BACNET communication port for listening and sending.
19
- * @param {string=} options.interface - Specific BACNET communication interface if different from primary one.
20
- * @param {string=} [options.broadcastAddress=255.255.255.255] - The address used for broadcast messages.
21
- * @param {number=} [options.adpuTimeout=3000] - The timeout in milliseconds until a transaction should be interpreted as error.
22
- * @example
23
- * var bacnet = require('bacstack');
24
- *
25
- * var client = new bacnet({
26
- * port: 47809, // Use BAC1 as communication port
27
- * interface: '192.168.251.10', // Listen on a specific interface
28
- * broadcastAddress: '192.168.251.255', // Use the subnet broadcast address
29
- * adpuTimeout: 6000 // Wait twice as long for response
30
- * });
31
- */
32
- module.exports = function(options) {
33
- var self = new events.EventEmitter();
34
-
35
- var DEFAULT_HOP_COUNT = 0xFF;
36
- var BVLC_HEADER_LENGTH = 4;
37
-
38
- var invokeCounter = 1;
39
- var invokeStore = {};
40
-
41
- var lastSequenceNumber = 0;
42
- var segmentStore = [];
43
-
44
- options = options || {};
45
- var settings = {
46
- port: options.port || 47808,
47
- interface: options.interface,
48
- transport: options.transport,
49
- broadcastAddress: options.broadcastAddress || '255.255.255.255',
50
- adpuTimeout: options.adpuTimeout || 3000
51
- };
52
-
53
- var transport = settings.transport || new baTransport({
54
- port: settings.port,
55
- interface: settings.interface,
56
- broadcastAddress: settings.broadcastAddress
57
- });
58
-
59
- // Helper utils
60
- var getInvokeId = function() {
61
- var id = invokeCounter++;
62
- if (id >= 256) invokeCounter = 1;
63
- return id - 1;
64
- };
65
-
66
- var invokeCallback = function(id, err, result) {
67
- var callback = invokeStore[id];
68
- if (callback) return callback(err, result);
69
- debug('InvokeId ', id, ' not found -> drop package');
70
- };
71
-
72
- var addCallback = function(id, callback) {
73
- var timeout = setTimeout(function() {
74
- delete invokeStore[id];
75
- callback(new Error('ERR_TIMEOUT'));
76
- }, settings.adpuTimeout);
77
- invokeStore[id] = function(err, data) {
78
- clearTimeout(timeout);
79
- delete invokeStore[id];
80
- callback(err, data);
81
- };
82
- };
83
-
84
- var getBuffer = function() {
85
- return {
86
- buffer: Buffer.alloc(transport.getMaxPayload()),
87
- offset: BVLC_HEADER_LENGTH
88
- };
89
- };
90
-
91
- // Service Handlers
92
- var processError = function(invokeId, buffer, offset, length) {
93
- var result = baServices.decodeError(buffer, offset, length);
94
- if (!result) return debug('Couldn`t decode Error');
95
- invokeCallback(invokeId, new Error('BacnetError - Class:' + result.class + ' - Code:' + result.code));
96
- };
97
-
98
- var processAbort = function(invokeId, reason) {
99
- invokeCallback(invokeId, new Error('BacnetAbort - Reason:' + reason));
100
- };
101
-
102
- var segmentAckResponse = function(receiver, negative, server, originalInvokeId, sequencenumber, actualWindowSize) {
103
- var buffer = getBuffer();
104
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE, receiver, null, DEFAULT_HOP_COUNT, baEnum.NetworkMessageTypes.NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK, 0);
105
- baAdpu.encodeSegmentAck(buffer, baEnum.PduTypes.PDU_TYPE_SEGMENT_ACK | (negative ? baEnum.PduTypes.NEGATIVE_ACK : 0) | (server ? baEnum.PduTypes.SERVER : 0), originalInvokeId, sequencenumber, actualWindowSize);
106
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
107
- transport.send(buffer.buffer, buffer.offset, receiver);
108
- };
109
-
110
- var performDefaultSegmentHandling = function(sender, adr, type, service, invokeId, maxSegments, maxAdpu, sequencenumber, first, moreFollows, buffer, offset, length) {
111
- if (first) {
112
- segmentStore = [];
113
- type &= ~baEnum.PduTypes.SEGMENTED_MESSAGE;
114
- var adpuHeaderLen = 3;
115
- if ((type & baEnum.PduTypes.PDU_TYPE_MASK) === baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST) {
116
- adpuHeaderLen = 4;
117
- }
118
- var adpubuffer = getBuffer();
119
- adpubuffer.offset = 0;
120
- buffer.copy(adpubuffer.buffer, adpuHeaderLen, offset, offset + length);
121
- if ((type & baEnum.PduTypes.PDU_TYPE_MASK) === baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST) {
122
- baAdpu.encodeConfirmedServiceRequest(adpubuffer, type, service, maxSegments, maxAdpu, invokeId, 0, 0);
123
- } else {
124
- baAdpu.encodeComplexAck(adpubuffer, type, service, invokeId, 0, 0);
125
- }
126
- segmentStore.push(adpubuffer.buffer.slice(0, length + adpuHeaderLen));
127
- } else {
128
- segmentStore.push(buffer.slice(offset, offset + length));
129
- }
130
- if (!moreFollows) {
131
- var apduBuffer = Buffer.concat(segmentStore);
132
- segmentStore = [];
133
- type &= ~baEnum.PduTypes.SEGMENTED_MESSAGE;
134
- handlePdu(adr, type, apduBuffer, 0, apduBuffer.length);
135
- }
136
- };
137
-
138
- var processSegment = function(receiver, type, service, invokeId, maxSegments, maxAdpu, server, sequencenumber, proposedWindowNumber, buffer, offset, length) {
139
- var first = false;
140
- if (sequencenumber === 0 && lastSequenceNumber === 0) {
141
- first = true;
142
- } else {
143
- if (sequencenumber !== lastSequenceNumber + 1) {
144
- return segmentAckResponse(receiver, true, server, invokeId, lastSequenceNumber, proposedWindowNumber);
145
- }
146
- }
147
- lastSequenceNumber = sequencenumber;
148
- var moreFollows = ((type & baEnum.PduTypes.MORE_FOLLOWS) === baEnum.PduTypes.MORE_FOLLOWS);
149
- if (!moreFollows) {
150
- lastSequenceNumber = 0;
151
- }
152
- if ((sequencenumber % proposedWindowNumber) === 0 || !moreFollows) {
153
- segmentAckResponse(receiver, false, server, invokeId, sequencenumber, proposedWindowNumber);
154
- }
155
- performDefaultSegmentHandling(this, receiver, type, service, invokeId, maxSegments, maxAdpu, sequencenumber, first, moreFollows, buffer, offset, length);
156
- };
157
-
158
- var processConfirmedServiceRequest = function(address, type, service, maxSegments, maxAdpu, invokeId, buffer, offset, length) {
159
- var result;
160
- debug('Handle processConfirmedServiceRequest');
161
- if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_READ_PROPERTY) {
162
- result = baServices.decodeReadProperty(buffer, offset, length);
163
- if (!result) return debug('Received invalid readProperty message');
164
- self.emit('readProperty', {address: address, invokeId: invokeId, request: result});
165
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_WRITE_PROPERTY) {
166
- result = baServices.decodeWriteProperty(buffer, offset, length);
167
- if (!result) return debug('Received invalid writeProperty message');
168
- self.emit('writeProperty', {address: address, invokeId: invokeId, request: result});
169
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_READ_PROP_MULTIPLE) {
170
- result = baServices.decodeReadPropertyMultiple(buffer, offset, length);
171
- if (!result) return debug('Received invalid readPropertyMultiple message');
172
- self.emit('readPropertyMultiple', {address: address, invokeId: invokeId, request: result});
173
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_WRITE_PROP_MULTIPLE) {
174
- result = baServices.decodeWritePropertyMultiple(buffer, offset, length);
175
- if (!result) return debug('Received invalid writePropertyMultiple message');
176
- self.emit('writePropertyMultiple', {address: address, invokeId: invokeId, request: result});
177
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_COV_NOTIFICATION) {
178
- result = baServices.decodeCOVNotify(buffer, offset, length);
179
- if (!result) return debug('Received invalid covNotify message');
180
- self.emit('covNotify', {address: address, invokeId: invokeId, request: result});
181
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_ATOMIC_WRITE_FILE) {
182
- result = baServices.decodeAtomicWriteFile(buffer, offset, length);
183
- if (!result) return debug('Received invalid atomicWriteFile message');
184
- self.emit('atomicWriteFile', {address: address, invokeId: invokeId, request: result});
185
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_ATOMIC_READ_FILE) {
186
- result = baServices.decodeAtomicReadFile(buffer, offset, length);
187
- if (!result) return debug('Received invalid atomicReadFile message');
188
- self.emit('atomicReadFile', {address: address, invokeId: invokeId, request: result});
189
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_SUBSCRIBE_COV) {
190
- result = baServices.decodeSubscribeCOV(buffer, offset, length);
191
- if (!result) return debug('Received invalid subscribeCOV message');
192
- self.emit('subscribeCOV', {address: address, invokeId: invokeId, request: result});
193
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY) {
194
- result = baServices.decodeSubscribeProperty(buffer, offset, length);
195
- if (!result) return debug('Received invalid subscribeProperty message');
196
- self.emit('subscribeProperty', {address: address, invokeId: invokeId, request: result});
197
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL) {
198
- result = baServices.decodeDeviceCommunicationControl(buffer, offset, length);
199
- if (!result) return debug('Received invalid deviceCommunicationControl message');
200
- self.emit('deviceCommunicationControl', {address: address, invokeId: invokeId, request: result});
201
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_REINITIALIZE_DEVICE) {
202
- result = baServices.decodeReinitializeDevice(buffer, offset, length);
203
- if (!result) return debug('Received invalid reinitializeDevice message');
204
- self.emit('reinitializeDevice', {address: address, invokeId: invokeId, request: result});
205
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_EVENT_NOTIFICATION) {
206
- result = baServices.decodeEventNotifyData(buffer, offset, length);
207
- if (!result) return debug('Received invalid eventNotifyData message');
208
- self.emit('eventNotifyData', {address: address, invokeId: invokeId, request: result});
209
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_READ_RANGE) {
210
- result = baServices.decodeReadRange(buffer, offset, length);
211
- if (!result) return debug('Received invalid readRange message');
212
- self.emit('readRange', {address: address, invokeId: invokeId, request: result});
213
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_CREATE_OBJECT) {
214
- result = baServices.decodeCreateObject(buffer, offset, length);
215
- if (!result) return debug('Received invalid createObject message');
216
- self.emit('createObject', {address: address, invokeId: invokeId, request: result});
217
- } else if (service === baEnum.ConfirmedServices.SERVICE_CONFIRMED_DELETE_OBJECT) {
218
- result = baServices.decodeDeleteObject(buffer, offset, length);
219
- if (!result) return debug('Received invalid deleteObject message');
220
- self.emit('deleteObject', {address: address, invokeId: invokeId, request: result});
221
- } else {
222
- debug('Received unsupported confirmed service request');
223
- }
224
- };
225
-
226
- var processUnconfirmedServiceRequest = function(address, type, service, buffer, offset, length) {
227
- var result;
228
- debug('Handle processUnconfirmedServiceRequest');
229
- if (service === baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_I_AM) {
230
- result = baServices.decodeIamBroadcast(buffer, offset);
231
- if (!result) return debug('Received invalid iAm message');
232
-
233
- /**
234
- * @event bacstack.iAm
235
- * @param {object} device - An object representing the detected device.
236
- * @param {string} device.address - The IP address of the detected device.
237
- * @param {number} device.deviceId - The BACNET device-id of the detected device.
238
- * @param {number} device.maxAdpu - The max ADPU size the detected device is supporting.
239
- * @param {number} device.segmentation - The type of segmentation the detected device is supporting.
240
- * @param {number} device.vendorId - The BACNET vendor-id of the detected device.
241
- * @example
242
- * var bacnet = require('bacstack');
243
- * var client = new bacnet();
244
- *
245
- * client.on('iAm', function(device) {
246
- * console.log('address: ', device.address, ' - deviceId: ', device.deviceId, ' - maxAdpu: ', device.maxAdpu, ' - segmentation: ', device.segmentation, ' - vendorId: ', device.vendorId);
247
- * });
248
- */
249
- self.emit('iAm', {address: address, deviceId: result.deviceId, maxApdu: result.maxApdu, segmentation: result.segmentation, vendorId: result.vendorId});
250
- } else if (service === baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_WHO_IS) {
251
- result = baServices.decodeWhoIsBroadcast(buffer, offset, length);
252
- if (!result) return debug('Received invalid WhoIs message');
253
- self.emit('whoIs', {address: address, lowLimit: result.lowLimit, highLimit: result.highLimit});
254
- } else if (service === baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_WHO_HAS) {
255
- result = baServices.decodeWhoHasBroadcast(buffer, offset, length);
256
- if (!result) return debug('Received invalid WhoHas message');
257
- self.emit('whoHas', {address: address, lowLimit: result.lowLimit, highLimit: result.highLimit, objectId: result.objectId, objectName: result.objectName});
258
- } else if (service === baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_COV_NOTIFICATION) {
259
- result = baServices.decodeCOVNotify(buffer, offset, length);
260
- if (!result) return debug('Received invalid covNotifyUnconfirmed message');
261
- self.emit('covNotifyUnconfirmed', {address: address, request: result});
262
- } else if (service === baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_TIME_SYNCHRONIZATION) {
263
- result = baServices.decodeTimeSync(buffer, offset, length);
264
- if (!result) return debug('Received invalid TimeSync message');
265
- self.emit('timeSync', {address: address, dateTime: result.dateTime});
266
- } else if (service === baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION) {
267
- result = baServices.decodeTimeSync(buffer, offset, length);
268
- if (!result) return debug('Received invalid TimeSyncUTC message');
269
- self.emit('timeSyncUTC', {address: address, dateTime: result.dateTime});
270
- } else if (service === baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_EVENT_NOTIFICATION) {
271
- result = baServices.decodeEventNotifyData(buffer, offset, length);
272
- if (!result) return debug('Received invalid EventNotify message');
273
- self.emit('eventNotify', {address: address, eventData: result.eventData});
274
- } else {
275
- debug('Received unsupported unconfirmed service request');
276
- }
277
- };
278
-
279
- var handlePdu = function(address, type, buffer, offset, length) {
280
- var result;
281
- // Handle different PDU types
282
- switch (type & baEnum.PduTypes.PDU_TYPE_MASK) {
283
- case baEnum.PduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST:
284
- result = baAdpu.decodeUnconfirmedServiceRequest(buffer, offset);
285
- processUnconfirmedServiceRequest(address, result.type, result.service, buffer, offset + result.len, length - result.len);
286
- break;
287
- case baEnum.PduTypes.PDU_TYPE_SIMPLE_ACK:
288
- result = baAdpu.decodeSimpleAck(buffer, offset);
289
- offset += result.len;
290
- length -= result.len;
291
- invokeCallback(result.invokeId, null, {result: result, buffer: buffer, offset: offset + result.len, length: length - result.len});
292
- break;
293
- case baEnum.PduTypes.PDU_TYPE_COMPLEX_ACK:
294
- result = baAdpu.decodeComplexAck(buffer, offset);
295
- if ((type & baEnum.PduTypes.SEGMENTED_MESSAGE) === 0) {
296
- invokeCallback(result.invokeId, null, {result: result, buffer: buffer, offset: offset + result.len, length: length - result.len});
297
- } else {
298
- processSegment(address, result.type, result.service, result.invokeId, baEnum.MaxSegments.MAX_SEG0, baEnum.MaxAdpu.MAX_APDU50, false, result.sequencenumber, result.proposedWindowNumber, buffer, offset + result.len, length - result.len);
299
- }
300
- break;
301
- case baEnum.PduTypes.PDU_TYPE_SEGMENT_ACK:
302
- result = baAdpu.decodeSegmentAck(buffer, offset);
303
- //m_last_segment_ack.Set(address, result.originalInvokeId, result.sequencenumber, result.actualWindowSize);
304
- //processSegmentAck(address, result.type, result.originalInvokeId, result.sequencenumber, result.actualWindowSize, buffer, offset + result.len, length - result.len);
305
- break;
306
- case baEnum.PduTypes.PDU_TYPE_ERROR:
307
- result = baAdpu.decodeError(buffer, offset);
308
- processError(result.invokeId, buffer, offset + result.len, length - result.len);
309
- break;
310
- case baEnum.PduTypes.PDU_TYPE_REJECT:
311
- case baEnum.PduTypes.PDU_TYPE_ABORT:
312
- result = baAdpu.decodeAbort(buffer, offset);
313
- processAbort(result.invokeId, result.reason);
314
- break;
315
- case baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST:
316
- result = baAdpu.decodeConfirmedServiceRequest(buffer, offset);
317
- if ((type & baEnum.PduTypes.SEGMENTED_MESSAGE) === 0) {
318
- processConfirmedServiceRequest(address, result.type, result.service, result.maxSegments, result.maxAdpu, result.invokeId, buffer, offset + result.len, length - result.len);
319
- } else {
320
- processSegment(address, result.type, result.service, result.invokeId, result.maxSegments, result.maxAdpu, true, result.sequencenumber, result.proposedWindowNumber, buffer, offset + result.len, length - result.len);
321
- }
322
- break;
323
- default:
324
- debug('Received unknown PDU type -> Drop package');
325
- break;
326
- }
327
- };
328
-
329
- var handleNpdu = function(buffer, offset, msgLength, remoteAddress) {
330
- // Check data length
331
- if (msgLength <= 0) return debug('No NPDU data -> Drop package');
332
- // Parse baNpdu header
333
- var result = baNpdu.decode(buffer, offset);
334
- if (!result) return debug('Received invalid NPDU header -> Drop package');
335
- if ((result.funct & baEnum.NpduControls.NETWORK_LAYER_MESSAGE) === baEnum.NpduControls.NETWORK_LAYER_MESSAGE) {
336
- return debug('Received network layer message -> Drop package');
337
- }
338
- offset += result.len;
339
- msgLength -= result.len;
340
- if (msgLength <= 0) return debug('No APDU data -> Drop package');
341
- var apduType = baAdpu.getDecodedType(buffer, offset);
342
- handlePdu(remoteAddress, apduType, buffer, offset, msgLength);
343
- };
344
-
345
- var receiveData = self.receiveData = function(buffer, remoteAddress) {
346
- // Check data length
347
- if (buffer.length < baBvlc.BVLC_HEADER_LENGTH) return debug('Received invalid data -> Drop package');
348
- // Parse BVLC header
349
- var result = baBvlc.decode(buffer, 0);
350
- if (!result) return debug('Received invalid BVLC header -> Drop package');
351
- // Check BVLC function
352
- if (result.func === baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU || result.func === baEnum.BvlcFunctions.BVLC_ORIGINAL_BROADCAST_NPDU || result.func === baEnum.BvlcFunctions.BVLC_FORWARDED_NPDU) {
353
- handleNpdu(buffer, result.len, buffer.length - result.len, remoteAddress);
354
- } else {
355
- debug('Received unknown BVLC function -> Drop package');
356
- }
357
- };
358
-
359
- var receiveError = function(err) {
360
-
361
- /**
362
- * @event bacstack.error
363
- * @param {error} err - The IP address of the detected device.
364
- * @example
365
- * var bacnet = require('bacstack');
366
- * var client = new bacnet();
367
- *
368
- * client.on('error', function(err) {
369
- * console.log('Error occurred: ', err);
370
- * client.close();
371
- * });
372
- */
373
- self.emit('error', err);
374
- };
375
-
376
- /**
377
- * The whoIs command discovers all BACNET devices in a network.
378
- * @function bacstack.whoIs
379
- * @param {object=} options
380
- * @param {number=} options.lowLimit - Minimal device instance number to search for.
381
- * @param {number=} options.highLimit - Maximal device instance number to search for.
382
- * @param {string=} options.address - Unicast address if command should address a device directly.
383
- * @fires bacstack.iAm
384
- * @example
385
- * var bacnet = require('bacstack');
386
- * var client = new bacnet();
387
- *
388
- * client.whoIs();
389
- */
390
- self.whoIs = function(options) {
391
- options = options || {};
392
- var settings = {
393
- lowLimit: options.lowLimit,
394
- highLimit: options.highLimit,
395
- address: options.address || transport.getBroadcastAddress()
396
- };
397
- var buffer = getBuffer();
398
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE, settings.address, null, DEFAULT_HOP_COUNT, baEnum.NetworkMessageTypes.NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK, 0);
399
- baAdpu.encodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST, baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_WHO_IS);
400
- baServices.encodeWhoIsBroadcast(buffer, settings.lowLimit, settings.highLimit);
401
- var npduType = (settings.address !== transport.getBroadcastAddress()) ? baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU : baEnum.BvlcFunctions.BVLC_ORIGINAL_BROADCAST_NPDU;
402
- baBvlc.encode(buffer.buffer, npduType, buffer.offset);
403
- transport.send(buffer.buffer, buffer.offset, settings.address);
404
- };
405
-
406
- /**
407
- * The timeSync command sets the time of a target device.
408
- * @function bacstack.timeSync
409
- * @param {string} address - IP address of the target device.
410
- * @param {date} dateTime - The date and time to set on the target device.
411
- * @example
412
- * var bacnet = require('bacstack');
413
- * var client = new bacnet();
414
- *
415
- * client.timeSync('192.168.1.43', new Date());
416
- */
417
- self.timeSync = function(address, dateTime) {
418
- var buffer = getBuffer();
419
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE, address);
420
- baAdpu.encodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST, baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_TIME_SYNCHRONIZATION);
421
- baServices.encodeTimeSync(buffer, dateTime);
422
- var npduType = (address !== transport.getBroadcastAddress()) ? baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU : baEnum.BvlcFunctions.BVLC_ORIGINAL_BROADCAST_NPDU;
423
- baBvlc.encode(buffer.buffer, npduType, buffer.offset);
424
- transport.send(buffer.buffer, buffer.offset, address);
425
- };
426
-
427
- /**
428
- * The timeSyncUTC command sets the UTC time of a target device.
429
- * @function bacstack.timeSyncUTC
430
- * @param {string} address - IP address of the target device.
431
- * @param {date} dateTime - The date and time to set on the target device.
432
- * @example
433
- * var bacnet = require('bacstack');
434
- * var client = new bacnet();
435
- *
436
- * client.timeSyncUTC('192.168.1.43', new Date());
437
- */
438
- self.timeSyncUTC = function(address, dateTime) {
439
- var buffer = getBuffer();
440
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE, address);
441
- baAdpu.encodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST, baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_UTC_TIME_SYNCHRONIZATION);
442
- baServices.encodeTimeSync(buffer, dateTime);
443
- var npduType = (address !== transport.getBroadcastAddress()) ? baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU : baEnum.BvlcFunctions.BVLC_ORIGINAL_BROADCAST_NPDU;
444
- baBvlc.encode(buffer.buffer, npduType, buffer.offset);
445
- transport.send(buffer.buffer, buffer.offset, address);
446
- };
447
-
448
- /**
449
- * The readProperty command reads a single property of an object from a device.
450
- * @function bacstack.readProperty
451
- * @param {string} address - IP address of the target device.
452
- * @param {object} objectId - The BACNET object ID to read.
453
- * @param {number} objectId.type - The BACNET object type to read.
454
- * @param {number} objectId.instance - The BACNET object instance to read.
455
- * @param {number} propertyId - The BACNET property id in the specified object to read.
456
- * @param {object=} options
457
- * @param {MaxSegments=} options.maxSegments - The maximimal allowed number of segments.
458
- * @param {MaxAdpu=} options.maxAdpu - The maximal allowed ADPU size.
459
- * @param {number=} options.invokeId - The invoke ID of the confirmed service telegram.
460
- * @param {number=} options.arrayIndex - The array index of the property to be read.
461
- * @param {function} next - The callback containing an error, in case of a failure and value object in case of success.
462
- * @example
463
- * var bacnet = require('bacstack');
464
- * var client = new bacnet();
465
- *
466
- * client.readProperty('192.168.1.43', {type: 8, instance: 44301}, 28, function(err, value) {
467
- * console.log('value: ', value);
468
- * });
469
- */
470
- self.readProperty = function(address, objectId, propertyId, options, next) {
471
- next = next || options;
472
- var settings = {
473
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
474
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
475
- invokeId: options.invokeId || getInvokeId(),
476
- arrayIndex: options.arrayIndex || baAsn1.BACNET_ARRAY_ALL
477
- };
478
- var buffer = getBuffer();
479
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address, null, DEFAULT_HOP_COUNT, baEnum.NetworkMessageTypes.NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK, 0);
480
- var type = baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST | (settings.maxSegments !== baEnum.MaxSegments.MAX_SEG0 ? baEnum.PduTypes.SEGMENTED_RESPONSE_ACCEPTED : 0);
481
- baAdpu.encodeConfirmedServiceRequest(buffer, type, baEnum.ConfirmedServices.SERVICE_CONFIRMED_READ_PROPERTY, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
482
- baServices.encodeReadProperty(buffer, objectId.type, objectId.instance, propertyId, settings.arrayIndex);
483
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
484
- transport.send(buffer.buffer, buffer.offset, address);
485
- addCallback(settings.invokeId, function(err, data) {
486
- if (err) return next(err);
487
- var result = baServices.decodeReadPropertyAcknowledge(data.buffer, data.offset, data.length);
488
- if (!result) return next(new Error('INVALID_DECODING'));
489
- next(null, result);
490
- });
491
- };
492
-
493
- /**
494
- * The writeProperty command writes a single property of an object to a device.
495
- * @function bacstack.writeProperty
496
- * @param {string} address - IP address of the target device.
497
- * @param {object} objectId - The BACNET object ID to write.
498
- * @param {number} objectId.type - The BACNET object type to write.
499
- * @param {number} objectId.instance - The BACNET object instance to write.
500
- * @param {number} propertyId - The BACNET property id in the specified object to write.
501
- * @param {object[]} values - A list of values to be written to the specified property.
502
- * @param {ApplicationTags} values.tag - The data-type of the value to be written.
503
- * @param {number} values.value - The actual value to be written.
504
- * @param {object=} options
505
- * @param {MaxSegments=} options.maxSegments - The maximimal allowed number of segments.
506
- * @param {MaxAdpu=} options.maxAdpu - The maximal allowed ADPU size.
507
- * @param {number=} options.invokeId - The invoke ID of the confirmed service telegram.
508
- * @param {number=} options.arrayIndex - The array index of the property to be read.
509
- * @param {number=} options.priority - The priority of the value to be written.
510
- * @param {function} next - The callback containing an error, in case of a failure and value object in case of success.
511
- * @example
512
- * var bacnet = require('bacstack');
513
- * var client = new bacnet();
514
- *
515
- * client.writeProperty('192.168.1.43', {type: 8, instance: 44301}, 28, [
516
- * {type: bacnet.enum.ApplicationTags.BACNET_APPLICATION_TAG_REAL, value: 100}
517
- * ], function(err, value) {
518
- * console.log('value: ', value);
519
- * });
520
- */
521
- self.writeProperty = function(address, objectId, propertyId, values, options, next) {
522
- next = next || options;
523
- var settings = {
524
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
525
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
526
- invokeId: options.invokeId || getInvokeId(),
527
- arrayIndex: options.arrayIndex || baAsn1.BACNET_ARRAY_ALL,
528
- priority: options.priority
529
- };
530
- var buffer = getBuffer();
531
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address, null, DEFAULT_HOP_COUNT, baEnum.NetworkMessageTypes.NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK, 0);
532
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_WRITE_PROPERTY, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
533
- baServices.encodeWriteProperty(buffer, objectId.type, objectId.instance, propertyId, settings.arrayIndex, settings.priority, values);
534
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
535
- transport.send(buffer.buffer, buffer.offset, address);
536
- addCallback(settings.invokeId, function(err, data) {
537
- next(err);
538
- });
539
- };
540
-
541
- /**
542
- * The readPropertyMultiple command reads multiple properties in multiple objects from a device.
543
- * @function bacstack.readPropertyMultiple
544
- * @param {string} address - IP address of the target device.
545
- * @param {object[]} requestArray - List of object and property specifications to be read.
546
- * @param {object} requestArray.objectId - Specifies which object to read.
547
- * @param {number} requestArray.objectId.type - The BACNET object type to read.
548
- * @param {number} requestArray.objectId.instance - The BACNET object instance to read.
549
- * @param {object[]} requestArray.properties - List of properties to be read.
550
- * @param {number} requestArray.properties.id - The BACNET property id in the specified object to read. Also supports 8 for all properties.
551
- * @param {object=} options
552
- * @param {MaxSegments=} options.maxSegments - The maximimal allowed number of segments.
553
- * @param {MaxAdpu=} options.maxAdpu - The maximal allowed ADPU size.
554
- * @param {number=} options.invokeId - The invoke ID of the confirmed service telegram.
555
- * @param {function} next - The callback containing an error, in case of a failure and value object in case of success.
556
- * @example
557
- * var bacnet = require('bacstack');
558
- * var client = new bacnet();
559
- *
560
- * var requestArray = [
561
- * {objectId: {type: 8, instance: 4194303}, properties: [{id: 8}]}
562
- * ];
563
- * client.readPropertyMultiple('192.168.1.43', requestArray, function(err, value) {
564
- * console.log('value: ', value);
565
- * });
566
- */
567
- self.readPropertyMultiple = function(address, propertiesArray, options, next) {
568
- next = next || options;
569
- var settings = {
570
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
571
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
572
- invokeId: options.invokeId || getInvokeId()
573
- };
574
- var buffer = getBuffer();
575
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address, null, DEFAULT_HOP_COUNT, baEnum.NetworkMessageTypes.NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK, 0);
576
- var type = baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST | (baEnum.maxSegments !== baEnum.MaxSegments.MAX_SEG0 ? baEnum.PduTypes.SEGMENTED_RESPONSE_ACCEPTED : 0);
577
- baAdpu.encodeConfirmedServiceRequest(buffer, type, baEnum.ConfirmedServices.SERVICE_CONFIRMED_READ_PROP_MULTIPLE, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
578
- baServices.encodeReadPropertyMultiple(buffer, propertiesArray);
579
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
580
- transport.send(buffer.buffer, buffer.offset, address);
581
- addCallback(settings.invokeId, function(err, data) {
582
- if (err) return next(err);
583
- var result = baServices.decodeReadPropertyMultipleAcknowledge(data.buffer, data.offset, data.length);
584
- if (!result) return next(new Error('INVALID_DECODING'));
585
- next(null, result);
586
- });
587
- };
588
-
589
- /**
590
- * The writePropertyMultiple command writes multiple properties in multiple objects to a device.
591
- * @function bacstack.writePropertyMultiple
592
- * @param {string} address - IP address of the target device.
593
- * @param {object[]} values - List of object and property specifications to be written.
594
- * @param {object} values.objectId - Specifies which object to read.
595
- * @param {number} values.objectId.type - The BACNET object type to read.
596
- * @param {number} values.objectId.instance - The BACNET object instance to read.
597
- * @param {object[]} values.values - List of properties to be written.
598
- * @param {object} values.values.property - Property specifications to be written.
599
- * @param {number} values.values.property.id - The BACNET property id in the specified object to write.
600
- * @param {number} values.values.property.index - The array index of the property to be written.
601
- * @param {object[]} values.values.value - A list of values to be written to the specified property.
602
- * @param {ApplicationTags} values.values.value.tag - The data-type of the value to be written.
603
- * @param {object} values.values.value.value - The actual value to be written.
604
- * @param {number} values.values.priority - The priority to be used for writing to the property.
605
- * @param {object=} options
606
- * @param {MaxSegments=} options.maxSegments - The maximimal allowed number of segments.
607
- * @param {MaxAdpu=} options.maxAdpu - The maximal allowed ADPU size.
608
- * @param {number=} options.invokeId - The invoke ID of the confirmed service telegram.
609
- * @param {function} next - The callback containing an error, in case of a failure and value object in case of success.
610
- * @example
611
- * var bacnet = require('bacstack');
612
- * var client = new bacnet();
613
- *
614
- * var values = [
615
- * {objectId: {type: 8, instance: 44301}, values: [
616
- * {property: {id: 28, index: 12}, value: [{type: bacnet.enum.ApplicationTags.BACNET_APPLICATION_TAG_BOOLEAN, value: true}], priority: 8}
617
- * ]}
618
- * ];
619
- * client.writePropertyMultiple('192.168.1.43', values, function(err, value) {
620
- * console.log('value: ', value);
621
- * });
622
- */
623
- self.writePropertyMultiple = function(address, values, options, next) {
624
- next = next || options;
625
- var settings = {
626
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
627
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
628
- invokeId: options.invokeId || getInvokeId()
629
- };
630
- var buffer = getBuffer();
631
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
632
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_WRITE_PROP_MULTIPLE, settings.maxSegments, settings.maxAdpu, settings.invokeId);
633
- baServices.encodeWriteObjectMultiple(buffer, values);
634
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
635
- transport.send(buffer.buffer, buffer.offset, address);
636
- addCallback(settings.invokeId, function(err, data) {
637
- next(err);
638
- });
639
- };
640
-
641
- /**
642
- * The deviceCommunicationControl command enables or disables network communication of the target device.
643
- * @function bacstack.deviceCommunicationControl
644
- * @param {string} address - IP address of the target device.
645
- * @param {number} timeDuration - The time to hold the network communication state in seconds. 0 for infinite.
646
- * @param {EnableDisable} enableDisable - The network communication state to set.
647
- * @param {object=} options
648
- * @param {MaxSegments=} options.maxSegments - The maximimal allowed number of segments.
649
- * @param {MaxAdpu=} options.maxAdpu - The maximal allowed ADPU size.
650
- * @param {number=} options.invokeId - The invoke ID of the confirmed service telegram.
651
- * @param {string=} options.password - The optional password used to set the network communication state.
652
- * @param {function} next - The callback containing an error, in case of a failure and value object in case of success.
653
- * @example
654
- * var bacnet = require('bacstack');
655
- * var client = new bacnet();
656
- *
657
- * client.deviceCommunicationControl('192.168.1.43', 0, bacnet.enum.EnableDisable.DISABLE, function(err, value) {
658
- * console.log('value: ', value);
659
- * });
660
- */
661
- self.deviceCommunicationControl = function(address, timeDuration, enableDisable, options, next) {
662
- next = next || options;
663
- var settings = {
664
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
665
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
666
- invokeId: options.invokeId || getInvokeId(),
667
- password: options.password
668
- };
669
- var buffer = getBuffer();
670
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
671
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
672
- baServices.encodeDeviceCommunicationControl(buffer, timeDuration, enableDisable, settings.password);
673
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
674
- transport.send(buffer.buffer, buffer.offset, address);
675
- addCallback(settings.invokeId, function(err, data) {
676
- next(err);
677
- });
678
- };
679
-
680
- /**
681
- * The reinitializeDevice command initiates a restart of the target device.
682
- * @function bacstack.reinitializeDevice
683
- * @param {string} address - IP address of the target device.
684
- * @param {ReinitializedStates} state - The type of restart to be initiated.
685
- * @param {object=} options
686
- * @param {MaxSegments=} options.maxSegments - The maximimal allowed number of segments.
687
- * @param {MaxAdpu=} options.maxAdpu - The maximal allowed ADPU size.
688
- * @param {number=} options.invokeId - The invoke ID of the confirmed service telegram.
689
- * @param {string=} options.password - The optional password used to restart the device.
690
- * @param {function} next - The callback containing an error, in case of a failure and value object in case of success.
691
- * @example
692
- * var bacnet = require('bacstack');
693
- * var client = new bacnet();
694
- *
695
- * client.reinitializeDevice('192.168.1.43', bacnet.enum.ReinitializedStates.BACNET_REINIT_COLDSTART, function(err, value) {
696
- * console.log('value: ', value);
697
- * });
698
- */
699
- self.reinitializeDevice = function(address, state, options, next) {
700
- next = next || options;
701
- var settings = {
702
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
703
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
704
- invokeId: options.invokeId || getInvokeId(),
705
- password: options.password
706
- };
707
- var buffer = getBuffer();
708
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
709
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_REINITIALIZE_DEVICE, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
710
- baServices.encodeReinitializeDevice(buffer, state, settings.password);
711
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
712
- transport.send(buffer.buffer, buffer.offset, address);
713
- addCallback(settings.invokeId, function(err, data) {
714
- next(err);
715
- });
716
- };
717
-
718
- self.writeFile = function(address, objectId, position, count, fileBuffer, options, next) {
719
- next = next || options;
720
- var settings = {
721
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
722
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
723
- invokeId: options.invokeId || getInvokeId()
724
- };
725
- var buffer = getBuffer();
726
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
727
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_ATOMIC_WRITE_FILE, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
728
- baServices.encodeAtomicWriteFile(buffer, true, objectId, position, 1, fileBuffer, count);
729
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
730
- transport.send(buffer.buffer, buffer.offset, address);
731
- addCallback(settings.invokeId, function(err, data) {
732
- if (err) return next(err);
733
- var result = baServices.decodeAtomicWriteFileAcknowledge(data.buffer, data.offset, data.length);
734
- if (!result) return next(new Error('INVALID_DECODING'));
735
- next(null, result);
736
- });
737
- };
738
-
739
- self.readFile = function(address, objectId, position, count, options, next) {
740
- next = next || options;
741
- var settings = {
742
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
743
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
744
- invokeId: options.invokeId || getInvokeId()
745
- };
746
- var buffer = getBuffer();
747
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
748
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_ATOMIC_READ_FILE, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
749
- baServices.encodeAtomicReadFile(buffer, true, objectId, position, count);
750
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
751
- transport.send(buffer.buffer, buffer.offset, address);
752
- addCallback(settings.invokeId, function(err, data) {
753
- if (err) return next(err);
754
- var result = baServices.decodeAtomicReadFileAcknowledge(data.buffer, data.offset, data.length);
755
- if (!result) return next(new Error('INVALID_DECODING'));
756
- next(null, result);
757
- });
758
- };
759
-
760
- self.readRange = function(address, objectId, idxBegin, quantity, options, next) {
761
- next = next || options;
762
- var settings = {
763
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
764
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
765
- invokeId: options.invokeId || getInvokeId()
766
- };
767
- var buffer = getBuffer();
768
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
769
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_READ_RANGE, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
770
- baServices.encodeReadRange(buffer, objectId, baEnum.PropertyIds.PROP_LOG_BUFFER, baAsn1.BACNET_ARRAY_ALL, baEnum.ReadRangeRequestTypes.RR_BY_POSITION, idxBegin, new Date(), quantity);
771
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
772
- transport.send(buffer.buffer, buffer.offset, address);
773
- addCallback(settings.invokeId, function(err, data) {
774
- if (err) return next(err);
775
- var result = baServices.decodeReadRangeAcknowledge(data.buffer, data.offset, data.length);
776
- if (!result) return next(new Error('INVALID_DECODING'));
777
- next(null, result);
778
- });
779
- };
780
-
781
- self.subscribeCOV = function(address, objectId, subscribeId, cancel, issueConfirmedNotifications, lifetime, options, next) {
782
- next = next || options;
783
- var settings = {
784
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
785
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
786
- invokeId: options.invokeId || getInvokeId()
787
- };
788
- var buffer = getBuffer();
789
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
790
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_SUBSCRIBE_COV, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
791
- baServices.encodeSubscribeCOV(buffer, subscribeId, objectId, cancel, issueConfirmedNotifications, lifetime);
792
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
793
- transport.send(buffer.buffer, buffer.offset, address);
794
- addCallback(settings.invokeId, function(err, data) {
795
- if (err) return next(err);
796
- next();
797
- });
798
- };
799
-
800
- self.subscribeProperty = function(address, objectId, monitoredProperty, subscribeId, cancel, issueConfirmedNotifications, options, next) {
801
- next = next || options;
802
- var settings = {
803
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
804
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
805
- invokeId: options.invokeId || getInvokeId()
806
- };
807
- var buffer = getBuffer();
808
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
809
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_SUBSCRIBE_COV_PROPERTY, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
810
- baServices.encodeSubscribeProperty(buffer, subscribeId, objectId, cancel, issueConfirmedNotifications, 0, monitoredProperty, false, 0x0f);
811
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
812
- transport.send(buffer.buffer, buffer.offset, address);
813
- addCallback(settings.invokeId, function(err, data) {
814
- if (err) return next(err);
815
- next();
816
- });
817
- };
818
-
819
- self.createObject = function(address, objectId, values, options, next) {
820
- next = next || options;
821
- var settings = {
822
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
823
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
824
- invokeId: options.invokeId || getInvokeId()
825
- };
826
- var buffer = getBuffer();
827
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
828
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_CREATE_OBJECT, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
829
- baServices.encodeCreateObject(buffer, objectId, values);
830
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
831
- transport.send(buffer.buffer, buffer.offset, address);
832
- addCallback(settings.invokeId, function(err, data) {
833
- if (err) return next(err);
834
- next();
835
- });
836
- };
837
-
838
- self.deleteObject = function(address, objectId, options, next) {
839
- next = next || options;
840
- var settings = {
841
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
842
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
843
- invokeId: options.invokeId || getInvokeId()
844
- };
845
- var buffer = getBuffer();
846
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
847
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_DELETE_OBJECT, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
848
- baServices.encodeDeleteObject(buffer, objectId);
849
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
850
- transport.send(buffer.buffer, buffer.offset, address);
851
- addCallback(settings.invokeId, function(err, data) {
852
- if (err) return next(err);
853
- next();
854
- });
855
- };
856
-
857
- self.removeListElement = function(address, objectId, reference, values, options, next) {
858
- next = next || options;
859
- var settings = {
860
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
861
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
862
- invokeId: options.invokeId || getInvokeId()
863
- };
864
- var buffer = getBuffer();
865
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
866
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_REMOVE_LIST_ELEMENT, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
867
- baServices.encodeAddListElement(buffer, objectId, reference.id, reference.index, values);
868
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
869
- transport.send(buffer.buffer, buffer.offset, address);
870
- addCallback(settings.invokeId, function(err, data) {
871
- if (err) return next(err);
872
- next();
873
- });
874
- };
875
-
876
- self.addListElement = function(address, objectId, reference, values, options, next) {
877
- next = next || options;
878
- var settings = {
879
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
880
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
881
- invokeId: options.invokeId || getInvokeId()
882
- };
883
- var buffer = getBuffer();
884
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
885
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_ADD_LIST_ELEMENT, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
886
- baServices.encodeAddListElement(buffer, objectId, reference.id, reference.index, values);
887
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
888
- transport.send(buffer.buffer, buffer.offset, address);
889
- addCallback(settings.invokeId, function(err, data) {
890
- if (err) return next(err);
891
- next();
892
- });
893
- };
894
-
895
- self.getAlarmSummary = function(address, options, next) {
896
- next = next || options;
897
- var settings = {
898
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
899
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
900
- invokeId: options.invokeId || getInvokeId()
901
- };
902
- var buffer = getBuffer();
903
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
904
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_GET_ALARM_SUMMARY, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
905
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
906
- transport.send(buffer.buffer, buffer.offset, address);
907
- addCallback(settings.invokeId, function(err, data) {
908
- if (err) return next(err);
909
- var result = baServices.decodeAlarmSummary(data.buffer, data.offset, data.length);
910
- if (!result) return next(new Error('INVALID_DECODING'));
911
- next(null, result);
912
- });
913
- };
914
-
915
- self.getEventInformation = function(address, objectId, options, next) {
916
- next = next || options;
917
- var settings = {
918
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
919
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
920
- invokeId: options.invokeId || getInvokeId()
921
- };
922
- var buffer = getBuffer();
923
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
924
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_GET_EVENT_INFORMATION, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
925
- baAsn1.encodeContextObjectId(buffer, 0, objectId.type, objectId.instance);
926
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
927
- transport.send(buffer.buffer, buffer.offset, address);
928
- addCallback(settings.invokeId, function(err, data) {
929
- if (err) return next(err);
930
- var result = baServices.decodeEventInformation(data.buffer, data.offset, data.length);
931
- if (!result) return next(new Error('INVALID_DECODING'));
932
- next(null, result);
933
- });
934
- };
935
-
936
- self.acknowledgeAlarm = function(address, objectId, eventState, ackText, evTimeStamp, ackTimeStamp, options, next) {
937
- next = next || options;
938
- var settings = {
939
- maxSegments: options.maxSegments || baEnum.MaxSegments.MAX_SEG65,
940
- maxAdpu: options.maxAdpu || baEnum.MaxAdpu.MAX_APDU1476,
941
- invokeId: options.invokeId || getInvokeId()
942
- };
943
- var buffer = getBuffer();
944
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE | baEnum.NpduControls.EXPECTING_REPLY, address);
945
- baAdpu.encodeConfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_CONFIRMED_SERVICE_REQUEST, baEnum.ConfirmedServices.SERVICE_CONFIRMED_ACKNOWLEDGE_ALARM, settings.maxSegments, settings.maxAdpu, settings.invokeId, 0, 0);
946
- baServices.encodeAlarmAcknowledge(buffer, 57, objectId, eventState, ackText, evTimeStamp, ackTimeStamp);
947
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
948
- transport.send(buffer.buffer, buffer.offset, address);
949
- addCallback(settings.invokeId, function(err, data) {
950
- if (err) return next(err);
951
- next();
952
- });
953
- };
954
-
955
- // Public Device Functions
956
- self.readPropertyResponse = function(receiver, invokeId, objectId, property, value) {
957
- var buffer = getBuffer();
958
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE, receiver);
959
- baAdpu.encodeComplexAck(buffer, baEnum.PduTypes.PDU_TYPE_COMPLEX_ACK, baEnum.ConfirmedServices.SERVICE_CONFIRMED_READ_PROPERTY, invokeId);
960
- baServices.encodeReadPropertyAcknowledge(buffer, objectId, property.id, property.index, value);
961
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
962
- transport.send(buffer.buffer, buffer.offset, receiver);
963
- };
964
-
965
- self.readPropertyMultipleResponse = function(receiver, invokeId, values) {
966
- var buffer = getBuffer();
967
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE, receiver);
968
- baAdpu.encodeComplexAck(buffer, baEnum.PduTypes.PDU_TYPE_COMPLEX_ACK, baEnum.ConfirmedServices.SERVICE_CONFIRMED_READ_PROP_MULTIPLE, invokeId);
969
- baServices.encodeReadPropertyMultipleAcknowledge(buffer, values);
970
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
971
- transport.send(buffer.buffer, buffer.offset, receiver);
972
- };
973
-
974
- self.iAmResponse = function(deviceId, segmentation, vendorId) {
975
- var buffer = getBuffer();
976
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE, transport.getBroadcastAddress());
977
- baAdpu.encodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST, baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_I_AM);
978
- baServices.encodeIamBroadcast(buffer, deviceId, transport.getMaxPayload(), segmentation, vendorId);
979
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_BROADCAST_NPDU, buffer.offset);
980
- transport.send(buffer.buffer, buffer.offset, transport.getBroadcastAddress());
981
- };
982
-
983
- self.iHaveResponse = function(deviceId, objectId, objectName) {
984
- var buffer = getBuffer();
985
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE, transport.getBroadcastAddress());
986
- baAdpu.EecodeUnconfirmedServiceRequest(buffer, baEnum.PduTypes.PDU_TYPE_UNCONFIRMED_SERVICE_REQUEST, baEnum.UnconfirmedServices.SERVICE_UNCONFIRMED_I_HAVE);
987
- baServices.EncodeIhaveBroadcast(buffer, deviceId, objectId, objectName);
988
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_BROADCAST_NPDU, buffer.offset);
989
- transport.send(buffer.buffer, buffer.offset, transport.getBroadcastAddress());
990
- };
991
-
992
- self.simpleAckResponse = function(receiver, service, invokeId) {
993
- var buffer = getBuffer();
994
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE, receiver);
995
- baAdpu.encodeSimpleAck(buffer, baEnum.PduTypes.PDU_TYPE_SIMPLE_ACK, service, invokeId);
996
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
997
- transport.send(buffer.buffer, buffer.offset, receiver);
998
- };
999
-
1000
- self.errorResponse = function(receiver, service, invokeId, errorClass, errorCode) {
1001
- var buffer = getBuffer();
1002
- baNpdu.encode(buffer, baEnum.NpduControls.PRIORITY_NORMAL_MESSAGE, receiver);
1003
- baAdpu.encodeError(buffer, baEnum.PduTypes.PDU_TYPE_ERROR, service, invokeId);
1004
- baServices.encodeError(buffer, errorClass, errorCode);
1005
- baBvlc.encode(buffer.buffer, baEnum.BvlcFunctions.BVLC_ORIGINAL_UNICAST_NPDU, buffer.offset);
1006
- transport.send(buffer.buffer, buffer.offset, receiver);
1007
- };
1008
-
1009
- /**
1010
- * Unloads the current BACstack instance and closes the underlying UDP socket.
1011
- * @function bacstack.close
1012
- * @example
1013
- * var bacnet = require('bacstack');
1014
- * var client = new bacnet();
1015
- *
1016
- * client.close();
1017
- */
1018
- self.close = function() {
1019
- transport.close();
1020
- };
1021
-
1022
- // Setup code
1023
- transport.setMessageHandler(receiveData);
1024
- transport.setErrorHandler(receiveError);
1025
- transport.open();
1026
-
1027
- return self;
1028
- };