186 lines
7.0 KiB
JavaScript
186 lines
7.0 KiB
JavaScript
const WebSocket = require('ws');
|
|
const util = require("../util/common");
|
|
var { entityHJ, entityEvent, simuStatus } = require("../util/variable");
|
|
|
|
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 = {};
|
|
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() |