| 方案 | 優點 | 缺點 | 推薦度 |
|---|---|---|---|
| Node.js net + WebSocket | 完全可控,二進制處理靈活 | 需自寫協議解析 | ★★★★★ |
| Socket.IO | 自動降級、房間機制 | 非標準 WebSocket,無法直連 TCP 設備 | ★★☆☆☆ |
| 瀏覽器 Web TCP API | 無中轉 | 僅 Chrome 支持,需 HTTPS,生產不可用 | ★☆☆☆☆ |
頻譜儀 (TCP:PortA) <---> Node.js (net.Server) <---> 瀏覽器 (WebSocket) <---> Canvas/ECharts
控制端口 (TCP:PortB) (ws://localhost:8080)
const net = require('net');
const client = new net.Socket();
client.connect({port: 5000, host: '192.168.1.100'}, () => {
console.log('已連接頻譜儀');
});
client.on('data', (buffer) => {
// 解析二進制協議 -> Float32Array
const data = parseSpectrum(buffer);
// 廣播給所有 WebSocket 客戶端
wss.clients.forEach(ws => ws.send(data));
});
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
const ws = new WebSocket('ws://localhost:8080');
ws.binaryType = 'arraybuffer';
ws.onmessage = (event) => {
const float32 = new Float32Array(event.data);
updateChart(float32); // ECharts setOption 或 Canvas 繪製
};
express.static 目錄或獨立 NginxlocalStorage 緩存,刷新頁面恢復顯示若頻譜儀協議為:包頭(2B) + 長度(2B) + 數據(800*4B) + 校驗(1B),使用 buffer.readUInt16BE(offset)、buffer.readFloatBE(offset) 解析。