|
|
|
@ -1,5 +1,218 @@ |
|
|
|
# 修改记录 |
|
|
|
|
|
|
|
## 2025-08-15 WebSocket API响应添加success字段 |
|
|
|
|
|
|
|
**修改内容:** |
|
|
|
为 `app/api/v1/endpoints/websocket.py` 中的所有WebSocket API端点添加 `success` 字段,确保所有成功响应都包含明确的操作状态标识。 |
|
|
|
|
|
|
|
**修改详情:** |
|
|
|
|
|
|
|
### 1. SuccessResponse模型已包含success字段 |
|
|
|
```python |
|
|
|
class SuccessResponse(BaseModel): |
|
|
|
"""成功响应模型""" |
|
|
|
success: bool = Field(True, description="操作是否成功") |
|
|
|
message: str = Field(..., description="响应消息") |
|
|
|
data: Optional[Dict[str, Any]] = Field(None, description="响应数据") |
|
|
|
timestamp: str = Field(..., description="时间戳") |
|
|
|
``` |
|
|
|
|
|
|
|
### 2. 为所有WebSocket API端点添加success字段 |
|
|
|
```python |
|
|
|
# create_and_connect_client - 已包含success=True |
|
|
|
return SuccessResponse( |
|
|
|
success=True, |
|
|
|
message=f"WebSocket客户端 {request.name} 创建并连接成功", |
|
|
|
data={...}, |
|
|
|
timestamp=now_iso() |
|
|
|
) |
|
|
|
|
|
|
|
# disconnect_client - 添加success=True |
|
|
|
return SuccessResponse( |
|
|
|
success=True, |
|
|
|
message=f"WebSocket客户端 {name} 断开成功", |
|
|
|
timestamp=now_iso() |
|
|
|
) |
|
|
|
|
|
|
|
# send_message - 添加success=True |
|
|
|
return SuccessResponse( |
|
|
|
success=True, |
|
|
|
message=f"消息发送成功", |
|
|
|
data={"client": name, "type": message_type, "priority": priority}, |
|
|
|
timestamp=now_iso() |
|
|
|
) |
|
|
|
|
|
|
|
# send_heartbeat - 添加success=True |
|
|
|
return SuccessResponse( |
|
|
|
success=True, |
|
|
|
message=f"心跳发送成功", |
|
|
|
data={"client": name}, |
|
|
|
timestamp=now_iso() |
|
|
|
) |
|
|
|
``` |
|
|
|
|
|
|
|
**优化效果:** |
|
|
|
- ✅ 所有WebSocket API响应都包含明确的success字段 |
|
|
|
- ✅ 客户端可以统一检查操作是否成功 |
|
|
|
- ✅ 响应格式更加规范和一致 |
|
|
|
- ✅ 便于前端处理和错误判断 |
|
|
|
- ✅ 符合RESTful API设计规范 |
|
|
|
|
|
|
|
**技术说明:** |
|
|
|
- **统一响应格式**:所有成功响应都包含success=True字段 |
|
|
|
- **明确状态标识**:客户端可以通过success字段快速判断操作结果 |
|
|
|
- **向后兼容**:不影响现有的响应数据结构 |
|
|
|
- **标准化**:符合API设计最佳实践 |
|
|
|
|
|
|
|
## 2025-08-15 Windows机器码获取命令更新 |
|
|
|
|
|
|
|
**修改内容:** |
|
|
|
更新 `app/utils/system_utils.py` 中的 `_get_windows_machine_code` 方法,将获取机器码的命令从 `wmic csproduct get uuid` 更改为 `powershell -command "(Get-CimInstance Win32_ComputerSystemProduct).UUID"`,以兼容 Windows 11 系统。 |
|
|
|
|
|
|
|
**修改详情:** |
|
|
|
|
|
|
|
### 原命令(不兼容Windows 11) |
|
|
|
```python |
|
|
|
# 使用 wmic csproduct get uuid 命令 |
|
|
|
result = subprocess.run( |
|
|
|
["wmic", "csproduct", "get", "uuid"], |
|
|
|
capture_output=True, |
|
|
|
text=True, |
|
|
|
timeout=10 |
|
|
|
) |
|
|
|
|
|
|
|
# 解析输出,跳过标题行 |
|
|
|
lines = result.stdout.strip().split('\n') |
|
|
|
if len(lines) >= 2: |
|
|
|
uuid = lines[1].strip() |
|
|
|
if uuid and uuid != "UUID": |
|
|
|
logger.info(f"Windows机器码获取成功: {uuid}") |
|
|
|
return uuid |
|
|
|
``` |
|
|
|
|
|
|
|
### 新命令(兼容Windows 11) |
|
|
|
```python |
|
|
|
# 使用 PowerShell 命令获取 UUID,兼容 Windows 11 |
|
|
|
result = subprocess.run( |
|
|
|
["powershell", "-command", "(Get-CimInstance Win32_ComputerSystemProduct).UUID"], |
|
|
|
capture_output=True, |
|
|
|
text=True, |
|
|
|
timeout=10 |
|
|
|
) |
|
|
|
|
|
|
|
if result.returncode == 0: |
|
|
|
uuid = result.stdout.strip() |
|
|
|
if uuid and len(uuid) > 0: |
|
|
|
logger.info(f"Windows机器码获取成功: {uuid}") |
|
|
|
return uuid |
|
|
|
``` |
|
|
|
|
|
|
|
**优化效果:** |
|
|
|
- ✅ 兼容 Windows 11 系统(wmic 命令已被弃用) |
|
|
|
- ✅ 简化输出解析逻辑(PowerShell 直接返回 UUID) |
|
|
|
- ✅ 保持相同的错误处理和备用方法机制 |
|
|
|
- ✅ 不影响现有的 ServiceSerial 功能 |
|
|
|
|
|
|
|
**技术说明:** |
|
|
|
- **兼容性提升**:Windows 11 不再支持 `wmic` 命令,使用 PowerShell 的 `Get-CimInstance` 替代 |
|
|
|
- **输出简化**:PowerShell 命令直接返回 UUID 值,无需解析多行输出 |
|
|
|
- **向后兼容**:保留备用方法机制,确保在异常情况下仍能获取机器码 |
|
|
|
|
|
|
|
## 2025-08-15 WebSocket消息添加ServiceSerial字段 |
|
|
|
|
|
|
|
**优化内容:** |
|
|
|
在 `app/core/websocket/manager.py` 的 `send_message` 方法中添加 `ServiceSerial` 字段,该字段从系统机器码获取,并在类初始化时缓存以避免频繁获取。后续重构将添加ServiceSerial的逻辑提取到单独的方法中。 |
|
|
|
|
|
|
|
**实现详情:** |
|
|
|
|
|
|
|
### 1. 初始化时获取机器码 |
|
|
|
```python |
|
|
|
def __init__(self): |
|
|
|
# ... 其他初始化代码 ... |
|
|
|
|
|
|
|
# 新增:缓存机器码,避免频繁获取 |
|
|
|
self._service_serial = None |
|
|
|
self._init_service_serial() |
|
|
|
|
|
|
|
def _init_service_serial(self): |
|
|
|
"""初始化服务序列号(机器码)""" |
|
|
|
try: |
|
|
|
from app.utils.system_utils import SystemUtils |
|
|
|
self._service_serial = SystemUtils.get_machine_code() |
|
|
|
if self._service_serial: |
|
|
|
logger.info(f"WebSocket管理器机器码初始化成功: {self._service_serial}") |
|
|
|
else: |
|
|
|
logger.warning("WebSocket管理器机器码获取失败,将使用默认值") |
|
|
|
self._service_serial = "unknown" |
|
|
|
except Exception as e: |
|
|
|
logger.error(f"WebSocket管理器机器码初始化异常: {e}") |
|
|
|
self._service_serial = "unknown" |
|
|
|
``` |
|
|
|
|
|
|
|
### 2. 提取ServiceSerial添加逻辑到单独方法 |
|
|
|
```python |
|
|
|
async def _add_service_serial_to_message(self, message_content: Any) -> Dict[str, Any]: |
|
|
|
"""为消息内容添加 ServiceSerial 字段 |
|
|
|
|
|
|
|
Args: |
|
|
|
message_content: 原始消息内容 |
|
|
|
|
|
|
|
Returns: |
|
|
|
添加了 ServiceSerial 字段的消息内容字典 |
|
|
|
""" |
|
|
|
# 构建消息数据格式,去除data中的type字段避免冗余 |
|
|
|
if isinstance(message_content, dict): |
|
|
|
# 复制字典避免修改原始数据 |
|
|
|
result = message_content.copy() |
|
|
|
if "type" in result: |
|
|
|
result.pop("type") |
|
|
|
else: |
|
|
|
# 如果message_content不是字典,创建一个新的字典 |
|
|
|
result = {"data": message_content} |
|
|
|
|
|
|
|
# 添加ServiceSerial字段 |
|
|
|
result["ServiceSerial"] = self._service_serial |
|
|
|
|
|
|
|
return result |
|
|
|
``` |
|
|
|
|
|
|
|
### 3. 发送消息时调用ServiceSerial添加方法 |
|
|
|
```python |
|
|
|
async def send_message(self, client_name: str, message_type: str, data: Any, priority: int = 0) -> bool: |
|
|
|
# ... 其他代码 ... |
|
|
|
|
|
|
|
# 添加ServiceSerial字段 |
|
|
|
message_content = await self._add_service_serial_to_message(data) |
|
|
|
``` |
|
|
|
|
|
|
|
**优化效果:** |
|
|
|
- ✅ 在WebSocket消息中自动添加ServiceSerial字段 |
|
|
|
- ✅ 机器码在初始化时获取一次并缓存,避免频繁调用 |
|
|
|
- ✅ 支持字典和非字典类型的消息内容 |
|
|
|
- ✅ 完善的错误处理,获取失败时使用默认值 |
|
|
|
- ✅ 详细的日志记录,便于调试和监控 |
|
|
|
- ✅ **代码重构**:将ServiceSerial添加逻辑提取到单独方法,提高代码可维护性 |
|
|
|
|
|
|
|
**技术特点:** |
|
|
|
- **性能优化**:机器码只获取一次,避免每次发送消息时都调用系统命令 |
|
|
|
- **兼容性**:支持Windows和Linux系统的机器码获取 |
|
|
|
- **容错性**:获取失败时使用"unknown"作为默认值,不影响消息发送 |
|
|
|
- **灵活性**:支持不同格式的消息内容,自动适配 |
|
|
|
- **代码质量**:单一职责原则,方法职责清晰,易于测试和维护 |
|
|
|
|
|
|
|
**消息格式示例:** |
|
|
|
```json |
|
|
|
{ |
|
|
|
"payload": { |
|
|
|
"message": { |
|
|
|
"device_id": "AMFU6R1813008221", |
|
|
|
"status": "device", |
|
|
|
"ServiceSerial": "12345678-1234-1234-1234-123456789012" |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
## 2025-08-15 实现系统接口获取机器码功能 |
|
|
|
|
|
|
|
**新增内容:** |
|
|
|
|