You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js接收UDP实时计时字符串:数据解析问题求助

解析模拟器UDP实时计时数据方案

核心思路

将原始按\n分隔的字符串按空行分割为独立数据块(MSG/ENTRY/SESSION等),再针对每个块的固定结构解析,用Map存储车手信息和圈速以实现高效关联。

步骤与代码实现

1. 数据预处理

先将原始UDP数据分割为独立的逻辑块,过滤空行和多余空白,避免无效数据干扰:

function parseLiveTiming(rawUdpData) {
  // 按1个或多个空行分割成数据块
  const blocks = rawUdpData.split(/\n{2,}/).map(block => 
    block.split('\n')
      .map(line => line.trim())
      .filter(line => line.length > 0) // 过滤空行
  );

  // 用Map存储车手(键为唯一标识,如赛车编号/GUID)
  const racers = new Map();
  // 存储每个车手的最后圈速
  const lastLaps = new Map();

2. 解析ENTRY车手信息

每个ENTRY块固定7行(含ENTRY标记),对应车手的6项核心信息:

for (const block of blocks) {
    if (!block.length) continue;
    const blockType = block[0];

    switch (blockType) {
      case 'ENTRY':
        // ENTRY结构:ENTRY → 赛车编号 → 姓名 → 车型 → 车款 → 组别 → GUID
        if (block.length >= 7) {
          const racerUniqueId = block[1]; // 用赛车编号作为唯一标识,可替换为block[6]的GUID
          racers.set(racerUniqueId, {
            number: block[1],
            name: block[2],
            bikeModel: block[3],
            bikeVariant: block[4],
            racingClass: block[5],
            guid: block[6]
          });
        }
        break;

3. 解析LASTLAP最后圈速

LASTLAP块的最后一个字段为圈速数值,需通过唯一标识关联到对应车手:

case 'LASTLAP':
        // LASTLAP结构:LASTLAP → [车手唯一标识] → ... → 圈速(最后一项)
        if (block.length >= 2) {
          const racerUniqueId = block[1]; // 需与ENTRY的唯一标识匹配
          const lapTime = parseFloat(block.at(-1)); // 取最后一个字段作为圈速
          if (!isNaN(lapTime)) {
            lastLaps.set(racerUniqueId, lapTime);
          }
        }
        break;
      // 如需处理其他块(如SESSION/BESTLAP),可在此添加case
      case 'SESSION':
        // 示例:存储当前会话状态(如是否进行中、当前圈数)
        break;
    }
  }

4. 关联车手与圈速

将车手信息和对应最后圈速合并,返回可直接用于网页更新的结构化数据:

// 合并车手信息与圈速
  const liveResults = Array.from(racers.entries()).map(([id, racer]) => ({
    ...racer,
    lastLapTime: lastLaps.get(id) || null
  }));

  return liveResults;
}

关键优势

  • 高效性:用Map存储数据,查找和更新操作均为O(1),完全适配30位车手的规模
  • 可维护性:按数据块拆分逻辑,新增其他类型数据(如BESTLAP)只需添加对应case
  • 鲁棒性:预处理过滤空行,避免因UDP数据包拆分/合并导致的解析错误

注意事项

  • 需确认LASTLAP中与ENTRY对应的唯一标识字段(可能是赛车编号、GUID或其他ID),调整racerUniqueId的取值
  • UDP可能出现数据包拆分,建议在客户端维护缓冲区,缓存不完整的数据块直到收到完整结构
  • 实时更新网页可通过WebSocket/Server-Sent Events将解析后的liveResults推送给前端

内容的提问来源于stack exchange,提问作者Mcbovice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:46:33