JD2022-TU1/main/extern/Hue/tools/simulator/server/stream_server.js

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);