创建项目及AI生成基本代码
This commit is contained in:
187
internal/simulation/websocket.py
Normal file
187
internal/simulation/websocket.py
Normal file
@@ -0,0 +1,187 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
模拟WebSocket通信模块,用于模拟与猪场主控的WebSocket通信
|
||||
"""
|
||||
|
||||
import json
|
||||
import time
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from .devices import DeviceManager, SimulatedDevice
|
||||
|
||||
# 配置日志
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SimulatedWebSocketServer:
|
||||
"""模拟WebSocket服务器"""
|
||||
|
||||
def __init__(self, config):
|
||||
"""
|
||||
初始化模拟WebSocket服务器
|
||||
|
||||
Args:
|
||||
config: 配置对象
|
||||
"""
|
||||
self.config = config
|
||||
self.device_manager = DeviceManager()
|
||||
self._initialize_devices()
|
||||
logger.info("模拟WebSocket服务器初始化完成")
|
||||
|
||||
def _initialize_devices(self):
|
||||
"""初始化模拟设备"""
|
||||
logger.info("开始初始化模拟设备")
|
||||
# 根据配置创建模拟设备
|
||||
for device_config in self.config.simulation_devices:
|
||||
device = SimulatedDevice(
|
||||
device_id=device_config['id'],
|
||||
device_type=device_config['type'],
|
||||
status=device_config.get('status', 'stopped')
|
||||
)
|
||||
self.device_manager.add_device(device)
|
||||
logger.info(f"模拟设备初始化完成,共创建 {len(self.config.simulation_devices)} 个设备")
|
||||
|
||||
def handle_message(self, message_str):
|
||||
"""
|
||||
处理接收到的消息
|
||||
|
||||
Args:
|
||||
message_str (str): JSON格式的消息字符串
|
||||
|
||||
Returns:
|
||||
dict: 响应消息
|
||||
"""
|
||||
logger.info(f"收到消息: {message_str}")
|
||||
|
||||
try:
|
||||
message = json.loads(message_str)
|
||||
msg_type = message.get('type')
|
||||
logger.info(f"消息类型: {msg_type}")
|
||||
|
||||
if msg_type == 'heartbeat':
|
||||
return self._handle_heartbeat(message)
|
||||
elif msg_type == 'command':
|
||||
command = message.get('command')
|
||||
logger.info(f"命令类型: {command}")
|
||||
if command == 'control_device':
|
||||
return self._handle_control_device(message)
|
||||
elif command == 'query_device_status':
|
||||
return self._handle_query_device_status(message)
|
||||
elif command == 'query_all_device_status':
|
||||
return self._handle_query_all_device_status(message)
|
||||
|
||||
# 未知消息类型
|
||||
result = {
|
||||
"type": "response",
|
||||
"status": "failed",
|
||||
"message": f"未知消息类型: {msg_type}",
|
||||
"timestamp": datetime.utcnow().isoformat() + 'Z'
|
||||
}
|
||||
logger.warning(f"未知消息类型: {msg_type}")
|
||||
return result
|
||||
except json.JSONDecodeError:
|
||||
result = {
|
||||
"type": "response",
|
||||
"status": "failed",
|
||||
"message": "无效的JSON格式",
|
||||
"timestamp": datetime.utcnow().isoformat() + 'Z'
|
||||
}
|
||||
logger.error("无效的JSON格式")
|
||||
return result
|
||||
|
||||
def _handle_heartbeat(self, message):
|
||||
"""
|
||||
处理心跳消息
|
||||
|
||||
Args:
|
||||
message (dict): 心跳消息
|
||||
|
||||
Returns:
|
||||
dict: 心跳响应
|
||||
"""
|
||||
logger.info("处理心跳消息")
|
||||
result = {
|
||||
"type": "response",
|
||||
"command": "heartbeat",
|
||||
"status": "success",
|
||||
"message": "心跳响应",
|
||||
"timestamp": datetime.utcnow().isoformat() + 'Z'
|
||||
}
|
||||
logger.info("心跳响应已发送")
|
||||
return result
|
||||
|
||||
def _handle_control_device(self, message):
|
||||
"""
|
||||
处理设备控制命令
|
||||
|
||||
Args:
|
||||
message (dict): 控制命令消息
|
||||
|
||||
Returns:
|
||||
dict: 控制响应
|
||||
"""
|
||||
data = message.get('data', {})
|
||||
device_id = data.get('device_id')
|
||||
action = data.get('action')
|
||||
|
||||
logger.info(f"处理设备控制命令: 设备ID={device_id}, 动作={action}")
|
||||
result = self.device_manager.control_device(device_id, action)
|
||||
|
||||
response = {
|
||||
"type": "response",
|
||||
"command": "control_device",
|
||||
"data": result,
|
||||
"timestamp": datetime.utcnow().isoformat() + 'Z'
|
||||
}
|
||||
logger.info(f"设备控制命令处理完成: {response}")
|
||||
return response
|
||||
|
||||
def _handle_query_device_status(self, message):
|
||||
"""
|
||||
处理查询设备状态命令
|
||||
|
||||
Args:
|
||||
message (dict): 查询命令消息
|
||||
|
||||
Returns:
|
||||
dict: 状态响应
|
||||
"""
|
||||
data = message.get('data', {})
|
||||
device_id = data.get('device_id')
|
||||
|
||||
logger.info(f"处理查询设备状态命令: 设备ID={device_id}")
|
||||
result = self.device_manager.query_device_status(device_id)
|
||||
|
||||
response = {
|
||||
"type": "response",
|
||||
"command": "query_device_status",
|
||||
"data": result,
|
||||
"timestamp": datetime.utcnow().isoformat() + 'Z'
|
||||
}
|
||||
logger.info(f"设备状态查询完成: {response}")
|
||||
return response
|
||||
|
||||
def _handle_query_all_device_status(self, message):
|
||||
"""
|
||||
处理查询所有设备状态命令
|
||||
|
||||
Args:
|
||||
message (dict): 查询命令消息
|
||||
|
||||
Returns:
|
||||
dict: 状态响应
|
||||
"""
|
||||
logger.info("处理查询所有设备状态命令")
|
||||
result = self.device_manager.query_all_device_status()
|
||||
|
||||
response = {
|
||||
"type": "response",
|
||||
"command": "query_all_device_status",
|
||||
"data": result,
|
||||
"timestamp": datetime.utcnow().isoformat() + 'Z'
|
||||
}
|
||||
logger.info(f"所有设备状态查询完成,共 {len(result)} 个设备")
|
||||
return response
|
||||
Reference in New Issue
Block a user