81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
|
|
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)
|
|||
|
|
|