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); }); }); type MsgType = | 'kiln-info' | 'run-state' | 'energy-cost' | 'realtime' | 'his-trend' | 'fan' | 'gas' | 'kiln-top' | 'kiln-bottom'; type ResponseData = { [key: string]: string | string[]; }; type ResponseDataComplex = { [key: string]: ResponseData; }; function sendMsg(ws: WebSocket, type: MsgType) { let data: ResponseData | ResponseDataComplex = {}; switch (type) { case 'kiln-info': for (const key in template.kilnInfo) { data[key] = utils.getRandom( template.kilnInfo[key as keyof typeof template.kilnInfo], ); } break; case 'energy-cost': for (const key in template.energyCost) { data[key] = utils.getRandom( template.energyCost[key as keyof typeof template.energyCost], ); } 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: ResponseData; wind: ResponseData; } = { gas: {}, wind: {}, }; Object.keys(template.hisTrend.gas).forEach((key) => { hisTrend.gas[key] = template.hisTrend.gas[ key as keyof typeof template.hisTrend.gas ].map((v) => utils.getRandom(v)); }); Object.keys(template.hisTrend.wind).forEach((key) => { hisTrend.wind[key] = template.hisTrend.wind[ key as keyof typeof template.hisTrend.wind ].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; } // console.log("sendMsg: ", ws); // ws.emit("message", JSON.stringify(data)); ws.send(JSON.stringify({ type, data })); }