SODashServer/app.js

240 lines
6.4 KiB
JavaScript
Raw Normal View History

2016-04-13 09:01:28 +00:00
/**
* Created by Martin on 08/02/2016.
*/
'use strict';
2016-04-20 13:48:48 +00:00
var express = require('express');
var path = require('path');
var http = require('http');
var ejs = require('ejs');
var morgan = require('morgan');
var cookieparser = require('cookie-parser');
var session = require('express-session');
var methodoverride = require('method-override');
var bodyparser = require('body-parser');
var errorhandler = require('errorhandler');
2016-04-13 09:01:28 +00:00
var mqttConnect = require('./lib/mqtt/mqttConnect');
var log4js = require('log4js');
var logger = log4js.getLogger();
2016-04-28 15:57:44 +00:00
2016-04-13 09:01:28 +00:00
var WebSocketServer = require('websocket').server;
2016-04-20 13:48:48 +00:00
var EventEmitter = require('events');
2016-04-13 09:01:28 +00:00
var busEmitter = new EventEmitter();
2016-04-20 13:48:48 +00:00
var calendar = require('./lib/office/officeController.js');
var cal = new calendar.officeController(busEmitter);
var lighting_v1 = require('./routes/lighting_v1');
var heating_v1 = require('./routes/heating_v1');
var projector_v1 = require('./routes/projector_v1');
var isProduction = false;
2016-04-20 13:48:48 +00:00
2016-04-28 15:57:44 +00:00
var iosTokens = [];
2016-04-20 13:48:48 +00:00
2016-04-13 09:01:28 +00:00
mqttConnect.setEmitter(busEmitter);
mqttConnect.doConnection();
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
if (process.env.NODE_ENV === 'production') {
isProduction = true;
}
logger.debug('isProduction:', isProduction);
2016-04-13 09:01:28 +00:00
var app = express();
app.set('port', process.env.PORT || 4545);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(morgan('combined'));
app.use(cookieparser('your secret here'));
app.use(session({
2016-04-20 13:48:48 +00:00
secret: '1234567890QWERTY', resave: false, saveUninitialized: false
2016-04-13 09:01:28 +00:00
}));
/* 'default', 'short', 'tiny', 'dev' */
app.use(methodoverride());
app.use(bodyparser.urlencoded({extended: false}));
// Parse application/json
2016-04-13 09:01:28 +00:00
app.use(bodyparser.json());
2016-04-20 13:48:48 +00:00
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'X-Requested-With');
2016-04-20 13:48:48 +00:00
next();
2016-04-13 09:01:28 +00:00
});
// Run npm start --production to use dist
var staticDir = isProduction ? 'dist' : 'app';
app.use(express.static(path.join(__dirname, staticDir)));
2016-04-13 09:01:28 +00:00
app.use(errorhandler({dumpExceptions: true, showStack: true}));
lighting_v1.use(mqttConnect);
heating_v1.use(mqttConnect);
projector_v1.use(mqttConnect);
2016-04-20 13:48:48 +00:00
// Calendar handler
busEmitter.on('lightingOn', lighting_v1.doLightsOn);
busEmitter.on('lightingOff', lighting_v1.doLightsOff);
busEmitter.on('heatingOn', mqttConnect.heatingOn);
busEmitter.on('heatingOff', mqttConnect.heatingOff);
busEmitter.on('projectorOn', mqttConnect.projectorOn);
busEmitter.on('projectorOff', mqttConnect.projectorOff);
mqttConnect.setupPing();
2016-04-20 13:48:48 +00:00
cal.startController(busEmitter);
app.get('/stop', function(request, response) {
2016-04-20 13:48:48 +00:00
cal.stopController();
});
2016-04-20 13:48:48 +00:00
app.get('/start', function(request, response) {
2016-04-20 13:48:48 +00:00
cal.startController();
});
2016-04-20 13:48:48 +00:00
app.get('/api/calendar', function(req, res) {
2016-04-20 13:48:48 +00:00
var calJson = cal.returnCalendar();
console.log(calJson);
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify(calJson));
});
2016-04-13 09:01:28 +00:00
2016-04-20 13:48:48 +00:00
app.post('/api/calendar/extend', function(req, res) {
res.setHeader('Content-Type', 'application/json');
res.end(JSON.stringify({}));
});
2016-04-20 13:48:48 +00:00
// Events and sockets
busEmitter.on('clientConnected', (socketSet) => {
console.log(socketSet.getClientStatus());
heating_v1.setsocket(socketSet).subscribe();
lighting_v1.setsocket(socketSet).subscribe();
projector_v1.setsocket(socketSet).subscribe();
});
2016-04-13 09:01:28 +00:00
busEmitter.on('clientStatusUpdated', (v) => {
2016-04-20 13:48:48 +00:00
console.log(v);
2016-04-13 09:01:28 +00:00
});
2016-04-20 13:48:48 +00:00
2016-04-13 09:01:28 +00:00
logger.info('Configuring WebSocket Listener...');
2016-04-20 13:48:48 +00:00
var server = http.createServer(function(request, response) {
console.log((new Date()) + ' Received request for ' + request.url);
response.writeHead(404);
response.end();
2016-04-13 09:01:28 +00:00
});
2016-04-20 14:29:30 +00:00
server.listen(3001, function() {
2016-04-20 13:48:48 +00:00
console.log((new Date()) + ' Server is listening on port 8080');
2016-04-13 09:01:28 +00:00
});
var wsServer = new WebSocketServer({
2016-04-20 13:48:48 +00:00
httpServer: server, // You should not use autoAcceptConnections for production
// applications, as it defeats all standard cross-origin protection
// facilities built into the protocol and the browser. You should
// *always* verify the connection's origin and decide whether or not
// to accept it.
autoAcceptConnections: false
2016-04-13 09:01:28 +00:00
});
function originIsAllowed(origin) {
// Put logic here to detect whether the specified origin is allowed.
2016-04-20 13:48:48 +00:00
return true;
2016-04-13 09:01:28 +00:00
}
2016-04-20 13:48:48 +00:00
wsServer.on('request', function(request) {
2016-04-13 09:01:28 +00:00
2016-04-20 13:48:48 +00:00
if (!originIsAllowed(request.origin)) {
// Make sure we only accept requests from an allowed origin
request.reject();
console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.');
return;
}
2016-04-13 09:01:28 +00:00
2016-04-20 13:48:48 +00:00
var connection = request.accept('stream', request.origin);
console.log((new Date()) + ' Connection accepted.');
2016-04-13 09:01:28 +00:00
2016-04-20 13:48:48 +00:00
var sendSocketHandler = (obj) => {
2016-04-28 15:57:44 +00:00
//Logger.info('sendSocket: ' , JSON.stringify(obj));
try {
connection.sendUTF(JSON.stringify(obj));
}
catch (err) {
logger.error(err);
}
};
2016-04-13 09:01:28 +00:00
2016-04-20 13:48:48 +00:00
busEmitter.on('sendSocket', sendSocketHandler);
2016-04-13 09:01:28 +00:00
2016-04-20 13:48:48 +00:00
connection.on('message', function(message) {
if (message.type === 'utf8') {
console.log('Received Message: ' + message.utf8Data);
connection.sendUTF(message.utf8Data);
} else if (message.type === 'binary') {
2016-04-20 13:48:48 +00:00
console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');
connection.sendBytes(message.binaryData);
}
});
2016-04-13 09:01:28 +00:00
2016-04-20 13:48:48 +00:00
connection.on('close', function(reasonCode, description) {
console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
busEmitter.removeListener('sendSocket', sendSocketHandler);
});
2016-04-13 09:01:28 +00:00
});
2016-04-20 13:48:48 +00:00
mqttConnect.connectWS(function() {
console.log('Ready to plug in sockets...');
2016-04-13 09:01:28 +00:00
});
/*App.get('/', function( req, res) {
2016-04-13 09:01:28 +00:00
res.render('index');
});*/
app.post('/api/v1/lighting/off', lighting_v1.turnoff);
app.post('/api/v1/lighting/on', lighting_v1.turnon);
app.post('/api/v1/heating/off', heating_v1.turnoff);
app.post('/api/v1/heating/on', heating_v1.turnon);
app.post('/api/v1/projector/off', projector_v1.turnoff);
app.post('/api/v1/projector/on', projector_v1.turnon);
2016-04-28 15:57:44 +00:00
app.post('/api/v1/register/ios', function(req, res) {
2016-04-29 08:48:34 +00:00
var body = req.body, registrationId;
2016-04-29 08:42:11 +00:00
2016-04-29 08:44:33 +00:00
logger.debug(body);
2016-04-29 08:48:34 +00:00
if (body.hasOwnProperty('registrationId')) {
registrationId = body['registrationId'];
logger.debug(registrationId);
2016-04-29 08:42:11 +00:00
2016-04-29 08:48:34 +00:00
if (iosTokens.indexOf(registrationId) === -1) {
iosTokens.push(registrationId);
2016-04-29 08:42:11 +00:00
logger.info('IOS Device registered.');
}
}
2016-04-28 15:57:44 +00:00
});
2016-04-20 13:48:48 +00:00
app.listen(3000, function() {
console.log('Express listening on 3000');
2016-04-13 09:01:28 +00:00
});