From a530f5c074cfded696fd7f2485371414a72a98b0 Mon Sep 17 00:00:00 2001 From: pm <362371171@qq.com> Date: Mon, 17 Mar 2025 17:37:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A9=BA=E7=A9=BA=E6=94=BB?= =?UTF-8?q?=E5=87=BB=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/Mission.js | 149 +++++++++++++++++++++++---- controller/socket.js | 229 +++++++++++++++++++++++++++--------------- 2 files changed, 274 insertions(+), 104 deletions(-) diff --git a/controller/Mission.js b/controller/Mission.js index ea92962..ffb8a7b 100644 --- a/controller/Mission.js +++ b/controller/Mission.js @@ -1,7 +1,7 @@ const util = require("../util/common"); let dataBase = require("../util/dmDB"); const moment = require('moment-timezone'); -var { PlanePoint, entityHJ, simuStatus } = require("../util/variable"); +var { PlanePoint, entityHJ, entityEvent, simuStatus } = require("../util/variable"); //加载航空兵数据 exports.loadHKBData = (req, res, next) => { @@ -194,10 +194,10 @@ getKkwqsyList = async (bdid, qrxg, qcdh, zy, rq, rwbs) => { } else { t = Math.round(x / dmjjsdwh); - zdsk = starttime.add(t, 'seconds'); + zdsk = moment(starttime).add(t, 'seconds'); } t = Math.round(jl / dmjjsdwh); - mzsk = starttime.add(t, 'seconds'); + mzsk = moment(starttime).add(t, 'seconds'); } } else { @@ -210,22 +210,21 @@ getKkwqsyList = async (bdid, qrxg, qcdh, zy, rq, rwbs) => { } else { t = Math.round(x / dmjjsdyt); - zdsk = starttime.add(t, 'seconds'); + zdsk = moment(starttime).add(t, 'seconds'); } t = Math.round(jl / dmjjsdyt); - mzsk = starttime.add(t, 'seconds'); + mzsk = moment(starttime).add(t, 'seconds'); } } } else { if (ts == "尾后") { if (dmjjsdwh <= 0) { - } else { zdsk = starttime; t = Math.round(jl / dmjjsdwh); - mzsk = starttime.add(t, 'seconds'); + mzsk = moment(starttime).add(t, 'seconds'); } } else { @@ -234,18 +233,25 @@ getKkwqsyList = async (bdid, qrxg, qcdh, zy, rq, rwbs) => { else { zdsk = starttime; t = Math.round(jl / dmjjsdyt); - mzsk = starttime.add(t, 'seconds'); + mzsk = moment(starttime).add(t, 'seconds'); } } } + + if (!mzsk) { + endtime = moment(starttime).add(10, 'seconds'); + } + else { + endtime = mzsk; + } } } else { - endtime = starttime.add(10, 'seconds'); + endtime = moment(starttime).add(10, 'seconds'); } - var startms = zerotime.diff(starttime, 'ms'); - var endms = zerotime.diff(endtime, 'ms'); + var startms = starttime.diff(zerotime, 'ms'); + var endms = endtime.diff(zerotime, 'ms'); sjmap["开始时间"] = startms; sjmap["结束时间"] = endms; @@ -262,7 +268,7 @@ getKkwqsyList = async (bdid, qrxg, qcdh, zy, rq, rwbs) => { csmap["装备类别"] = "空空弹"; csmap["航迹"] = kkddhj; if (jhsk) { - var jhms = zerotime.diff(jhsk, 'ms'); + var jhms = jhsk.diff(zerotime, 'ms'); csmap["制导结束时刻"] = jhms + 1; csmap["攻击开始时刻"] = startms; @@ -270,8 +276,8 @@ getKkwqsyList = async (bdid, qrxg, qcdh, zy, rq, rwbs) => { } var num = kkddhj.size; - endtime = starttime.add(num * 10, 'ms'); //导弹航迹精度为10ms - var endms = zerotime.diff(endtime, 'ms'); + endtime = moment(starttime).add(num * 10, 'ms'); //导弹航迹精度为10ms + endms = endtime.diff(zerotime, 'ms'); sjmap["结束时间"] = endms; } csmap["标识"] = qcdh + fsbh; @@ -283,6 +289,27 @@ getKkwqsyList = async (bdid, qrxg, qcdh, zy, rq, rwbs) => { //传入Gis的事件 array.push(sjmap); + let eventMap = entityEvent.get(bdid); + if (!eventMap) { + eventMap = new Map(); + } + { + let event = {}; + event["事件"] = "空空攻击事件"; + event["类型"] = "开始"; + event["参数"] = csmap; + eventMap.set(startms, event); + + } + { + let event = {}; + event["事件"] = "空空攻击事件"; + event["类型"] = "结束"; + event["参数"] = csmap; + eventMap.set(endms, event); + } + entityEvent.set(bdid, eventMap); + result = await data.getRow(); } @@ -325,7 +352,21 @@ getKkddFromDb = async (bdid, gjcx) => { const byte = buffer.subarray(offset, offset + size); PlanePoint.setBuffer(byte); - points.set(PlanePoint.get('iRelTime'), PlanePoint); + let pt = {}; + pt["iNum"] = PlanePoint.get('iNum'); + pt["iRelTime"] = PlanePoint.get('iRelTime'); + pt["空速"] = PlanePoint.get('dAirspeed'); + pt["升降率"] = PlanePoint.get('dSjl'); + pt["过载"] = PlanePoint.get('dOverload'); + pt["马赫数"] = PlanePoint.get('dMach'); + pt["经度"] = PlanePoint.get('dLongitude'); + pt["纬度"] = PlanePoint.get('dLatitude'); + pt["海拔"] = PlanePoint.get('dAlitidude'); + pt["航向角"] = PlanePoint.get('dHxj'); + pt["俯仰角"] = PlanePoint.get('dFyj'); + pt["倾斜角"] = PlanePoint.get('dQxj'); + + points.set(PlanePoint.get('iRelTime'), pt); } const sortMap = new Map([...points].sort((a, b) => a[0] - b[0])); @@ -349,8 +390,8 @@ getKdwqsyList = async (bdid, qrxg, rq) => { var starttime = moment(result[0]); var endtime = moment(result[1]); var fsbh = result[4]; - var startms = zerotime.diff(starttime, 'ms'); - var endms = zerotime.diff(endtime, 'ms'); + var startms = starttime.diff(zerotime, 'ms'); + var endms = endtime.diff(zerotime, 'ms'); if (startms <= endms || endms == 0) { endms = startms + 10000; @@ -370,6 +411,27 @@ getKdwqsyList = async (bdid, qrxg, rq) => { //传入Gis的事件 array.push(sjmap); + let eventMap = entityEvent.get(bdid); + if (!eventMap) { + eventMap = new Map(); + } + { + let event = {}; + event["事件"] = "空地攻击事件"; + event["类型"] = "开始"; + event["参数"] = csmap; + eventMap.set(startms, event); + + } + { + let event = {}; + event["事件"] = "空地攻击事件"; + event["类型"] = "结束"; + event["参数"] = csmap; + eventMap.set(endms, event); + } + entityEvent.set(bdid, eventMap); + result = await data.getRow(); } @@ -391,11 +453,11 @@ getGrqkList = async (bdid, grlx, qcdh, rq) => { var grsd = moment(result[1]); var grjs = moment(result[4]); if (grjs < grsd) { - grjs = grsd.add(30, 'seconds'); + grjs = moment(grsd).add(30, 'seconds'); } - var grSec = zerotime.diff(grsd, 'ms'); - var grjsSec = zerotime.diff(grjs, 'ms'); + var grSec = grsd.diff(zerotime, 'ms'); + var grjsSec = grjs.diff(zerotime, 'ms'); var grfx = result[5]; var tfsl = result[3]; @@ -415,6 +477,37 @@ getGrqkList = async (bdid, grlx, qcdh, rq) => { map["参数"] = csMap; array.push(map); + let eventMap = entityEvent.get(bdid); + if (!eventMap) { + eventMap = new Map(); + } + var eventType; + if (grlx == "红外弹") { + eventType = "红外弹干扰事件"; + } else if (grlx == "箔条弹") { + eventType = "箔条弹干扰事件"; + } else if (grlx == "有源干扰") { + eventType = "有源干扰事件"; + } else if (grlx == "机载雷达") { + eventType = "机载雷达事件"; + } + { + let event = {}; + event["事件"] = eventType; + event["类型"] = "开始"; + event["参数"] = csMap; + eventMap.set(grSec, event); + + } + { + let event = {}; + event["事件"] = eventType; + event["类型"] = "结束"; + event["参数"] = csMap; + eventMap.set(grjsSec, event); + } + entityEvent.set(bdid, eventMap); + result = await data.getRow(); } @@ -576,7 +669,21 @@ getDkddFromDb = async (bdid, gjcx, ddbh) => { const byte = buffer.subarray(offset, offset + size); PlanePoint.setBuffer(byte); - points.set(PlanePoint.get('iRelTime'), PlanePoint); + let pt = {}; + pt["iNum"] = PlanePoint.get('iNum'); + pt["iRelTime"] = PlanePoint.get('iRelTime'); + pt["空速"] = PlanePoint.get('dAirspeed'); + pt["升降率"] = PlanePoint.get('dSjl'); + pt["过载"] = PlanePoint.get('dOverload'); + pt["马赫数"] = PlanePoint.get('dMach'); + pt["经度"] = PlanePoint.get('dLongitude'); + pt["纬度"] = PlanePoint.get('dLatitude'); + pt["海拔"] = PlanePoint.get('dAlitidude'); + pt["航向角"] = PlanePoint.get('dHxj'); + pt["俯仰角"] = PlanePoint.get('dFyj'); + pt["倾斜角"] = PlanePoint.get('dQxj'); + + points.set(PlanePoint.get('iRelTime'), pt); } const sortMap = new Map([...points].sort((a, b) => a[0] - b[0])); diff --git a/controller/socket.js b/controller/socket.js index 0ff6c3d..721ccaa 100644 --- a/controller/socket.js +++ b/controller/socket.js @@ -1,6 +1,6 @@ const WebSocket = require('ws'); const util = require("../util/common"); -var { entityHJ, simuStatus } = require("../util/variable"); +var { entityHJ, entityEvent, simuStatus } = require("../util/variable"); const deltaT = 1000; @@ -17,90 +17,16 @@ const createServer = () => { if (simType == 1) { var currRadio = simuStatus["仿真倍速"]; var currTime = simuStatus["当前时间"]; - 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["空速"]); + let data = {}; + updateEntityHJ(currTime, data); + updateEntityEvent(currTime, data); - 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); - } - } - - const message = { - time: currTime, - data: array - }; - ws.send(JSON.stringify(message)); // 发送JSON格式的消息 - } + const message = { + time: currTime, + data: data + }; + ws.send(JSON.stringify(message)); // 发送JSON格式的消息 var accTime = deltaT * currRadio; currTime += accTime; @@ -120,4 +46,141 @@ const createServer = () => { 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() \ No newline at end of file