插件窝 干货文章 如何利用WebSocket技术实时绘制医学数据波形图?

如何利用WebSocket技术实时绘制医学数据波形图?

数据 data const WebSocket 402    来源:    2025-03-25

利用WebSocket技术实时绘制医学数据波形图

WebSocket是实现医学数据实时波形图绘制的理想技术,下面我将详细介绍完整的实现方案。

系统架构

  1. 数据采集端:医疗设备或模拟器
  2. WebSocket服务器:处理实时数据传输
  3. 前端展示:浏览器中的波形图绘制

实现步骤

1. 建立WebSocket服务器

Node.js示例

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

wss.on('connection', (ws) => {
  console.log('新的客户端连接');

  // 模拟发送医学数据(实际应用中从设备获取)
  const interval = setInterval(() => {
    if (ws.readyState === WebSocket.OPEN) {
      const data = generateMedicalData();
      ws.send(JSON.stringify(data));
    }
  }, 50); // 20Hz采样率

  ws.on('close', () => {
    clearInterval(interval);
    console.log('客户端断开连接');
  });
});

function generateMedicalData() {
  return {
    timestamp: Date.now(),
    ecg: Math.random() * 2 - 1, // 模拟ECG数据
    bloodPressure: 80 + Math.random() * 40, // 模拟血压
    spo2: 95 + Math.random() * 5 // 血氧饱和度
  };
}

2. 前端实现

HTML结构

<!DOCTYPE html>
<html>
<head>
  <title>医学数据实时监测</title>
  <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
  <div style="width: 100%; max-width: 1200px; margin: 0 auto;">
    <canvas id="ecgChart" height="200"></canvas>
    <canvas id="bpChart" height="200"></canvas>
    <canvas id="spo2Chart" height="200"></canvas>
  </div>
  <script src="app.js"></script>
</body>
</html>

JavaScript (app.js)

// 初始化图表
const ecgCtx = document.getElementById('ecgChart').getContext('2d');
const bpCtx = document.getElementById('bpChart').getContext('2d');
const spo2Ctx = document.getElementById('spo2Chart').getContext('2d');

const ecgChart = new Chart(ecgCtx, {
  type: 'line',
  data: { labels: [], datasets: [{ label: 'ECG', data: [], borderColor: 'rgb(75, 192, 192)' }] },
  options: { responsive: true, animation: { duration: 0 } }
});

const bpChart = new Chart(bpCtx, {
  type: 'line',
  data: { labels: [], datasets: [{ label: '血压', data: [], borderColor: 'rgb(255, 99, 132)' }] },
  options: { responsive: true, animation: { duration: 0 } }
});

const spo2Chart = new Chart(spo2Ctx, {
  type: 'line',
  data: { labels: [], datasets: [{ label: '血氧饱和度', data: [], borderColor: 'rgb(54, 162, 235)' }] },
  options: { responsive: true, animation: { duration: 0 }, scales: { y: { min: 90, max: 100 } } }
});

// WebSocket连接
const ws = new WebSocket('ws://localhost:8080');
const maxDataPoints = 200; // 每个图表显示的最大数据点数

ws.onmessage = (event) => {
  const data = JSON.parse(event.data);
  const timestamp = new Date(data.timestamp).toLocaleTimeString();

  // 更新ECG图表
  updateChart(ecgChart, timestamp, data.ecg);

  // 更新血压图表
  updateChart(bpChart, timestamp, data.bloodPressure);

  // 更新血氧图表
  updateChart(spo2Chart, timestamp, data.spo2);
};

function updateChart(chart, label, value) {
  // 添加新数据
  chart.data.labels.push(label);
  chart.data.datasets[0].data.push(value);

  // 限制数据点数
  if (chart.data.labels.length > maxDataPoints) {
    chart.data.labels.shift();
    chart.data.datasets[0].data.shift();
  }

  // 更新图表
  chart.update();
}

3. 优化建议

  1. 数据压缩:对于高频率数据,考虑使用二进制格式而非JSON
  2. 自适应采样:根据网络状况调整数据发送频率
  3. 断线重连:实现自动重连机制
  4. 数据缓冲:客户端实现数据缓冲处理网络抖动

4. 生产环境注意事项

  1. 安全性:使用WSS(WebSocket Secure)而非WS
  2. 认证:实现连接认证机制
  3. 负载均衡:对于多用户场景,考虑使用Redis等实现多服务器状态同步
  4. 数据持久化:重要医学数据需要同时保存到数据库

扩展功能

  1. 异常检测:在服务器或客户端实现异常数据检测算法
  2. 报警功能:当数据超出安全范围时触发视觉/听觉警报
  3. 多视图同步:实现多个波形图的同步缩放和平移
  4. 离线模式:支持数据录制和回放

通过上述方案,您可以构建一个稳定、实时的医学数据监测系统,适用于ECG、EEG、血压等多种医学波形数据的可视化。