@bitpoolos/edge-bacnet 1.0.5 → 1.0.9
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.
- package/bacnet_client.js +587 -154
- package/bacnet_device.js +34 -11
- package/bacnet_gateway.html +189 -92
- package/bacnet_gateway.js +152 -21
- package/bacnet_object.js +1 -1
- package/bacnet_read.html +115 -113
- package/bacnet_read.js +24 -24
- package/bacnet_write.html +19 -15
- package/bacnet_write.js +0 -2
- package/common.js +63 -8
- package/package.json +5 -1
- package/resources/confirmationservice.min.js +1 -0
- package/resources/confirmdialog.min.js +1 -0
- package/resources/fonts/primeicons.woff2 +0 -0
- package/resources/node-bacnet/CHANGELOG.md +481 -0
- package/resources/{bacstack → node-bacnet}/LICENSE.md +3 -1
- package/resources/node-bacnet/README.md +91 -0
- package/resources/node-bacnet/docs/Client.html +4422 -0
- package/resources/node-bacnet/docs/bacnet-icon-quad.png +0 -0
- package/resources/node-bacnet/docs/bacnet-icon-quad128.png +0 -0
- package/resources/node-bacnet/docs/bacnet-icon-quad64.png +0 -0
- package/resources/node-bacnet/docs/bacnet-icon-small.xcf +0 -0
- package/resources/node-bacnet/docs/bacnet-icon.xcf +0 -0
- package/resources/node-bacnet/docs/bacnet.html +7032 -0
- package/resources/node-bacnet/docs/client.js.html +1759 -0
- package/resources/node-bacnet/docs/enum.js.html +2530 -0
- package/resources/node-bacnet/docs/global.html +2068 -0
- package/resources/node-bacnet/docs/images/mocha-logo.svg +65 -0
- package/resources/node-bacnet/docs/index.html +283 -0
- package/resources/node-bacnet/docs/scripts/collapse.js +11 -0
- package/resources/node-bacnet/docs/scripts/jquery-3.1.1.min.js +4 -0
- package/resources/node-bacnet/docs/scripts/linenumber.js +26 -0
- package/resources/node-bacnet/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/resources/node-bacnet/docs/scripts/prettify/lang-css.js +2 -0
- package/resources/node-bacnet/docs/scripts/prettify/prettify.js +28 -0
- package/resources/node-bacnet/docs/scripts/search.js +47 -0
- package/resources/node-bacnet/docs/services_i-am.js.html +157 -0
- package/resources/node-bacnet/docs/services_time-sync.js.html +118 -0
- package/resources/node-bacnet/docs/services_who-is.js.html +138 -0
- package/resources/node-bacnet/docs/styles/jsdoc.css +683 -0
- package/resources/node-bacnet/docs/styles/prettify.css +82 -0
- package/resources/node-bacnet/examples/discover-devices.js +66 -0
- package/resources/node-bacnet/examples/read-device.js +510 -0
- package/resources/node-bacnet/examples/subscribe-cov.js +75 -0
- package/resources/{bacstack → node-bacnet}/index.js +3 -0
- package/resources/{bacstack → node-bacnet}/lib/apdu.js +56 -39
- package/resources/{bacstack → node-bacnet}/lib/asn1.js +550 -532
- package/resources/node-bacnet/lib/bvlc.js +90 -0
- package/resources/node-bacnet/lib/client.js +1695 -0
- package/resources/node-bacnet/lib/enum.js +2463 -0
- package/resources/node-bacnet/lib/npdu.js +123 -0
- package/resources/{bacstack → node-bacnet}/lib/services/add-list-element.js +12 -6
- package/resources/{bacstack → node-bacnet}/lib/services/alarm-acknowledge.js +3 -3
- package/resources/{bacstack → node-bacnet}/lib/services/alarm-summary.js +5 -4
- package/resources/{bacstack → node-bacnet}/lib/services/atomic-read-file.js +49 -26
- package/resources/{bacstack → node-bacnet}/lib/services/atomic-write-file.js +40 -23
- package/resources/{bacstack → node-bacnet}/lib/services/cov-notify.js +33 -17
- package/resources/{bacstack → node-bacnet}/lib/services/create-object.js +23 -13
- package/resources/{bacstack → node-bacnet}/lib/services/delete-object.js +7 -2
- package/resources/{bacstack → node-bacnet}/lib/services/device-communication-control.js +8 -3
- package/resources/{bacstack → node-bacnet}/lib/services/error.js +7 -0
- package/resources/{bacstack → node-bacnet}/lib/services/event-information.js +10 -9
- package/resources/{bacstack → node-bacnet}/lib/services/event-notify-data.js +38 -16
- package/resources/{bacstack → node-bacnet}/lib/services/get-enrollment-summary.js +24 -11
- package/resources/{bacstack → node-bacnet}/lib/services/get-event-information.js +28 -13
- package/resources/node-bacnet/lib/services/i-am.js +90 -0
- package/resources/{bacstack/lib/services/i-have-broadcast.js → node-bacnet/lib/services/i-have.js} +3 -2
- package/resources/{bacstack → node-bacnet}/lib/services/index.js +7 -4
- package/resources/{bacstack → node-bacnet}/lib/services/life-safety-operation.js +3 -2
- package/resources/{bacstack → node-bacnet}/lib/services/private-transfer.js +3 -2
- package/resources/{bacstack → node-bacnet}/lib/services/read-property-multiple.js +11 -6
- package/resources/{bacstack → node-bacnet}/lib/services/read-property.js +42 -24
- package/resources/{bacstack → node-bacnet}/lib/services/read-range.js +37 -27
- package/resources/node-bacnet/lib/services/register-foreign-device.js +18 -0
- package/resources/{bacstack → node-bacnet}/lib/services/reinitialize-device.js +9 -4
- package/resources/{bacstack → node-bacnet}/lib/services/subscribe-cov.js +9 -4
- package/resources/{bacstack → node-bacnet}/lib/services/subscribe-property.js +18 -8
- package/resources/{bacstack → node-bacnet}/lib/services/time-sync.js +28 -5
- package/resources/{bacstack → node-bacnet}/lib/services/who-has.js +3 -3
- package/resources/{bacstack → node-bacnet}/lib/services/who-is.js +42 -9
- package/resources/{bacstack → node-bacnet}/lib/services/write-property-multiple.js +33 -16
- package/resources/{bacstack → node-bacnet}/lib/services/write-property.js +23 -13
- package/resources/node-bacnet/lib/transport.js +82 -0
- package/resources/node-bacnet/package.json +92 -0
- package/resources/primeicons.css +90 -2
- package/resources/bacstack/.codeclimate.yml +0 -15
- package/resources/bacstack/.dockerignore +0 -5
- package/resources/bacstack/.editorconfig +0 -13
- package/resources/bacstack/.eslintrc.yml +0 -13
- package/resources/bacstack/.github/ISSUE_TEMPLATE.md +0 -26
- package/resources/bacstack/.github/PULL_REQUEST_TEMPLATE.md +0 -14
- package/resources/bacstack/.github/workflows/ci.yml +0 -39
- package/resources/bacstack/.jscsrc +0 -8
- package/resources/bacstack/.jshintrc +0 -50
- package/resources/bacstack/.travis.yml +0 -27
- package/resources/bacstack/CHANGELOG.md +0 -232
- package/resources/bacstack/CODE_OF_CONDUCT.md +0 -74
- package/resources/bacstack/CONTRIBUTING.md +0 -77
- package/resources/bacstack/Dockerfile +0 -15
- package/resources/bacstack/FAQ.md +0 -64
- package/resources/bacstack/README.md +0 -157
- package/resources/bacstack/docker-compose.yml +0 -9
- package/resources/bacstack/lib/adpu.js +0 -190
- package/resources/bacstack/lib/bvlc.js +0 -43
- package/resources/bacstack/lib/client.js +0 -1028
- package/resources/bacstack/lib/enum.js +0 -1314
- package/resources/bacstack/lib/npdu.js +0 -119
- package/resources/bacstack/lib/services/i-am-broadcast.js +0 -51
- package/resources/bacstack/lib/services.js +0 -1963
- package/resources/bacstack/lib/transport.js +0 -52
- package/resources/bacstack/package-lock.json +0 -7974
- package/resources/bacstack/package.json +0 -84
- package/resources/bacstack/test/compliance/who-is.spec.js +0 -37
- package/resources/bacstack/test/integration/acknowledge-alarm.spec.js +0 -14
- package/resources/bacstack/test/integration/add-list-element.spec.js +0 -16
- package/resources/bacstack/test/integration/confirmed-event-notification.spec.js +0 -30
- package/resources/bacstack/test/integration/confirmed-private-transfer.spec.js +0 -15
- package/resources/bacstack/test/integration/create-object.spec.js +0 -16
- package/resources/bacstack/test/integration/delete-object.spec.js +0 -14
- package/resources/bacstack/test/integration/device-communication-control.spec.js +0 -14
- package/resources/bacstack/test/integration/get-alarm-summary.spec.js +0 -14
- package/resources/bacstack/test/integration/get-enrollment-summary.spec.js +0 -15
- package/resources/bacstack/test/integration/get-event-information.spec.js +0 -14
- package/resources/bacstack/test/integration/read-file.spec.js +0 -14
- package/resources/bacstack/test/integration/read-property-multiple.spec.js +0 -110
- package/resources/bacstack/test/integration/read-property.spec.js +0 -14
- package/resources/bacstack/test/integration/read-range.spec.js +0 -14
- package/resources/bacstack/test/integration/reinitialize-sevice.spec.js +0 -14
- package/resources/bacstack/test/integration/remove-list-element.spec.js +0 -16
- package/resources/bacstack/test/integration/subscribe-cov.spec.js +0 -14
- package/resources/bacstack/test/integration/subscribe-property.spec.js +0 -14
- package/resources/bacstack/test/integration/time-sync-utc.spec.js +0 -10
- package/resources/bacstack/test/integration/time-sync.spec.js +0 -10
- package/resources/bacstack/test/integration/unconfirmed-event-notification.spec.js +0 -28
- package/resources/bacstack/test/integration/unconfirmed-private-transfer.spec.js +0 -11
- package/resources/bacstack/test/integration/utils.js +0 -30
- package/resources/bacstack/test/integration/who-is.spec.js +0 -17
- package/resources/bacstack/test/integration/write-file.spec.js +0 -14
- package/resources/bacstack/test/integration/write-property-multiple.spec.js +0 -19
- package/resources/bacstack/test/integration/write-property.spec.js +0 -14
- package/resources/bacstack/test/unit/apdu.spec.js +0 -162
- package/resources/bacstack/test/unit/asn1.spec.js +0 -39
- package/resources/bacstack/test/unit/bacnet-apdu.spec.js +0 -161
- package/resources/bacstack/test/unit/bacnet-asn1.spec.js +0 -32
- package/resources/bacstack/test/unit/bacnet-bvlc.spec.js +0 -57
- package/resources/bacstack/test/unit/bacnet-npdu.spec.js +0 -118
- package/resources/bacstack/test/unit/bacnet-services.spec.js +0 -2052
- package/resources/bacstack/test/unit/bvlc.spec.js +0 -58
- package/resources/bacstack/test/unit/npdu.spec.js +0 -119
- package/resources/bacstack/test/unit/service-add-list-element.spec.js +0 -24
- package/resources/bacstack/test/unit/service-alarm-acknowledge.spec.js +0 -71
- package/resources/bacstack/test/unit/service-alarm-summary.spec.js +0 -22
- package/resources/bacstack/test/unit/service-atomic-read-file.spec.js +0 -54
- package/resources/bacstack/test/unit/service-atomic-write-file.spec.js +0 -56
- package/resources/bacstack/test/unit/service-cov-notify.spec.js +0 -98
- package/resources/bacstack/test/unit/service-create-object.spec.js +0 -90
- package/resources/bacstack/test/unit/service-delete-object.spec.js +0 -17
- package/resources/bacstack/test/unit/service-device-communication-control.spec.js +0 -29
- package/resources/bacstack/test/unit/service-error.spec.js +0 -17
- package/resources/bacstack/test/unit/service-event-information.spec.js +0 -48
- package/resources/bacstack/test/unit/service-event-notify-data.spec.js +0 -310
- package/resources/bacstack/test/unit/service-get-enrollment-summary.spec.js +0 -45
- package/resources/bacstack/test/unit/service-get-event-information.spec.js +0 -62
- package/resources/bacstack/test/unit/service-i-am.spec.js +0 -19
- package/resources/bacstack/test/unit/service-i-have-broadcast.spec.js +0 -18
- package/resources/bacstack/test/unit/service-life-safety-operation.spec.js +0 -19
- package/resources/bacstack/test/unit/service-private-transfer.spec.js +0 -18
- package/resources/bacstack/test/unit/service-read-property-multiple.spec.js +0 -131
- package/resources/bacstack/test/unit/service-read-property.spec.js +0 -541
- package/resources/bacstack/test/unit/service-read-range.spec.js +0 -97
- package/resources/bacstack/test/unit/service-reinitialize-device.spec.js +0 -27
- package/resources/bacstack/test/unit/service-subscribe-cov.spec.js +0 -32
- package/resources/bacstack/test/unit/service-subscribe-property.spec.js +0 -50
- package/resources/bacstack/test/unit/service-time-sync.spec.js +0 -18
- package/resources/bacstack/test/unit/service-who-has.spec.js +0 -33
- package/resources/bacstack/test/unit/service-who-is.spec.js +0 -17
- package/resources/bacstack/test/unit/service-write-property-multiple.spec.js +0 -143
- package/resources/bacstack/test/unit/service-write-property.spec.js +0 -198
- 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
|
-
};
|