81 lines
2.3 KiB
JavaScript
81 lines
2.3 KiB
JavaScript
var util = require('util');
|
|
var events = require('events');
|
|
var dgram = require('dgram');
|
|
var net = require('net');
|
|
|
|
function deserialize(data, cb) {
|
|
// Deseralize the data - magic numbers are as per the Hue Stream protocol
|
|
var length = data.length - 16;
|
|
var colormode = data[14];
|
|
var filter = data[15];
|
|
|
|
var rawData = [];
|
|
for (var i = 0; i < length; i++) {
|
|
rawData.push(data[i + 16]);
|
|
}
|
|
|
|
// Build the associative array to return
|
|
var retData = {colormode: colormode, filter: filter, length: length, data: rawData};
|
|
|
|
// And call the callback passing the deseralized data
|
|
cb(retData);
|
|
}
|
|
|
|
function udpServer(port, cb) {
|
|
// Set up the socket
|
|
var sock = dgram.createSocket("udp4", function (msg) {
|
|
var data = [];
|
|
for (var i = 0; i < msg.length; i++) {
|
|
data.push(msg[i]);
|
|
}
|
|
deserialize(data, cb);
|
|
});
|
|
sock.bind(port);
|
|
console.log('Stream UDP Server bound port %d', port);
|
|
}
|
|
|
|
function tcpServer(port, cb) {
|
|
// Create a TCP Server
|
|
|
|
var srv = net.createServer(function(socket){
|
|
socket.name = socket.remoteAddress + ":" + socket.remotePort
|
|
console.log('Stream TCP Server Connected %s', socket.name);
|
|
socket.setEncoding('UTF-8');
|
|
|
|
var buffer = '';
|
|
var myRe = /(.+)\n/g;
|
|
|
|
socket.on('data', function (data) {
|
|
buffer = buffer + data;
|
|
var lastMatchIndex = 0;
|
|
var match;
|
|
while ((match = myRe.exec(buffer)) !== null) {
|
|
lastMatchIndex = myRe.lastIndex;
|
|
|
|
var base64_buffer = new Buffer(match[0], 'base64');
|
|
var decoded = [];
|
|
|
|
for (var i = 0; i < base64_buffer.length; i++) {
|
|
decoded.push(base64_buffer[i]);
|
|
}
|
|
deserialize(decoded, cb);
|
|
}
|
|
buffer = buffer.substr(lastMatchIndex);
|
|
});
|
|
|
|
}).listen(port,'0.0.0.0', function(){
|
|
console.log('Stream TCP Server Listening on %j', srv.address())
|
|
});
|
|
}
|
|
|
|
// Stream server class
|
|
exports.listen = function (port, cb) {
|
|
this.port = port;
|
|
events.EventEmitter.call(this);
|
|
udpServer(port, cb);
|
|
tcpServer(port, cb);
|
|
};
|
|
|
|
// Setup EventEmitter for the StreamServer
|
|
util.inherits(this, events.EventEmitter);
|
|
|