const WebSocket = require('ws'); const util = require("../util/common"); var { entityHJ, entityEvent, simuStatus } = require("../util/variable"); let entityMgr = require("./entityMgr"); const deltaT = 1000; const createServer = () => { // 创建WebSocket服务器 const wss = new WebSocket.Server({ port: 9000 }); wss.on('connection', function connection(ws) { console.log('新客户端已连接'); // 定时发送消息 const intervalId = setInterval(() => { var simType = simuStatus["运行状态"]; if (simType == 1) { var currRadio = simuStatus["仿真倍速"]; var currTime = simuStatus["当前时间"]; let data = {}; entityMgr.updateEntity(currTime, data); // updateEntityHJ(currTime, data); // updateEntityEvent(currTime, data); const message = { time: currTime, data: data }; ws.send(JSON.stringify(message)); // 发送JSON格式的消息 var accTime = deltaT * currRadio; currTime += accTime; simuStatus["当前时间"] = currTime; } }, deltaT); // 每5秒发送一次消息 // 可以在这里添加更多的逻辑,例如当客户端关闭连接时清除定时器等 ws.on('close', () => { clearInterval(intervalId); // 清除定时器,防止内存泄漏 console.log('客户端已断开连接'); }); }); console.log('WebSocket服务器正在运行在ws://localhost:9000'); } updateEntityHJ = (currTime, data) => { if (entityHJ.size > 0) { var array = []; for (const [key, value] of entityHJ) { const keysArray = [...value.keys()]; var indexKey = util.lower_bound(keysArray, currTime); if (indexKey < keysArray.length) { let point = {}; var second = keysArray[indexKey]; if (indexKey == 0) { point = value.get(second); } else { var first = keysArray[indexKey - 1]; var delta_time = second - first; if (delta_time == 0.0) { point = value.get(first); } else { var pointfirst = value.get(first); var pointsecond = value.get(second); point["空速"] = util.interpolate( (currTime - first) / delta_time, pointfirst["空速"], pointsecond["空速"]); point["升降率"] = util.interpolate( (currTime - first) / delta_time, pointfirst["升降率"], pointsecond["升降率"]); point["过载"] = util.interpolate( (currTime - first) / delta_time, pointfirst["过载"], pointsecond["过载"]); point["马赫数"] = util.interpolate( (currTime - first) / delta_time, pointfirst["马赫数"], pointsecond["马赫数"]); point["经度"] = util.interpolate( (currTime - first) / delta_time, pointfirst["经度"], pointsecond["经度"]); point["纬度"] = util.interpolate( (currTime - first) / delta_time, pointfirst["纬度"], pointsecond["纬度"]); point["海拔"] = util.interpolate( (currTime - first) / delta_time, pointfirst["海拔"], pointsecond["海拔"]); point["航向角"] = util.interpolate( (currTime - first) / delta_time, pointfirst["航向角"], pointsecond["航向角"]); point["俯仰角"] = util.interpolate( (currTime - first) / delta_time, pointfirst["俯仰角"], pointsecond["俯仰角"]); point["倾斜角"] = util.interpolate( (currTime - first) / delta_time, pointfirst["倾斜角"], pointsecond["倾斜角"]); } } point["BDID"] = key; array.push(point); } } data["航迹列表"] = array; } } updateEntityEvent = (currTime, data) => { if (entityEvent.size > 0) { var array = []; for (const [key, value] of entityEvent) { var bdid = key; const tArray = [...value.keys()]; var indexT = util.lower_bound(tArray, currTime); if (indexT < tArray.length) { var second = tArray[indexT]; if (second <= currTime) { let event = value.get(second); event["BDID"] = bdid; array.push(event); let para = event["参数"]; var hj = para["航迹"]; if (hj) { let xh = para["型号"]; let bh = para["编号"]; var newBDID = xh + ";" + bh; entityHJ.set(newBDID, hj); var zdjs = para["制导结束时刻"]; if (zdjs) { let eventMap = entityEvent.get(newBDID); if (!eventMap) { eventMap = new Map(); } { let eventJH = {}; eventJH["事件"] = "导弹截获事件"; eventJH["类型"] = "开始"; eventJH["参数"] = para["攻击目标"]; eventMap.set(zdjs, eventJH); } { var endMs = para["结束时刻"]; let eventJH = {}; eventJH["事件"] = "导弹截获事件"; eventJH["类型"] = "结束"; eventJH["参数"] = para["攻击目标"]; eventMap.set(endMs, eventJH); } entityEvent.set(newBDID, eventMap); } } } } } data["事件列表"] = array; } } module.exports = createServer()