@@ -0,0 +1,120 @@ | |||
const total = `AN_1_1,助燃风故障报警 | |||
AN_1_2,压延机冷却风故障报警 | |||
AN_1_3,L吊墙冷却风机故障报警 | |||
AN_1_4,熔化带及部分澄清部冷却风机故障报警 | |||
AN_2_1,澄清带池壁冷却风机故障报警 | |||
AN_2_2,钢碴碴冷却风机故障报警 | |||
AN_2_3,支通路拐角冷却风机报警 | |||
AN_2_4,吊墙吊钩砖结构温升报警 | |||
AN_3_1,深层水包冷却水温升报警 | |||
AN_3_2,深层水包冷却水断水报警 | |||
AN_3_3,卡脖吊平冷却水断水报警 | |||
AN_3_4,卡脖吊平喧冷却水温升报警 | |||
AN_4_1,液面计冷却水断水报警 | |||
AN_4_2,液面计冷却水温升报警 | |||
AN_4_3,循环水入口压力低报警 | |||
AN_4_4,天然气压力高低报警 | |||
AN_5_1,助燃风风压低报警 | |||
AN_5_2,净化压缩气压力低报警 | |||
AN_5_3,普通压缩空气压力高低报警 | |||
AN_5_4,焦炉煤气气压力高低报警 | |||
AN_6_1,换向过程故障报警 | |||
AN_6_2,空交机换向不到位报警 | |||
AN_6_3,投料机故障报警 | |||
AN_6_4,备用 | |||
AN_7_1,1#压延机冷却水断水报警 | |||
AN_7_2,1#压延机冷却水温升报警 | |||
AN_7_3,1#过渡辊台冷却水断水报警 | |||
AN_7_4,1过渡辊台冷却水温升报警 | |||
AN_8_1,1#线唇砖冷却水断水报警 | |||
AN_8_2,1#线唇砖冷却水温升报警 | |||
AN_8_3,1#退火窑A区风机报警 | |||
AN_8_4,1#退火窑B区风机报警 | |||
AN_9_1,1#退火窑c区风机报警 | |||
AN_9_2,1#退火窑Ret1区风机报警 | |||
AN_9_3,1#退火窑Ret2区风机报警 | |||
AN_9_4,1#退火窑F1区风机报警 | |||
AN_10_1,1#退火窑F2区风机报警 | |||
AN_10_2,1#主传动报警 | |||
AN_10_3,1#压延机报警 | |||
AN_10_4,备用 | |||
AN_11_1,2#压延机冷却水断水报警 | |||
AN_11_2,2#压延机冷却水温升报警 | |||
AN_11_3,2#过渡辊台冷却水断水报警 | |||
AN_11_4,2#过渡辊台冷却水温升报警 | |||
AN_12_1,2#线唇砖冷却水断水报警 | |||
AN_12_2,2#线唇砖冷却水温升报警 | |||
AN_12_3,2#退火窑A区风机报警 | |||
AN_12_4,2#退火窑B区风机报警 | |||
AN_13_1,2#退火窑c区风机报警 | |||
AN_13_2,2#退火窑Ret1区风机报警 | |||
AN_13_3,2#退火窑Ret2区风机报警 | |||
AN_13_4,2#退火窑F1区风机报警 | |||
AN_14_1,2#退火窑F2区风机报警 | |||
AN_14_2,2#主传动报警 | |||
AN_14_3,2#压延机报警 | |||
AN_14_4,备用 | |||
AN_15_1,3#压延机冷却水断水报警 | |||
AN_15_2,3压延机冷却水温升报警 | |||
AN_15_3,3#过渡辊台冷却水断水报警 | |||
AN_15_4,3#过渡辊台冷却水温升报警 | |||
AN_16_1,3#线唇砖冷却水断水报警 | |||
AN_16_2,3#线唇砖冷却水温升报警 | |||
AN_16_3,3#退火窑A区风机报警 | |||
AN_16_4,3#退火窑B区风机报警 | |||
AN_17_1,3#退火窑c区风机报警 | |||
AN_17_2,3#退火窑Ret1区风机报警 | |||
AN_17_3,3#退火窑Ret2区风机报警 | |||
AN_17_4,3#退火窑F1区风机报警 | |||
AN_18_1,3#退火窑F2区风机报警 | |||
AN_18_2,3#主传动报警 | |||
AN_18_3,3#压延机报警 | |||
AN_18_4,备用 | |||
AN_19_1,4#压延机冷却水断水报警 | |||
AN_19_2,4压延机冷却水温升报警 | |||
AN_19_3,4#过渡辊台冷却水断水报警 | |||
AN_19_4,4#过渡辊台冷却水温升报警 | |||
AN_20_1,4#线唇砖冷却水断水报警 | |||
AN_20_2,4#线唇砖冷却水温升报警 | |||
AN_20_3,4#退火窑A区风机报警 | |||
AN_20_4,4#退火窑B区风机报警 | |||
AN_21_1,4#退火窑c区风机报警 | |||
AN_21_2,4#退火窑Ret1区风机报警 | |||
AN_21_3,4#退火窑Ret2区风机报警 | |||
AN_21_4,4#退火窑F1区风机报警 | |||
AN_22_1,4#退火窑F2区风机报警 | |||
AN_22_2,4#主传动报警 | |||
AN_22_3,4#压延机报警 | |||
AN_23_1,5#压延机冷却水断水报警 | |||
AN_23_2,5#压延机冷却水温升报警 | |||
AN_23_3,5#过渡辊台冷却水断水报警 | |||
AN_23_4,5#过渡台冷却水温升报警 | |||
AN_24_1,5#线唇砖冷却水断水报警 | |||
AN_24_2,5#线唇砖冷却水温升报警 | |||
AN_24_3,5#退火窑A区风机报警 | |||
AN_24_4,5#退火窑B区风机报警 | |||
AN_25_1,5#退火窑c区风机报警 | |||
AN_25_2,5#退火窑Ret1区风机报警 | |||
AN_25_3,5#退火窑Ret2区风机报警 | |||
AN_25_4,5#退火窑F1区风机报警 | |||
AN_26_1,5#退火窑F2区风机报警 | |||
AN_26_2,5#主传动报警 | |||
AN_26_3,5#压延机报警 | |||
`; | |||
// const totalAlarmList = total.split("\n"); | |||
const getRandomAlarmList = function (num) { | |||
const totalAlarmList = total.split("\n"); | |||
let alarmList = []; | |||
for (let i = 0; i < num; i++) { | |||
let index = Math.floor(Math.random() * totalAlarmList.length); | |||
const chosen = totalAlarmList[index]; | |||
totalAlarmList.splice(index, 1); | |||
alarmList.push(chosen); | |||
} | |||
return alarmList; | |||
}; | |||
module.exports = { | |||
getRandomAlarmList, | |||
}; |
@@ -0,0 +1,44 @@ | |||
{ | |||
"name": "ws-server", | |||
"version": "0.0.1", | |||
"lockfileVersion": 2, | |||
"requires": true, | |||
"packages": { | |||
"": { | |||
"name": "ws-server", | |||
"version": "0.0.1", | |||
"license": "ISC", | |||
"dependencies": { | |||
"ws": "^8.16.0" | |||
} | |||
}, | |||
"node_modules/ws": { | |||
"version": "8.16.0", | |||
"resolved": "https://registry.npmmirror.com/ws/-/ws-8.16.0.tgz", | |||
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", | |||
"engines": { | |||
"node": ">=10.0.0" | |||
}, | |||
"peerDependencies": { | |||
"bufferutil": "^4.0.1", | |||
"utf-8-validate": ">=5.0.2" | |||
}, | |||
"peerDependenciesMeta": { | |||
"bufferutil": { | |||
"optional": true | |||
}, | |||
"utf-8-validate": { | |||
"optional": true | |||
} | |||
} | |||
} | |||
}, | |||
"dependencies": { | |||
"ws": { | |||
"version": "8.16.0", | |||
"resolved": "https://registry.npmmirror.com/ws/-/ws-8.16.0.tgz", | |||
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", | |||
"requires": {} | |||
} | |||
} | |||
} |
@@ -0,0 +1,15 @@ | |||
{ | |||
"name": "ws-server", | |||
"version": "0.0.1", | |||
"description": "a simple dev ws-server", | |||
"main": "server.js", | |||
"scripts": { | |||
"test": "echo \"Error: no test specified\" && exit 1", | |||
"start": "node server.js" | |||
}, | |||
"author": "", | |||
"license": "ISC", | |||
"dependencies": { | |||
"ws": "^8.16.0" | |||
} | |||
} |
@@ -0,0 +1,105 @@ | |||
import { WebSocket, WebSocketServer } from "ws"; | |||
import template from "./template.json"; | |||
import utils from "./utils"; | |||
const wss = new WebSocketServer({ port: 9800 }); | |||
const frequency = 10; // seconds | |||
const frequency1 = 1200; // seconds | |||
wss.on("connection", function (ws, req) { | |||
// console.log("ws", ws); | |||
console.log( | |||
"Client in: ", | |||
req.socket.remoteAddress, | |||
"current users:", | |||
wss.clients.size | |||
); | |||
// ws.on("error", console.error); | |||
// ws.emit("message", "connected"); | |||
ws.on("open", function () { | |||
console.log("connected"); | |||
ws.send("connected"); | |||
}); | |||
ws.on("message", function (msg) { | |||
console.log("message from client", msg); | |||
ws.send("echo " + msg.toString()); | |||
}); | |||
ws.on("error", console.error); | |||
const timer = setInterval(() => { | |||
sendMsg(ws, "kiln-info"); // 窑炉信息 | |||
sendMsg(ws, "energy-cost"); // 运行状态 | |||
sendMsg(ws, "run-state"); // 运行状态 | |||
sendMsg(ws, "realtime"); | |||
sendMsg(ws, "his-trend"); | |||
// sendMsg(ws, 'gas'); | |||
// sendMsg(ws, 'kiln-top'); | |||
// sendMsg(ws, 'kiln-bottom'); | |||
}, frequency * 1000); | |||
const timer1 = setInterval(() => { | |||
// sendMsg(ws, 'run-state'); // 运行状态 | |||
}, frequency1 * 1000); | |||
ws.on("close", function () { | |||
console.log("停止监听"); | |||
clearInterval(timer); | |||
clearInterval(timer1); | |||
}); | |||
}); | |||
function sendMsg(ws, type) { | |||
let data = {}; | |||
switch (type) { | |||
case "kiln-info": | |||
for (const key in template.kilnInfo) { | |||
data[key] = utils.getRandom(template.kilnInfo[key]); | |||
} | |||
break; | |||
case "energy-cost": | |||
for (const key in template.energyCost) { | |||
data[key] = utils.getRandom(template.energyCost[key]); | |||
} | |||
break; | |||
case "run-state": | |||
data = template.runState; | |||
data.fireDirection = | |||
Math.floor(Math.random() * 10) % 2 === 0 ? "南火" : "北火"; | |||
break; | |||
case "realtime": | |||
/** 天然气 实时流量 */ | |||
data.gasii = template.realtime.gasii.map((v) => utils.getRandom(v)); | |||
/** 助燃风 实时流量 */ | |||
data.wind = template.realtime.wind.map((v) => utils.getRandom(v)); | |||
break; | |||
case "his-trend": | |||
const hisTrend = { | |||
gas: {}, | |||
wind: {}, | |||
}; | |||
Object.keys(template.hisTrend.gas).forEach((key) => { | |||
hisTrend.gas[key] = template.hisTrend.gas[key].map((v) => | |||
utils.getRandom(v) | |||
); | |||
}); | |||
Object.keys(template.hisTrend.wind).forEach((key) => { | |||
hisTrend.wind[key] = template.hisTrend.wind[key].map((v) => | |||
utils.getRandom(v) | |||
); | |||
}); | |||
data = hisTrend; | |||
break; | |||
case "gas": | |||
// data = template.gas; | |||
break; | |||
case "kiln-top": | |||
// data = template.kilnTop; | |||
break; | |||
case "kiln-bottom": | |||
// data = template.kilnBottom; | |||
break; | |||
default: | |||
// data = 'You are connected!'; | |||
break; | |||
} | |||
ws.send(JSON.stringify({ type, data })); | |||
} |
@@ -1,55 +1,45 @@ | |||
import { WebSocket, WebSocketServer } from "ws"; | |||
import template from "./template.json"; | |||
import utils from "./utils"; | |||
const { WebSocket } = require("ws"); | |||
const { getRandomAlarmList } = require("./fakedata/alarmList"); | |||
const wss = new WebSocket.Server({ port: 9800 }); | |||
console.log('[websocket] server created'); | |||
const wss = new WebSocketServer({ port: 9800 }); | |||
const frequency = 10; // seconds | |||
const frequency1 = 1200; // seconds | |||
wss.on("connection", function (ws, req) { | |||
// console.log("ws", ws); | |||
console.log( | |||
"Client in: ", | |||
"[用户连接]: ", | |||
req.socket.remoteAddress, | |||
"current users:", | |||
"当前总用户数:", | |||
wss.clients.size | |||
); | |||
// ws.on("error", console.error); | |||
// ws.emit("message", "connected"); | |||
ws.on("open", function () { | |||
console.log("connected"); | |||
console.log('[websocket] opened'); | |||
ws.send("connected"); | |||
}); | |||
ws.on("message", function (msg) { | |||
console.log("message from client", msg); | |||
ws.send("echo " + msg.toString()); | |||
console.log("[==>]", msg); | |||
}); | |||
ws.on("error", console.error); | |||
const timer = setInterval(() => { | |||
sendMsg(ws, "kiln-info"); // 窑炉信息 | |||
sendMsg(ws, "energy-cost"); // 运行状态 | |||
sendMsg(ws, "run-state"); // 运行状态 | |||
sendMsg(ws, "realtime"); | |||
sendMsg(ws, "his-trend"); | |||
// sendMsg(ws, 'gas'); | |||
// sendMsg(ws, 'kiln-top'); | |||
// sendMsg(ws, 'kiln-bottom'); | |||
}, frequency * 1000); | |||
const timer1 = setInterval(() => { | |||
// sendMsg(ws, 'run-state'); // 运行状态 | |||
}, frequency1 * 1000); | |||
sendMsg(ws, "alarmList"); // 报警信息 | |||
}, 10 * 1000); | |||
ws.on("close", function () { | |||
console.log("停止监听"); | |||
clearInterval(timer); | |||
clearInterval(timer1); | |||
}); | |||
}); | |||
function sendMsg(ws, type) { | |||
let data = {}; | |||
switch (type) { | |||
case "alarmList": | |||
const alarmList = getRandomAlarmList(Math.floor(Math.random() * 10) + 1); | |||
alarmList.forEach((str) => { | |||
const [code, detail] = str.split(","); | |||
data[code] = detail; | |||
}); | |||
break; | |||
case "kiln-info": | |||
for (const key in template.kilnInfo) { | |||
data[key] = utils.getRandom(template.kilnInfo[key]); | |||