From 19147adc1b98f81678b9d5a18dd99a7be392ddac Mon Sep 17 00:00:00 2001 From: jinchao <383321154@qq.com> Date: Thu, 19 Jun 2025 10:35:54 +0800 Subject: [PATCH] =?UTF-8?q?V0.29.0.250619=5Falpha:=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=BD=91=E7=BB=9C=E7=9B=91=E6=8E=A7=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Models/libXNATA04DataProcessor.so.1.0.0.0 | Bin 75800 -> 71528 bytes Release/database/XNSim.db | Bin 1224704 -> 1224704 bytes XNSimHtml/components/network-monitor.js | 366 ++++++++++++++++-- XNSimHtml/routes/udp-monitor.js | 16 +- XNSimHtml/utils/model-utils.js | 5 +- 5 files changed, 351 insertions(+), 36 deletions(-) diff --git a/Release/Models/libXNATA04DataProcessor.so.1.0.0.0 b/Release/Models/libXNATA04DataProcessor.so.1.0.0.0 index b867af2b35fac33851772cd78b3d7eb4a9c815eb..d7dbcf773801974948c5defd7973f3df58519163 100644 GIT binary patch literal 71528 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

!j)O>id~!ugERcz4y312ATrILIZpCIu! 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 Pe~Uasr2v`+G%f=G__3V^ diff --git a/Release/database/XNSim.db b/Release/database/XNSim.db index be98c4571a7776e22d56b585144832aecde0cf58..07e7c1af3425771954b29daea5fd18f6d98b8a27 100644 GIT binary patch delta 1009 zcmaKqUr19?9LMjyXS&_(?w+Zw%UCN7vz$$ zRS`6j$roKMGG<9}*J49aCeNz)Wf3ddG>1}Lk?Zk`J z{Oy)DvtX7B1WSQv%NA@!qNT`eF$<^ui3vhO{dFWc$xVt;z%BxI!S`?+Zei&+VP0;U zY}Av-?SCL_SGNL<-yoZJ07tKcl`g7)qE~QtfUa_KO1;d9cH$&=d$Lot??vJ-7vs+& zvAIAZ_$2;jIyTXd=sN0mjT&f22&iH0+7W!pQ*Dp`yn{C6aHh+C2Pg1m8!sFh_q4V* zdqkl~lCb&M%tWkjDzO$yM8^|jq4?nZ_Vn`h>lu-ck1XQkek`#RO++VSL!oV-Kk+J1 zQ|dZUGVmCG#`-3ckJf&yj;YNDU3tm*+4w~8XkBdX-O*A{Naf5Z1I}JoK^_n^KwGHHu=^QgkFr!G- z4hETQBe3t6rrtl73#!N$EzunG`2olWcwEW|I14|*ZditNJ|M$FvoejAjpBa>CRIkb zdkFO7&4vj$3?uLx{DgEt5P$}Qf|ie+z3{>$xQ1Qk6Ywfq&*md$3YgflCWT%mPZ~9@ lw>$zc3QQU%9izmkFf>Mu(O?*i7Q(v3N5iv5)~YR z4iSoiiZ*umh6Yp=?9wbM-=Gv%(M6$y(BYuO!9fDLh#mSm{FeWFJpQj06k9=YWtau+ z_PSc|1~|1Gn|b>$b>N6y(<`R6>_h}SA!%1L?Ilsi@N953U# z@?VK1<>(AsQ0Wr;#!bMEhM%y50S0uUf$VVmbW(LH?0O#(hAzWpZqr~(SNbgfe>uWM zUc;!!Q+8aa{3ieGLeboo;Xc2kmixS9w#zZKy~`iR;eOATUj^ij`i_^*=Df6*$)%PW zHR|Hq&I#K+dCAF5y56Ldp_bWMc{2)!?m~tClsScIq(3 zLJ9Mori>f##H8?GXdEuE)x{5E>c?G}0D7va;Vb-(O`KL%3w*@h!}Xu*FMAW=0cH;$ zu|w&8P5)_PZK(@fU8PRMrYC -

${this.state.statusMsg}
-
- - - - +
+
+
${this.state.statusMsg}
+
+ + + + +
+
抓包状态:${this.state.isMonitoring ? '运行中' : '已停止'}
+
+
+
+
+
+

UDP数据包详情

