UNPKG

node-e131

Version:

E1.31 client module for Node.JS

190 lines (167 loc) 4.67 kB
var dgram = require('dgram'); var Buffer = require('buffer').Buffer; function E131Client(host, port, universe) { var id = this.uuid = 'fc118ca9-9cf0-4861-8ac7-06450a44ba8a'; this._host = host; this._port = port || 5568; //default e1.31 = 5568 this._socket = dgram.createSocket("udp4"); this.UNIVERSE = universe || 1; var data = new Array(); data[0] = 0; // RLP preamble size (high) data[1] = 16; // RLP preamble size (low) data[2] = 0; // RLP postamble size (high) data[3] = 0; // RLP postamble size (low) data[4] = 65; // ACN Packet Identifier (12 bytes) data[5] = 83; data[6] = 67; data[7] = 45; data[8] = 69; data[9] = 49; data[10] = 46; data[11] = 49; data[12] = 55; data[13] = 0; data[14] = 0; data[15] = 0; data[16] = 114; // RLP Protocol flags and length (high) data[17] = 110; // 637 - 16 data[18] = 0; // RLP Vector (Identifies RLP Data as 1.31 Protocol PDU) data[19] = 0; data[20] = 0; data[21] = 4; var cid; for (var i = 0, j = 22; i < 32; i += 2) { cid = id.charAt(i) + id.charAt(i + 1); data[j++] = parseInt(cid, 16); } data[38] = 114; // Framing Protocol flags and length (high) data[39] = 88; // 637 - 38 data[40] = 0; // Framing Vector (indicates that the E1.31 framing layer is wrapping a DMP PDU) data[41] = 0; data[42] = 0; data[43] = 2; data[44] = 0; // Source Name (64 bytes) data[45] = 0; data[46] = 0; data[47] = 0; data[48] = 0; data[49] = 0; data[50] = 0; data[51] = 0; data[52] = 0; data[53] = 0; data[54] = 0; data[55] = 0; data[56] = 0; data[57] = 0; data[58] = 0; data[59] = 0; data[60] = 0; data[61] = 0; data[61] = 0; data[62] = 0; data[63] = 0; data[64] = 0; data[65] = 0; data[66] = 0; data[67] = 0; data[68] = 0; data[69] = 0; data[70] = 0; data[71] = 0; data[71] = 0; data[72] = 0; data[73] = 0; data[74] = 0; data[75] = 0; data[76] = 0; data[77] = 0; data[78] = 0; data[79] = 0; data[80] = 0; data[81] = 0; data[81] = 0; data[82] = 0; data[83] = 0; data[84] = 0; data[85] = 0; data[86] = 0; data[87] = 0; data[88] = 0; data[89] = 0; data[90] = 0; data[91] = 0; data[91] = 0; data[92] = 0; data[93] = 0; data[94] = 0; data[95] = 0; data[96] = 0; data[97] = 0; data[98] = 0; data[99] = 0; data[100] = 0; data[101] = 0; data[101] = 0; data[102] = 0; data[103] = 0; data[104] = 0; data[105] = 0; data[106] = 0; data[107] = 0; data[108] = 100; // Priority data[109] = 0; // Reserved data[110] = 0; // Reserved data[111] = 0; // Sequence Number data[112] = 0; // Framing Options Flags data[113] = this.UNIVERSE >> 8; // Universe high data[114] = this.UNIVERSE; // Universe low data[115] = 114; // DMP Protocol flags and length (high) data[116] = 11; // 637 - 115 data[117] = 2; // DMP Vector (Identifies DMP Set Property Message PDU) data[118] = 161; // DMP Address Type & Data Type data[119] = 0; // First Property Address (high) data[120] = 0; // First Property Address (low) data[121] = 0; // Address Increment (high) data[122] = 1; // Address Increment (low) data[123] = 2; // Property value count (high) data[124] = 1; // Property value count (low) data[125] = 0; // DMX512-A START Code this.data = data; } function isNumber(n) { return !isNaN(parseFloat(n)) && isFinite(n); } exports.E131Client = E131Client; exports.createClient = function(host, port, universe) { return new E131Client(host, port, universe); } E131Client.prototype.send = function(data) { var numChannels = data.length; var data = this.data.concat(data); var buf = Buffer(data, 'hex'); var i = numChannels + 1; var hi; data[111] = this.sequenceNumber < 255 ? this.sequenceNumber++ : this.sequenceNumber = 0; buf[123] = i >> 8; buf[124] = i; //RLP Flags & Length i = 638 - 16 - (512 - numChannels); hi = i >> 8; buf[16] = hi + 0x70; buf[17] = i; //Framing Flags & Length i = 638 - 38 - (512 - numChannels); hi = i >> 8; buf[38] = hi + 0x70; buf[39] = i; // //DMP Flags & Length i = 638 - 115 - (512 - numChannels); hi = i >> 8; buf[115] = hi + 0x70; buf[116] = i; this._socket.send(buf, 0, buf.length, this._port, this._host, function() {}); } E131Client.prototype.close = function() { this._socket.close(); };