From 23336250ab602a8931bd80a3c67941e2357b6ff0 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期六, 08 六月 2024 15:08:52 +0800 Subject: [PATCH] # --- src/config/setting.js | 8 +++ .env | 5 +- src/core/warehouse.jsx | 5 ++ src/core/websocket.js | 83 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 4 deletions(-) diff --git a/.env b/.env index ba7333f..128d7f9 100644 --- a/.env +++ b/.env @@ -1,2 +1,3 @@ -COOL_API_BASE_URL = 'http://192.168.2.46:9090' -# COOL_API_BASE_URL = 'http://localhost:9090' +COOL_BASE_IP = '192.168.2.46' + +COOL_BASE_PORT = 9090 diff --git a/src/config/setting.js b/src/config/setting.js index 6b47d4e..300aaef 100644 --- a/src/config/setting.js +++ b/src/config/setting.js @@ -1,4 +1,10 @@ -export const API_BASE_URL = import.meta.env.COOL_API_BASE_URL; +export const IP = import.meta.env.COOL_BASE_IP; + +export const PORT = import.meta.env.COOL_BASE_PORT; + +export const API_BASE_URL = 'http://' + IP + ':' + PORT + ''; + +export const WEBSOCKET_BASE_URL = 'ws://' + IP + ':' + PORT + ''; export const TOKEN_HEADER_NAME = 'Authorization'; diff --git a/src/core/warehouse.jsx b/src/core/warehouse.jsx index 0118bd1..c3117e7 100644 --- a/src/core/warehouse.jsx +++ b/src/core/warehouse.jsx @@ -1,6 +1,7 @@ import { useState, useEffect, useRef, useMemo } from 'react'; import { useFrame } from '@react-three/fiber'; import * as THREE from 'three'; +import WebSocketClient from './websocket' import Tunnel from '../components/tunnel'; import Area from '../components/area'; import Shelf from '../components/shelf'; @@ -13,7 +14,7 @@ import agvRealDataList from '@/assets/data/agv'; import { getBoxData } from '../api/box'; import { getAgvData } from '../api/agv'; -import { INTERVAL_TIME } from '@/config/setting' +import { INTERVAL_TIME, WEBSOCKET_BASE_URL, IP, PORT } from '@/config/setting' let index = 0; @@ -25,6 +26,8 @@ const [boxData, setBoxData] = useState([]) useEffect(() => { + + const timer = setInterval(() => { getBoxData().then(res => { // res.push({ diff --git a/src/core/websocket.js b/src/core/websocket.js new file mode 100644 index 0000000..39b9eba --- /dev/null +++ b/src/core/websocket.js @@ -0,0 +1,83 @@ +import { WEBSOCKET_BASE_URL } from '@/config/setting'; + +export default class WebSocketClient { + + constructor(path) { + this.url = WEBSOCKET_BASE_URL + path; + this.webSocket = null; + this.heartbeatInterval = null; // Store the interval ID + this.heartbeatFrequency = 30000; // Heartbeat every 30 seconds + } + + connect() { + if (!this.url) { + console.error('WebSocketClient: Cannot connect without url.'); + return; + } + + this.webSocket = new WebSocket(this.url); + + this.webSocket.onopen = (event) => { + console.log('websocket connection opened.'); + // Start the heartbeat + this.startHeartbeat(); + }; + + this.webSocket.onmessage = (event) => { + // console.log('websocket message received:', event.data); + this.onMessage(event.data); + }; + + this.webSocket.onerror = (event) => { + console.error('websocket error observed:', event); + }; + + this.webSocket.onclose = (event) => { + console.log('websocket connection closed!'); + // Clear the heartbeat + this.stopHeartbeat(); + this.reconnect(); + }; + } + + sendMessage(message) { + if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) { + this.webSocket.send(message); + } else { + console.error('WebSocketClient: Cannot send message, WebSocket connection is not open.'); + } + } + + // Override + onMessage(data) { + } + + close() { + if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) { + this.webSocket.close(); + } + } + + reconnect() { + setTimeout(() => { + console.log('WebSocketClient: Attempting to reconnect...'); + this.connect(); + }, 3000); + } + + startHeartbeat() { + if(this.heartbeatInterval) { + clearInterval(this.heartbeatInterval); + } + this.heartbeatInterval = setInterval(() => { + this.sendMessage('1'); + }, this.heartbeatFrequency); + } + + stopHeartbeat() { + if (this.heartbeatInterval) { + clearInterval(this.heartbeatInterval); + this.heartbeatInterval = null; + } + } +} \ No newline at end of file -- Gitblit v1.9.1