Files
VDES_Backend/code/system/services/vdes_data_receive.py
2026-07-13 15:37:05 +08:00

81 lines
2.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import socket
import logging
import time
import json
import struct
import threading
from fuadmin import settings
from system import apps
from vdes_utils.vdes_data_parsing import VdesDataParsing
logger = logging.getLogger(__name__)
class VDESSocketMonitor:
_instance = None
_lock = threading.Lock()
def __new__(cls):
with cls._lock:
if not cls._instance:
cls._instance = super().__new__(cls)
cls._instance._initialized = False
return cls._instance
def __init__(self):
if self._initialized:
return
self._initialized = True
self.host = getattr(settings, 'VDES_MONITOR_HOST', 'localhost')
self.port = getattr(settings, 'VDES_MONITOR_PORT', 8083)
self.buffer_size = getattr(settings, 'VDES_BUFFER_SIZE', 4096)
self.running = False
self.thread = None
self.vdes_data_parsing = VdesDataParsing()
logger.info(f"VDES 监控服务初始化完成 - {self.host}:{self.port}")
def start(self):
if self.running:
logger.warning("监控服务已在运行中")
return
self.running = True
self.thread = threading.Thread(
target=self._monitor_loop,
name="VDES-Monitor-Thread",
daemon=False
)
self.thread.start()
logger.info("VDES 监控服务已启动")
def stop(self):
self.running = False
if self.thread and self.thread.is_alive():
self.thread.join(timeout=5)
logger.info("VDES 监控服务已停止")
def _monitor_loop(self):
while self.running:
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
print(f"尝试连接到服务器 {self.host}:{self.port}")
sock.connect((self.host, self.port))
print(f"成功连接到服务器 {self.host}:{self.port}")
while self.running:
data = sock.recv(self.buffer_size)
if data:
# print(data)
self.vdes_data_parsing.parse_vdes_data(data)
except (ConnectionRefusedError, TimeoutError) as e:
print(f"连接失败: {e}")
except Exception as e:
print(f"连接异常: {e}")
# 如果服务仍在运行则等待30秒后重新尝试连接
if self.running:
print("等待30秒后重新尝试连接...")
time.sleep(30)