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

基于WebSocket实时几何点数据生成路径的Node.js技术问询

实时WebSocket数据路径标识实现方案

核心思路

通过内存维护每个tag的实时状态,跟踪是否处于活跃路径、当前路径ID及数据累计情况,每条WebSocket数据到达时,根据tag状态和当前区域判断路径归属,生成idPath字段。

实现代码

状态管理与数据处理逻辑

// 全局维护每个tag的状态,key为tag值,value为状态对象
const tagStateMap = new Map();
// 路径ID自增计数器,保证唯一性
let pathCounter = 1;

/**
 * 处理单条WebSocket接收的JSON数据
 * @param {string} rawData - 原始WebSocket数据(JSON字符串)
 * @returns {Object} 带有idPath字段的处理后数据
 */
function processWebSocketData(rawData) {
  const data = JSON.parse(rawData);
  const { tag, areaName } = data;

  // 初始化tag状态(如果未存在)
  let tagState = tagStateMap.get(tag);
  if (!tagState) {
    tagState = {
      totalDataCount: 0, // 该tag累计接收的数据条数
      inActivePath: false, // 是否处于活跃路径中
      currentPathId: null // 当前路径ID(活跃时有效)
    };
    tagStateMap.set(tag, tagState);
  }

  // 更新累计数据条数
  tagState.totalDataCount += 1;

  let idPath = null;
  switch (areaName) {
    case 'areaEntrance':
      // 满足路径开始条件:未在活跃路径,且累计数据≥2条
      if (!tagState.inActivePath && tagState.totalDataCount >= 2) {
        const newPathId = `path-${tag}-${pathCounter++}`;
        tagState.currentPathId = newPathId;
        tagState.inActivePath = true;
        idPath = newPathId;
      } else if (tagState.inActivePath) {
        // 已在活跃路径,延续当前路径
        idPath = tagState.currentPathId;
      }
      break;
    case 'areaExit':
      // 满足路径结束条件:在活跃路径,且累计数据≥2条
      if (tagState.inActivePath && tagState.totalDataCount >= 2) {
        idPath = tagState.currentPathId;
        // 结束当前路径,重置状态
        tagState.inActivePath = false;
        tagState.currentPathId = null;
        // 可选:若需下次路径重新计数,打开下面注释
        // tagState.totalDataCount = 0;
      } else if (tagState.inActivePath) {
        // 进入exit但数据不足,仍归属当前路径
        idPath = tagState.currentPathId;
      }
      break;
    default:
      // 其他区域,若在活跃路径则延续
      if (tagState.inActivePath) {
        idPath = tagState.currentPathId;
      }
  }

  // 为数据添加路径标识
  data.idPath = idPath;
  return data;
}

Node.js WebSocket服务器集成示例

使用ws库搭建服务器,对接上述处理逻辑:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
  console.log('New client connected');

  ws.on('message', (rawData) => {
    try {
      const processedData = processWebSocketData(rawData);
      // 此处可将处理后的数据存储、转发或做其他业务处理
      console.log('Processed Data:', processedData);
      // 示例:将处理后的数据回发给客户端
      ws.send(JSON.stringify(processedData));
    } catch (error) {
      console.error('Failed to process data:', error);
      ws.send(JSON.stringify({ error: 'Invalid data format' }));
    }
  });

  ws.on('close', () => {
    console.log('Client disconnected');
  });
});

console.log('WebSocket server running on ws://localhost:8080');

关键说明

  1. 状态独立性:每个tag的状态通过Map独立维护,避免不同tag的路径逻辑互相干扰
  2. 路径ID生成:采用tag-自增数的格式,保证同一tag的路径ID唯一,不同tag的路径ID不会冲突
  3. 规则适配:
    • 路径开始:仅当tag进入areaEntrance且累计数据≥2条,同时未处于活跃路径时,才启动新路径
    • 路径结束:当tag进入areaExit且累计数据≥2条,同时处于活跃路径时,结束当前路径
    • 多路径支持:路径结束后,tag再次进入areaEntrance并满足条件时,会生成新的路径ID
  4. 可扩展性:
    • 若需持久化状态(服务器重启不丢失),可将tagStateMap定期同步到Redis或数据库,启动时加载
    • 若规则中的“至少2条数据”是指进入对应区域的次数,可在tag状态中新增entranceCount/exitCount字段替代totalDataCount
    • 路径ID可替换为UUID,适配多服务器集群场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:20:28