diff --git a/package.json b/package.json index 905d09c3..5cfac558 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,34 @@ "@angular/platform-browser": "4.3.3", "@angular/platform-browser-dynamic": "4.3.3", "@angular/router": "4.3.3", + "body-parser": "^1.17.2", + "bytebuffer": "^5.0.1", + "chokidar": "^1.7.0", + "connect-roles": "^3.1.2", + "cookie-parser": "^1.4.3", "core-js": "2.4.1", + "crc-32": "^1.1.0", + "errorhandler": "^1.5.0", + "express": "^4.15.4", + "express-session": "^1.15.5", + "lodash": "^4.17.4", + "method-override": "^2.3.9", + "mongoose": "^4.11.10", + "morgan": "^1.8.2", + "mosca": "^2.5.2", + "mqtt": "^2.12.0", + "multer": "^1.3.0", + "node-uuid": "^1.4.8", + "nools": "^0.4.4", + "passport": "^0.4.0", + "passport-local": "^1.0.0", + "passport-local-mongoose": "^4.2.1", + "q": "^1.5.0", "rxjs": "5.4.2", + "serve-favicon": "^2.4.3", + "socket.io": "^2.0.3", + "winston": "^2.3.1", + "xml2js": "^0.4.19", "zone.js": "0.8.16" }, "devDependencies": { diff --git a/server/app.js b/server/app.js new file mode 100755 index 00000000..291eb466 --- /dev/null +++ b/server/app.js @@ -0,0 +1,41 @@ +var ssl = true; + +if(process.argv.length > 2){ + if(process.argv[2] == 'nossl'){ + ssl = false; + } +} + +if(ssl){ + console.log("Running Central Control Platform in SSL mode"); +}else{ + console.log("Running Central Control Platform in NONE-SSL mode"); +} + +var mqttServer = require('./services/mqttServer.js'); +var stationStatusListener = require('./services/statusListener.js'); +var eventLogListener = require('./services/eventLogListener.js'); +var mqttClient = require('./services/mqttClient.js'); +//var resourceListener = require('./services/resourceListener.js'); +var expressServer = require('./services/expressServer.js'); +var cacheStore = require('./services/cacheStore.js'); + +// start mqtt broker +mqttServer.onAppStart(ssl, function(){ + // start mqtt client + mqttClient.onAppStart(ssl); +}); +// start event log listener +eventLogListener.onAppStart(); + +// start station status listener +stationStatusListener.onAppStart(); + +// start resource listener +//resourceListener.onAppStart(); + +// start cache store +cacheStore.onAppStart(); + +// start express server +expressServer.onAppStart(ssl); \ No newline at end of file diff --git a/server/config.js b/server/config.js new file mode 100755 index 00000000..350746c8 --- /dev/null +++ b/server/config.js @@ -0,0 +1,77 @@ +var config = { + development: { + //database: 'mongodb://127.0.0.1/energyMonitorCentral', + database: 'mongodb://127.0.0.1/angular4', + // following is mqtt config + mqttHost: 'mqtt.gushenxing.com', + mqttPort: 7999, + mqttsPort: 8883, + mqttHttpPort: 4000, + mqttHttpsPort: 4001, + mqttDatabase: 'mongodb://127.0.0.1/mosca', + mqttPubsubCollection: 'pubsub', + mqttClientId: 'platform', + mqttUsername: 'gushenxingmqttclient', + mqttPassword: 'gushenxingmqttclientpassword', + mqttKeepalive: 60, + mqttEncoding: 'binary', + mqttKeyFile: 'mqtt.gushenxing.com.server.unencripted.key', + mqttCrtFile: 'mqtt.gushenxing.com.server.crt', + mqttCaFile: 'mqtt.gushenxing.com.ca.crt', + // express server + expressHttpPort: 5000, + expressHttpsPort: 8443, + resourcesPath: __dirname + '/' + 'resources' + }, + local: { + //database: 'mongodb://127.0.0.1/energyMonitorCentral', + database: 'mongodb://127.0.0.1/angular4', + // following is mqtt config + mqttHost: 'mqtt.gushenxing.com', + mqttPort: 7999, + mqttsPort: 8883, + mqttHttpPort: 4000, + mqttHttpsPort: 4001, + mqttDatabase: 'mongodb://127.0.0.1/mosca', + mqttPubsubCollection: 'pubsub', + mqttClientId: 'platform', + mqttUsername: 'gushenxingmqttclient', + mqttPassword: 'gushenxingmqttclientpassword', + mqttKeepalive: 60, + mqttEncoding: 'binary', + mqttKeyFile: 'mqtt.gushenxing.com.server.unencripted.key', + mqttCrtFile: 'mqtt.gushenxing.com.server.crt', + mqttCaFile: 'mqtt.gushenxing.com.ca.crt', + // express server + expressHttpPort: 5000, + expressHttpsPort: 8443, + resourcesPath: __dirname + '/' + 'resources' + }, + production: { + database: 'mongodb://127.0.0.1/angular4', + mqttHost: 'mqtt.gushenxing.com', + mqttPort: 7999, + mqttsPort: 8883, + mqttHttpPort: 4000, + mqttHttpsPort: 4001, + mqttDatabase: 'mongodb://127.0.0.1/mosca', + mqttPubsubCollection: 'pubsub', + mqttClientId: 'platform', + mqttUsername: 'gushenxingmqttclient', + mqttPassword: 'gushenxingmqttclientpassword', + mqttKeepalive: 60, + mqttEncoding: 'binary', + mqttKeyFile: 'mqtt.gushenxing.com.server.unencripted.key', + mqttCrtFile: 'mqtt.gushenxing.com.server.crt', + expressHttpPort: 5000, + expressHttpsPort: 8443, + resourcesPath: __dirname + '/' + 'resources' + } +}; + +var env = process.env.NODE_ENV || 'development'; + +module.exports = function(){ + var returnVal = config[env]; + return returnVal; +}; diff --git a/server/routes/api.js b/server/routes/api.js new file mode 100644 index 00000000..960656cf --- /dev/null +++ b/server/routes/api.js @@ -0,0 +1,6 @@ +exports.dummy = function (req, res) { + var id = req.params.id; + res.json({ + data: id + }); +}; \ No newline at end of file diff --git a/server/services/expressServer.js b/server/services/expressServer.js new file mode 100644 index 00000000..b292da4f --- /dev/null +++ b/server/services/expressServer.js @@ -0,0 +1,76 @@ +// app require +var express = require('express'); +var fs = require('fs'); +var http = require('http'); +var https = require('https'); +var favicon = require('serve-favicon'); +var morgan = require('morgan'); +var methodOverride = require('method-override'); +var bodyParser = require('body-parser'); +var cookieParser = require('cookie-parser'); +var errorHandler = require('errorhandler'); +var logger = require('winston'); + +// local require +var config = require('../config.js')(); +var api = require('../routes/api.js'); + + + +var initApp = function(app){ + + app.set('port', process.env.PORT || config.expressHttpPort); + + app.use(methodOverride()); + app.use(bodyParser.json()); + app.use(cookieParser()); + app.use(bodyParser.urlencoded({ extended: true })); + + app.use(morgan('combined', { + skip: function (req, res) { return res.statusCode < 400 } + })); + + // development env + if (app.get('env') === 'development') { + logger.level = 'debug'; + logger.debug('running in development env'); + app.use(errorHandler({ dumpExceptions: true, showStack: true })); + }; + + // production only + if (app.get('env') === 'production') { + logger.debug('running in production env'); + app.use(errorHandler()); + }; + + // --JSON API-- + + // dummy + app.get('/api/dummy/:id', api.dummy); +}; + + +var onAppStart = function(){ + // express server + var app = express(); + + initApp(app); + + var server = http.Server(app); + var httpsServer = https.createServer(sslOptions, app); + + + // start server + server.listen(app.get('port'), function(){ + logger.info('Express server listening on port ' + app.get('port') + ' @' + app.get('env')); + }); + // start ssl server + httpsServer.listen(config.expressHttpsPort, function(){ + logger.info('Express https server listening on port ' + config.expressHttpsPort + ' @' + app.get('env')); + }); +}; + +exports.onAppStart = onAppStart; + + +