+
+
+
请从左侧选择一个数据包查看详情
+
+
+
-
抓包状态:${this.state.isMonitoring ? '运行中' : '已停止'}
-
`; this.shadowRoot.getElementById('startBtn').onclick = () => this.startMonitor(); this.shadowRoot.getElementById('stopBtn').onclick = () => this.stopMonitor(); @@ -184,13 +316,67 @@ class NetworkMonitor extends HTMLElement { dataList.innerHTML = '
暂无数据
'; return; } - dataList.innerHTML = this.state.data.map(item => ` -
-
时间: ${new Date(item.timestamp).toLocaleString()}
-
来源: ${item.source}
-
内容:
${typeof item.data === 'object' ? JSON.stringify(item.data, null, 2) : item.data}
+ dataList.innerHTML = this.state.data.map((item, index) => ` +
+ + + + + + +
时间: ${new Date(item.timestamp).toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + fractionalSecondDigits: 3 + })}来源: ${item.source}大小: ${item.length || this.getDataSize(item.data)} 字节
`).join(''); + + // 添加点击事件 + dataList.querySelectorAll('.data-item').forEach(item => { + item.addEventListener('click', (e) => { + const index = parseInt(e.currentTarget.dataset.index); + this.selectDataItem(index); + }); + }); + } + + getDataSize(data) { + // 如果数据是十六进制字符串,每两个字符代表一个字节 + if (typeof data === 'string' && /^[0-9a-fA-F]+$/.test(data)) { + return Math.ceil(data.length / 2); + } + return 0; + } + + formatDataAsHex(data) { + // 如果数据是十六进制字符串,直接处理 + if (typeof data === 'string' && /^[0-9a-fA-F]+$/.test(data)) { + const bytes = []; + for (let i = 0; i < data.length; i += 2) { + const byte = parseInt(data.substr(i, 2), 16); + bytes.push(byte); + } + + // 分行显示,每行16个字节 + const bytesPerLine = 16; + const lines = []; + + for (let i = 0; i < bytes.length; i += bytesPerLine) { + const lineBytes = bytes.slice(i, i + bytesPerLine); + const lineHex = lineBytes.map(byte => byte.toString(16).padStart(2, '0')).join(' '); + const offset = i.toString(16).padStart(4, '0').toUpperCase(); + lines.push(`${offset}: ${lineHex}`); + } + + return lines.join('\n'); + } + + return '无效数据格式'; } setStatus(msg) { @@ -257,6 +443,7 @@ class NetworkMonitor extends HTMLElement { this.state.data = this.state.data.slice(-1000); } this.renderDataList(); + this.updateDetailContent(); } this.state.isMonitoring = data.isMonitoring; this.shadowRoot.getElementById('monitorStatus').textContent = data.isMonitoring ? '运行中' : '已停止'; @@ -284,6 +471,141 @@ class NetworkMonitor extends HTMLElement { reactivate() { this.initialize(); } + + selectDataItem(index) { + this.state.selectedData = index; + this.renderDataList(); + this.updateDetailContent(); + } + + updateDetailContent() { + const detailContent = this.shadowRoot.getElementById('detailContent'); + if (!detailContent) return; + + if (this.state.selectedData === null || !this.state.data[this.state.selectedData]) { + detailContent.innerHTML = '
请从左侧选择一个数据包查看详情
'; + return; + } + + const item = this.state.data[this.state.selectedData]; + detailContent.innerHTML = ` +
${this.formatHexContent(item.data)}
+
+ ${this.formatParseContent(item.data)} +
+ `; + } + + getPacketIndex(packet) { + // 这里可以根据需要实现数据包序号逻辑 + return Math.floor(Math.random() * 1000) + 1; + } + + formatHexContent(data) { + // 如果数据是十六进制字符串,直接处理 + if (typeof data === 'string' && /^[0-9a-fA-F]+$/.test(data)) { + const bytes = []; + for (let i = 0; i < data.length; i += 2) { + const byte = parseInt(data.substr(i, 2), 16); + bytes.push(byte); + } + + // 分行显示,每行16个字节 + const bytesPerLine = 16; + const lines = []; + + for (let i = 0; i < bytes.length; i += bytesPerLine) { + const lineBytes = bytes.slice(i, i + bytesPerLine); + const lineHex = lineBytes.map(byte => byte.toString(16).padStart(2, '0')).join(' '); + const offset = i.toString(16).padStart(4, '0').toUpperCase(); + lines.push(`${offset}: ${lineHex}`); + } + + return lines.join('\n'); + } + + return '无效数据格式'; + } + + formatParseContent(data) { + if (typeof data !== 'string' || !/^[0-9a-fA-F]+$/.test(data) || data.length < 14) { + return '
数据包长度不足,无法解析
'; + } + + const bytes = []; + for (let i = 0; i < data.length; i += 2) { + const byte = parseInt(data.substr(i, 2), 16); + bytes.push(byte); + } + + // 解析数据包头 + const header = bytes.slice(0, 6); // 前6个字节 + const sizeBytes = bytes.slice(6, 8); // 第7-8个字节表示数据包大小 + + let parseResult = '
数据包头解析
'; + + // 1. a6-XNSim数据 + parseResult += `
1. ${header[0].toString(16).padStart(2, '0')} - XNSim数据
`; + + // 2. c0-C909数据 c1-C919数据 + const dataType = header[1]; + let dataTypeDesc = ''; + if (dataType === 0xc0) { + dataTypeDesc = 'C909数据'; + } else if (dataType === 0xc1) { + dataTypeDesc = 'C919数据'; + } else { + dataTypeDesc = `未知数据类型(${dataType.toString(16).padStart(2, '0')})`; + } + parseResult += `
2. ${dataType.toString(16).padStart(2, '0')} - ${dataTypeDesc}
`; + + // 3. ATA章节号 + const ataChapter = header[2]; + parseResult += `
3. ${ataChapter.toString(16).padStart(2, '0')} - ATA章节号 (ATA${ataChapter.toString().padStart(2, '0')})
`; + + // 4. 模型编号 + const modelNumber = header[3]; + parseResult += `
4. ${modelNumber.toString(16).padStart(2, '0')} - 模型编号 (${modelNumber})
`; + + // 5. 结构体类别 + const structType = header[4]; + let structTypeDesc = ''; + switch (structType) { + case 0x00: + structTypeDesc = '输入结构体'; + break; + case 0x01: + structTypeDesc = '输出结构体'; + break; + case 0x02: + structTypeDesc = '心跳结构体'; + break; + default: + structTypeDesc = `未知结构体类型(${structType.toString(16).padStart(2, '0')})`; + } + parseResult += `
5. ${structType.toString(16).padStart(2, '0')} - 结构体类别 (${structTypeDesc})
`; + + // 6. 数据传输方向 + const direction = header[5]; + let directionDesc = ''; + switch (direction) { + case 0x00: + directionDesc = '输入'; + break; + case 0x01: + directionDesc = '输出'; + break; + default: + directionDesc = `未知方向(${direction.toString(16).padStart(2, '0')})`; + } + parseResult += `
6. ${direction.toString(16).padStart(2, '0')} - 数据传输方向 (${directionDesc})
`; + + // 7. 数据包大小 + const packetSize = (sizeBytes[0] << 8) | sizeBytes[1]; + parseResult += `
7. ${sizeBytes[0].toString(16).padStart(2, '0')} ${sizeBytes[1].toString(16).padStart(2, '0')} - 数据包大小 (${packetSize} 字节)
`; + + return parseResult; + } } -customElements.define('network-monitor', NetworkMonitor); \ No newline at end of file +customElements.define('network-monitor', NetworkMonitor); \ No newline at end of file diff --git a/XNSimHtml/routes/udp-monitor.js b/XNSimHtml/routes/udp-monitor.js index dc749e9..49ac97b 100644 --- a/XNSimHtml/routes/udp-monitor.js +++ b/XNSimHtml/routes/udp-monitor.js @@ -55,21 +55,17 @@ router.post('/start', (req, res) => { udpServer.on('message', (msg, rinfo) => { // 将收到的数据添加到数据队列 try { - let processedData; - - // 尝试将数据解析为JSON - try { - processedData = JSON.parse(msg.toString()); - } catch (e) { - // 如果不是JSON,则保存为字符串 - processedData = msg.toString(); - } + // 保存原始字节数据,转换为十六进制字符串 + const hexData = msg.toString('hex'); + const rawBytes = Array.from(msg); // 将数据添加到队列 udpData.push({ timestamp: Date.now(), source: `${rinfo.address}:${rinfo.port}`, - data: processedData + data: hexData, + rawBytes: rawBytes, + length: msg.length }); // 限制数据队列大小,最多保存1000条记录 diff --git a/XNSimHtml/utils/model-utils.js b/XNSimHtml/utils/model-utils.js index b10d11c..be86f80 100644 --- a/XNSimHtml/utils/model-utils.js +++ b/XNSimHtml/utils/model-utils.js @@ -233,10 +233,7 @@ function saveNewVersion(db, versionData) { versionData.DataPackageEntryPoint || '', versionData.DataPackageInterfaceName || '', versionData.ConfID, - versionData.CmdList || '[]', - versionData.ClassName, - versionData.originalVersion || versionData.Version, - versionData.PlaneName + versionData.CmdList || '[]' ); return {