chat.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. /*
  2. 回复油气回收在线监控站级系统定义
  3. TOKEN_NULL_R 获取token无效
  4. CONNECT_ERROR_T 连接第三方服务器失败
  5. INTERFACE_UNDEFINED 接口未定义
  6. */
  7. require('./HtmlServer.js')
  8. var crypto = require('crypto');
  9. const EventEmitter = require('events');
  10. const emitter = new EventEmitter()
  11. emitter.setMaxListeners(100)
  12. // var MongoClient = require('mongodb').MongoClient;
  13. // var dburl = "mongodb://localhost:27017/vr";
  14. // MongoClient.connect(dburl, { useNewUrlParser: true }, function (err, db) {
  15. // if (err) throw err;
  16. // console.log("数据库已创建!");
  17. // });
  18. var mysql = require('mysql');
  19. var connection = mysql.createConnection({
  20. host: 'localhost',
  21. user: 'root',
  22. password: 'HS1205',
  23. database: 'vr'
  24. });
  25. connection.connect();
  26. //log
  27. var sd = require('silly-datetime');
  28. var time = sd.format(new Date(), 'YYYY-MM-DD');
  29. const log4js = require('log4js');
  30. log4js.configure({
  31. appenders: { WebLog: { type: 'file', filename: './WebLog/' + time + '.log' } },
  32. categories: { default: { appenders: ['WebLog'], level: 'trace' } }
  33. });
  34. const log = log4js.getLogger('WebLog');
  35. console.log('服务器启动!');
  36. log.trace('服务器启动!');
  37. var logs = [];
  38. var oneSecond = 1000;
  39. setInterval(function () {
  40. var time2 = sd.format(new Date(), 'YYYY-MM-DD');
  41. if (time2 != time) {
  42. log4js.configure({
  43. appenders: { WebLog: { type: 'file', filename: './WebLog/' + time2 + '.log' } },
  44. categories: { default: { appenders: ['WebLog'], level: 'trace' } }
  45. });
  46. time = time2;
  47. }
  48. }, oneSecond);
  49. var http0 = require('http');
  50. var qs = require('querystring');
  51. var options = {
  52. hostname: '101.231.215.60',
  53. port: 15780,
  54. path: '/eldf.portal-service/auth/equipmentLogin',
  55. method: 'POST',
  56. headers: {
  57. 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
  58. }
  59. };
  60. function prehandle(key, ra, json, inf) {
  61. var path;
  62. var ip;
  63. if (ra) {
  64. if (ra == '::1') {
  65. ip = 'localhost'
  66. path = key + ' ' + ip;
  67. }
  68. else {
  69. ip = ra.split('::')[1].split(':')[1]
  70. path = key + ' ' + ip;
  71. }
  72. }
  73. else {
  74. console.log('ra 无定义');
  75. return;
  76. }
  77. console.log(path);
  78. log4js.configure({
  79. appenders: { WebLog: { type: 'file', filename: './WebLog/' + path + '/' + time + '.log' } },
  80. categories: { default: { appenders: ['WebLog'], level: 'trace' } }
  81. });
  82. if (inf == 'GSRecycleDataEvent' || inf == 'GSAlarmDataEvent' || inf == 'GSConfigurationDataEvent') {
  83. var e0 = Buffer(JSON.parse(json)['message']['busObject'], 'base64').toString();
  84. e0 = JSON.parse(e0);
  85. e0['userid'] = key;
  86. e0['ip'] = ip;
  87. var setname;
  88. if (inf == 'GSRecycleDataEvent') {
  89. setname = 'record'
  90. }
  91. else if (inf == 'GSAlarmDataEvent') {
  92. setname = 'warning'
  93. }
  94. else if (inf == 'GSConfigurationDataEvent') {
  95. setname = 'config'
  96. }
  97. if (setname == 'record') {
  98. var addSql = 'INSERT INTO t_records(GID,id,name,fip,noz,vlr,yll,qll,time,ip) VALUES(0,?,?,?,?,?,?,?,?,?)';
  99. //var addSqlParams = [2, '', 2, 2, 0.9, , , '2019-03-05 17:05:10', 'local'];
  100. var addSqlParams = [e0.userid, "", e0.jyjid, e0.jyqid, e0.al,e0.yll ,e0.qll , e0.monitorTime, e0.ip];
  101. //增
  102. connection.query(addSql, addSqlParams, function (err, result) {
  103. if (err) {
  104. console.log('[INSERT ERROR] - ', err.message);
  105. return;
  106. }
  107. console.log('--------------------------INSERT----------------------------');
  108. //console.log('INSERT ID:',result.insertId);
  109. console.log('INSERT ID:', result);
  110. console.log('-----------------------------------------------------------------\n\n');
  111. });
  112. }
  113. // MongoClient.connect(dburl, { useNewUrlParser: true }, function (err, db) {
  114. // if (err) throw err;
  115. // var dbo = db.db("vr");
  116. // var myobj = e0;
  117. // dbo.collection(setname).insertOne(myobj, function (err, res) {
  118. // if (err) throw err;
  119. // console.log(setname + "插入数据库成功");
  120. // db.close();
  121. // });
  122. // });
  123. }
  124. else if (inf == 'GSEnvironmentDataEvent') {
  125. var e0 = Buffer(JSON.parse(json)['message']['busObject'], 'base64').toString();
  126. e0 = JSON.parse(e0);
  127. var e2 = [];
  128. for (var i = 0; i < e0.length; i++) {
  129. var e1 = e0[i];
  130. e1['userid'] = key;
  131. e1['ip'] = ip;
  132. e2.push(e1);
  133. }
  134. // MongoClient.connect(dburl, { useNewUrlParser: true }, function (err, db) {
  135. // if (err) throw err;
  136. // var dbo = db.db("vr");
  137. // var myobj = e2;
  138. // dbo.collection("envir").insertMany(myobj, function (err, res) {
  139. // if (err) throw err;
  140. // console.log("环境数据插入成功");
  141. // db.close();
  142. // });
  143. // });
  144. }
  145. }
  146. function SendData(params, res, key) {
  147. //计算hamc
  148. var readjson = JSON.parse(params.query.json);
  149. var caldata = JSON.stringify((JSON.parse(params.query.json))['message']);
  150. var hashread = crypto.createHmac('SHA256', "aEUjjsauUjK93").update(caldata).digest('hex');
  151. readjson['hmac'] = hashread;
  152. var sendjson = JSON.stringify(readjson);
  153. var sendData = sendjson;
  154. //向第三方服务器发送数据
  155. sendcount_++
  156. console.log(`${sendcount_} send`)
  157. times[sendcount_] = new Date();
  158. socket[key].emit(params.query.in, sendData, function (data) { //data为服务器端返回的数据
  159. console.log('收到远程返回数据:' + data);
  160. log.trace('收到远程返回数据' + data);
  161. //将第三方服务器返回的数据发回给http client,即油气回收在线监控站级系统
  162. res.setHeader("content-type", "text/html;charset=UTF-8")
  163. res.end(data)
  164. recvcount++;
  165. console.log(`${recvcount} recv`)
  166. if (times[recvcount]) {
  167. console.log(`耗时 ${(new Date()).getTime() - times[recvcount].getTime()} ms`)
  168. }
  169. else {
  170. console.log('没找到对应的sendcount_')
  171. }
  172. });
  173. }
  174. var client = [];
  175. var socket = [];
  176. var clientcount = 0;
  177. var sendcount_ = 0;
  178. var recvcount = 0;
  179. var times = [];
  180. var con = require('./conn.js');
  181. function Timer_Main(Interval) {
  182. }
  183. var myInterval_main = setInterval(Timer_Main, 1000, "");
  184. const http = require("http")
  185. const url = require("url")
  186. const queryString = require("querystring")
  187. //建立http server,监听来自http client,即油气回收站级系统的数据
  188. const server = http.createServer((req, res) => {
  189. //req.url 请求的URL
  190. // GET QUERY params
  191. res.setHeader("Access-Control-Allow-Origin", "*");
  192. let methods = req.method;
  193. if (methods == "GET") {
  194. let params = url.parse(req.url, true, true);
  195. if (params.href == "/favicon.ico") {
  196. return;
  197. }
  198. else {
  199. var cityno = params.query.cityno;
  200. if (cityno == "0") {
  201. if (!params.query.id || params.query.id == '' || params.query.id == '0') {
  202. console.log('无效的用户标识' + req.headers.host + ' ' + params.query.cc);
  203. log.trace('无效的用户标识' + req.headers.host + ' ' + params.query.cc);
  204. return;
  205. }
  206. var key = params.query.id;
  207. prehandle(key, req.connection.remoteAddress, params.query.json, params.query.in)
  208. console.log('收到客户端请求数据:' + params.query.json);
  209. log.trace('收到客户端请求数据' + params.query.json);
  210. clientcount++;
  211. console.log('clientcount:', clientcount);
  212. res.setHeader("content-type", "text/html;charset=UTF-8")
  213. res.end('data')
  214. return;
  215. }
  216. else if (cityno == "1") {
  217. if (!params.query.cc || params.query.cc == '') {
  218. log4js.configure({
  219. appenders: { WebLog: { type: 'file', filename: './WebLog/' + time + '.log' } },
  220. categories: { default: { appenders: ['WebLog'], level: 'trace' } }
  221. });
  222. console.log('无效的用户标识' + req.headers.host + ' ' + params.query.cc);
  223. log.trace('无效的用户标识' + req.headers.host + ' ' + params.query.cc);
  224. return;
  225. }
  226. }
  227. else {
  228. log4js.configure({
  229. appenders: { WebLog: { type: 'file', filename: './WebLog/' + time + '.log' } },
  230. categories: { default: { appenders: ['WebLog'], level: 'trace' } }
  231. });
  232. console.log('无效的城市标识' + req.headers.host + ' ' + cityno);
  233. log.trace('无效的城市标识' + req.headers.host + ' ' + cityno);
  234. return;
  235. }
  236. }
  237. var key = params.query.cc; //不同客户端的唯一标识,目前还未最终确定,先用cc
  238. if (!client[key]) //第一次收到某客户端的数据
  239. {
  240. var user = {};
  241. user.cc = params.query.cc;
  242. user.un = params.query.un;
  243. user.pw = params.query.pw;
  244. user.hmac = Buffer(params.query.hc, 'base64').toString();
  245. user.ConnectState = false;
  246. client[key] = user;
  247. }
  248. else {
  249. if (socket[key]) {
  250. client[key].ConnectState = socket[key].connected;
  251. }
  252. else {
  253. client[key].ConnectState = false;
  254. }
  255. }
  256. prehandle(key, req.connection.remoteAddress, params.query.json, params.query.in)
  257. console.log('收到客户端请求数据:' + params.query.json);
  258. log.trace('收到客户端请求数据' + params.query.json);
  259. clientcount++;
  260. console.log('clientcount:', clientcount);
  261. if (client[key].ConnectState == false) {
  262. //获取tocken
  263. var tokenreq = http0.request(options, function (res0) {
  264. res0.setEncoding('utf8');
  265. res0.on('data', function (chunk) {
  266. client[key].token = (JSON.parse(chunk)).accessToken;
  267. console.log("accessToken:" + client[key].token);
  268. log.trace('获取到accessToken');
  269. if (client[key].token == null) {
  270. console.log("获取到的accessToken无效");
  271. log.trace('获取到的accessToken无效');
  272. return;
  273. }
  274. //尝试连接第三方服务器
  275. var host = 'http://101.231.215.60:15790'
  276. const io = require('socket.io-client');
  277. socket[key] = io.connect(host, {
  278. query: 'token=' + client[key].token
  279. , transports: ['websocket'], reconnection: false, reconnectionDelay: 5000
  280. });
  281. console.log('尝试连接' + host);
  282. log.trace('尝试连接' + host);
  283. //第三方服务器连接成功
  284. socket[key].on('connect', function () {
  285. console.log('connect success!');
  286. log.trace('连接成功!');
  287. SendData(params, res, key);
  288. });
  289. socket[key].on('disconnect', () => {
  290. console.log('连接断开');
  291. log.trace('连接断开!');
  292. });
  293. socket[key].on('connect_error', (error) => {
  294. console.log(error);
  295. log.trace('连接远程服务器失败!');
  296. });
  297. });
  298. });
  299. tokenreq.on('error', function (e) {
  300. client[key].token = '';
  301. //尝试获取token失败
  302. console.log('problem with token request: ' + e.message);
  303. log.error('problem with token request: ' + e.message);
  304. });
  305. // write data to request body
  306. var post_data = {};
  307. post_data.companyCode = client[key].cc;
  308. post_data.username = client[key].un;
  309. post_data.password = client[key].pw;
  310. var contenti = qs.stringify(post_data);
  311. tokenreq.write(contenti);
  312. tokenreq.end();
  313. }
  314. else {
  315. SendData(params, res, key);
  316. /*
  317. req.on('error', function (e) {
  318. console.log('problem with request: ' + e.message);
  319. log.trace('problem with request: ' + e.message);
  320. //console.log('请求token失败'+data);
  321. res.setHeader("content-type","text/html;charset=UTF-8")
  322. res.end("{\"success\":false,\"errorCode\":\"TOKEN_ERROR_RELAYSERVER\",\"errorMessage\":\"\"}")
  323. });
  324. */
  325. /*
  326. socket.on('connect_timeout', (timeout) => {
  327. console.log('connect_timeout');
  328. });
  329. */
  330. }
  331. } else {
  332. let datas = "";
  333. req.on("data", (chunk) => {
  334. datas += chunk;
  335. console.log(datas)
  336. })
  337. req.on("end", () => {
  338. //如果是ajax post请求这里换成JSON.parse
  339. let postData = queryString.parse(datas.toString())
  340. console.log(postData)
  341. })
  342. res.setHeader("content-type", "text/html;charset=UTF-8")
  343. res.end("当前请求方式为post")
  344. }
  345. })
  346. var port = 10097;
  347. server.listen(port, () => {
  348. log.trace('server is ready on port ' + port);
  349. })