/* 回复油气回收在线监控站级系统定义 TOKEN_NULL_R 获取token无效 CONNECT_ERROR_T 连接第三方服务器失败 INTERFACE_UNDEFINED 接口未定义 */ require('./HtmlServer.js') var crypto = require('crypto'); const EventEmitter = require('events'); const emitter = new EventEmitter() emitter.setMaxListeners(100) // var MongoClient = require('mongodb').MongoClient; // var dburl = "mongodb://localhost:27017/vr"; // MongoClient.connect(dburl, { useNewUrlParser: true }, function (err, db) { // if (err) throw err; // console.log("数据库已创建!"); // }); var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'HS1205', database: 'vr' }); connection.connect(); //log var sd = require('silly-datetime'); var time = sd.format(new Date(), 'YYYY-MM-DD'); const log4js = require('log4js'); log4js.configure({ appenders: { WebLog: { type: 'file', filename: './WebLog/' + time + '.log' } }, categories: { default: { appenders: ['WebLog'], level: 'trace' } } }); const log = log4js.getLogger('WebLog'); console.log('服务器启动!'); log.trace('服务器启动!'); var logs = []; var oneSecond = 1000; setInterval(function () { var time2 = sd.format(new Date(), 'YYYY-MM-DD'); if (time2 != time) { log4js.configure({ appenders: { WebLog: { type: 'file', filename: './WebLog/' + time2 + '.log' } }, categories: { default: { appenders: ['WebLog'], level: 'trace' } } }); time = time2; } }, oneSecond); var http0 = require('http'); var qs = require('querystring'); var options = { hostname: '101.231.215.60', port: 15780, path: '/eldf.portal-service/auth/equipmentLogin', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } }; function prehandle(key, ra, json, inf) { var path; var ip; if (ra) { if (ra == '::1') { ip = 'localhost' path = key + ' ' + ip; } else { ip = ra.split('::')[1].split(':')[1] path = key + ' ' + ip; } } else { console.log('ra 无定义'); return; } console.log(path); log4js.configure({ appenders: { WebLog: { type: 'file', filename: './WebLog/' + path + '/' + time + '.log' } }, categories: { default: { appenders: ['WebLog'], level: 'trace' } } }); if (inf == 'GSRecycleDataEvent' || inf == 'GSAlarmDataEvent' || inf == 'GSConfigurationDataEvent') { var e0 = Buffer(JSON.parse(json)['message']['busObject'], 'base64').toString(); e0 = JSON.parse(e0); e0['userid'] = key; e0['ip'] = ip; var setname; if (inf == 'GSRecycleDataEvent') { setname = 'record' } else if (inf == 'GSAlarmDataEvent') { setname = 'warning' } else if (inf == 'GSConfigurationDataEvent') { setname = 'config' } if (setname == 'record') { var addSql = 'INSERT INTO t_records(GID,id,name,fip,noz,vlr,yll,qll,time,ip) VALUES(0,?,?,?,?,?,?,?,?,?)'; //var addSqlParams = [2, '', 2, 2, 0.9, , , '2019-03-05 17:05:10', 'local']; var addSqlParams = [e0.userid, "", e0.jyjid, e0.jyqid, e0.al,e0.yll ,e0.qll , e0.monitorTime, e0.ip]; //增 connection.query(addSql, addSqlParams, function (err, result) { if (err) { console.log('[INSERT ERROR] - ', err.message); return; } console.log('--------------------------INSERT----------------------------'); //console.log('INSERT ID:',result.insertId); console.log('INSERT ID:', result); console.log('-----------------------------------------------------------------\n\n'); }); } // MongoClient.connect(dburl, { useNewUrlParser: true }, function (err, db) { // if (err) throw err; // var dbo = db.db("vr"); // var myobj = e0; // dbo.collection(setname).insertOne(myobj, function (err, res) { // if (err) throw err; // console.log(setname + "插入数据库成功"); // db.close(); // }); // }); } else if (inf == 'GSEnvironmentDataEvent') { var e0 = Buffer(JSON.parse(json)['message']['busObject'], 'base64').toString(); e0 = JSON.parse(e0); var e2 = []; for (var i = 0; i < e0.length; i++) { var e1 = e0[i]; e1['userid'] = key; e1['ip'] = ip; e2.push(e1); } // MongoClient.connect(dburl, { useNewUrlParser: true }, function (err, db) { // if (err) throw err; // var dbo = db.db("vr"); // var myobj = e2; // dbo.collection("envir").insertMany(myobj, function (err, res) { // if (err) throw err; // console.log("环境数据插入成功"); // db.close(); // }); // }); } } function SendData(params, res, key) { //计算hamc var readjson = JSON.parse(params.query.json); var caldata = JSON.stringify((JSON.parse(params.query.json))['message']); var hashread = crypto.createHmac('SHA256', "aEUjjsauUjK93").update(caldata).digest('hex'); readjson['hmac'] = hashread; var sendjson = JSON.stringify(readjson); var sendData = sendjson; //向第三方服务器发送数据 sendcount_++ console.log(`${sendcount_} send`) times[sendcount_] = new Date(); socket[key].emit(params.query.in, sendData, function (data) { //data为服务器端返回的数据 console.log('收到远程返回数据:' + data); log.trace('收到远程返回数据' + data); //将第三方服务器返回的数据发回给http client,即油气回收在线监控站级系统 res.setHeader("content-type", "text/html;charset=UTF-8") res.end(data) recvcount++; console.log(`${recvcount} recv`) if (times[recvcount]) { console.log(`耗时 ${(new Date()).getTime() - times[recvcount].getTime()} ms`) } else { console.log('没找到对应的sendcount_') } }); } var client = []; var socket = []; var clientcount = 0; var sendcount_ = 0; var recvcount = 0; var times = []; var con = require('./conn.js'); function Timer_Main(Interval) { } var myInterval_main = setInterval(Timer_Main, 1000, ""); const http = require("http") const url = require("url") const queryString = require("querystring") //建立http server,监听来自http client,即油气回收站级系统的数据 const server = http.createServer((req, res) => { //req.url 请求的URL // GET QUERY params res.setHeader("Access-Control-Allow-Origin", "*"); let methods = req.method; if (methods == "GET") { let params = url.parse(req.url, true, true); if (params.href == "/favicon.ico") { return; } else { var cityno = params.query.cityno; if (cityno == "0") { if (!params.query.id || params.query.id == '' || params.query.id == '0') { console.log('无效的用户标识' + req.headers.host + ' ' + params.query.cc); log.trace('无效的用户标识' + req.headers.host + ' ' + params.query.cc); return; } var key = params.query.id; prehandle(key, req.connection.remoteAddress, params.query.json, params.query.in) console.log('收到客户端请求数据:' + params.query.json); log.trace('收到客户端请求数据' + params.query.json); clientcount++; console.log('clientcount:', clientcount); res.setHeader("content-type", "text/html;charset=UTF-8") res.end('data') return; } else if (cityno == "1") { if (!params.query.cc || params.query.cc == '') { log4js.configure({ appenders: { WebLog: { type: 'file', filename: './WebLog/' + time + '.log' } }, categories: { default: { appenders: ['WebLog'], level: 'trace' } } }); console.log('无效的用户标识' + req.headers.host + ' ' + params.query.cc); log.trace('无效的用户标识' + req.headers.host + ' ' + params.query.cc); return; } } else { log4js.configure({ appenders: { WebLog: { type: 'file', filename: './WebLog/' + time + '.log' } }, categories: { default: { appenders: ['WebLog'], level: 'trace' } } }); console.log('无效的城市标识' + req.headers.host + ' ' + cityno); log.trace('无效的城市标识' + req.headers.host + ' ' + cityno); return; } } var key = params.query.cc; //不同客户端的唯一标识,目前还未最终确定,先用cc if (!client[key]) //第一次收到某客户端的数据 { var user = {}; user.cc = params.query.cc; user.un = params.query.un; user.pw = params.query.pw; user.hmac = Buffer(params.query.hc, 'base64').toString(); user.ConnectState = false; client[key] = user; } else { if (socket[key]) { client[key].ConnectState = socket[key].connected; } else { client[key].ConnectState = false; } } prehandle(key, req.connection.remoteAddress, params.query.json, params.query.in) console.log('收到客户端请求数据:' + params.query.json); log.trace('收到客户端请求数据' + params.query.json); clientcount++; console.log('clientcount:', clientcount); if (client[key].ConnectState == false) { //获取tocken var tokenreq = http0.request(options, function (res0) { res0.setEncoding('utf8'); res0.on('data', function (chunk) { client[key].token = (JSON.parse(chunk)).accessToken; console.log("accessToken:" + client[key].token); log.trace('获取到accessToken'); if (client[key].token == null) { console.log("获取到的accessToken无效"); log.trace('获取到的accessToken无效'); return; } //尝试连接第三方服务器 var host = 'http://101.231.215.60:15790' const io = require('socket.io-client'); socket[key] = io.connect(host, { query: 'token=' + client[key].token , transports: ['websocket'], reconnection: false, reconnectionDelay: 5000 }); console.log('尝试连接' + host); log.trace('尝试连接' + host); //第三方服务器连接成功 socket[key].on('connect', function () { console.log('connect success!'); log.trace('连接成功!'); SendData(params, res, key); }); socket[key].on('disconnect', () => { console.log('连接断开'); log.trace('连接断开!'); }); socket[key].on('connect_error', (error) => { console.log(error); log.trace('连接远程服务器失败!'); }); }); }); tokenreq.on('error', function (e) { client[key].token = ''; //尝试获取token失败 console.log('problem with token request: ' + e.message); log.error('problem with token request: ' + e.message); }); // write data to request body var post_data = {}; post_data.companyCode = client[key].cc; post_data.username = client[key].un; post_data.password = client[key].pw; var contenti = qs.stringify(post_data); tokenreq.write(contenti); tokenreq.end(); } else { SendData(params, res, key); /* req.on('error', function (e) { console.log('problem with request: ' + e.message); log.trace('problem with request: ' + e.message); //console.log('请求token失败'+data); res.setHeader("content-type","text/html;charset=UTF-8") res.end("{\"success\":false,\"errorCode\":\"TOKEN_ERROR_RELAYSERVER\",\"errorMessage\":\"\"}") }); */ /* socket.on('connect_timeout', (timeout) => { console.log('connect_timeout'); }); */ } } else { let datas = ""; req.on("data", (chunk) => { datas += chunk; console.log(datas) }) req.on("end", () => { //如果是ajax post请求这里换成JSON.parse let postData = queryString.parse(datas.toString()) console.log(postData) }) res.setHeader("content-type", "text/html;charset=UTF-8") res.end("当前请求方式为post") } }) var port = 10097; server.listen(port, () => { log.trace('server is ready on port ' + port); })