UNPKG

knx.js

Version:

KNXnetIP (KNX over IP) deriver for nodejs.

120 lines (98 loc) 3.59 kB
/** * Created by aborovsky on 24.08.2015. */ var util = require('util'); var KnxSender = require('./KnxSender'); function KnxSenderTunneling(/*KnxConnection*/ connection, udpClient, remoteEndpoint) { KnxSenderTunneling.super_.call(this, connection, udpClient, remoteEndpoint); this.connection = connection; this._udpClient = udpClient; this._remoteEndpoint = remoteEndpoint; } util.inherits(KnxSenderTunneling, KnxSender); KnxSenderTunneling.prototype.SetClient = function (/*UdpClient*/ client) { this._udpClient = client; } KnxSenderTunneling.prototype.SendDataSingle = function (/*buffer*/ datagram, callback) { var that = this; function cb(err) { if (that.connection.debug) console.log('udp sent, err[' + (err ? err.toString() : 'no_err') + ']'); callback && callback(err); } this._udpClient.send(datagram, 0, datagram.length, this._remoteEndpoint.port, this._remoteEndpoint.host, cb) } KnxSenderTunneling.prototype.SendData = function (/*buffer*/datagram, callback) { if (!datagram) { return cb(new Error('Cannot send empty datagram')); } var that = this; function cb(err) { if (that.connection.debug) console.log('udp sent, err[' + (err ? err.toString() : 'no_err') + ']'); callback && callback(err); } this._udpClient.send(datagram, 0, datagram.length, this._remoteEndpoint.port, this._remoteEndpoint.host, cb); } KnxSenderTunneling.prototype.SendTunnelingAck = function (sequenceNumber) { // HEADER var datagram = new Buffer(10); datagram[0] = 0x06; datagram[1] = 0x10; datagram[2] = 0x04; datagram[3] = 0x21; datagram[4] = 0x00; datagram[5] = 0x0A; datagram[6] = 0x04; datagram[7] = this.connection.ChannelId; datagram[8] = sequenceNumber; datagram[9] = 0x00; this._udpClient.send(datagram, 0, datagram.length, this._remoteEndpoint.port, this._remoteEndpoint.host); } KnxSenderTunneling.prototype.CreateActionDatagram = function (/*string*/ destinationAddress, /*buffer*/ data) { try { var dataLength = KnxHelper.GetDataLength(data); // HEADER var datagram = new Buffer(10); datagram[0] = 0x06; datagram[1] = 0x10; datagram[2] = 0x04; datagram[3] = 0x20; var totalLength = dataLength + 20; var buf = new Buffer(2); buf.writeUInt16LE(totalLength); datagram[4] = buf[1]; datagram[5] = buf[0]; datagram[6] = 0x04; datagram[7] = this.connection.ChannelId; datagram[8] = this.connection.GenerateSequenceNumber(); datagram[9] = 0x00; return this.CreateActionDatagramCommon(destinationAddress, data, datagram); } catch (e) { this.connection.RevertSingleSequenceNumber(); return null; } } KnxSenderTunneling.prototype.CreateRequestStatusDatagram = function (/*string*/ destinationAddress) { try { // HEADER var datagram = new Buffer(21); datagram[0] = 0x06; datagram[1] = 0x10; datagram[2] = 0x04; datagram[3] = 0x20; datagram[4] = 0x00; datagram[5] = 0x15; datagram[6] = 0x04; datagram[7] = this.connection.ChannelId; datagram[8] = this.connection.GenerateSequenceNumber(); datagram[9] = 0x00; return this.CreateRequestStatusDatagramCommon(destinationAddress, datagram, 10); } catch (e) { this.connection.RevertSingleSequenceNumber(); return null; } } module.exports = KnxSenderTunneling;