add banbanmini backend
This commit is contained in:
116
talkingq-url/services/ota_flow_controller.py
Normal file
116
talkingq-url/services/ota_flow_controller.py
Normal file
@@ -0,0 +1,116 @@
|
||||
import asyncio
|
||||
from typing import Dict, Optional, Any
|
||||
from utils.logger import session_logger
|
||||
from services.device_update_manager import device_firmware_update_manager
|
||||
from services.system_config_manager import system_config_manager
|
||||
from services.connection_manager import connection_manager
|
||||
|
||||
class OTAFlowController:
|
||||
def __init__(self):
|
||||
self.active_updates: Dict[str, Dict[str, Any]] = {} # 跟踪活跃的更新流程
|
||||
|
||||
def compare_versions(self, current_version: str, latest_version: str) -> bool:
|
||||
"""
|
||||
比较版本号,判断是否需要更新
|
||||
Args:
|
||||
current_version: 当前版本号 (格式: x.y.z)
|
||||
latest_version: 最新版本号 (格式: x.y.z)
|
||||
Returns:
|
||||
bool: 如果需要更新返回True,否则返回False
|
||||
"""
|
||||
try:
|
||||
if not current_version or current_version == "unknown" or current_version == "0.0.0":
|
||||
return True
|
||||
|
||||
current_parts = [int(x) for x in current_version.split('.')]
|
||||
latest_parts = [int(x) for x in latest_version.split('.')]
|
||||
|
||||
while len(current_parts) < len(latest_parts):
|
||||
current_parts.append(0)
|
||||
while len(latest_parts) < len(current_parts):
|
||||
latest_parts.append(0)
|
||||
|
||||
for i in range(len(current_parts)):
|
||||
if latest_parts[i] > current_parts[i]:
|
||||
return True
|
||||
elif latest_parts[i] < current_parts[i]:
|
||||
return False
|
||||
|
||||
return False # 版本相同,不需要更新
|
||||
except Exception as e:
|
||||
session_logger.error("system", "ota_flow", f"版本比较出错: {str(e)}")
|
||||
return True # 出错时默认需要更新
|
||||
|
||||
async def start_update_flow(self, device_id: str) -> Dict[str, Any]:
|
||||
"""启动更新流程"""
|
||||
request_success = await device_firmware_update_manager.request_firmware_version(device_id)
|
||||
if not request_success:
|
||||
websocket = await connection_manager.get_connection(device_id)
|
||||
return {"status": "error", "message": "请求设备固件版本失败"}
|
||||
|
||||
for _ in range(10):
|
||||
await asyncio.sleep(0.5)
|
||||
|
||||
latest_version_config = await system_config_manager.get_config('latest_firmware_version')
|
||||
if not latest_version_config:
|
||||
return {"status": "error", "message": "未找到最新版本信息"}
|
||||
|
||||
latest_version = latest_version_config.config_value
|
||||
|
||||
current_version = "0.0.0"
|
||||
device_update = await device_firmware_update_manager.get_firmware_update(device_id)
|
||||
if device_update:
|
||||
current_version = device_update.firmware_version
|
||||
|
||||
need_update = self.compare_versions(current_version, latest_version)
|
||||
|
||||
self.active_updates[device_id] = {
|
||||
"need_update": need_update,
|
||||
"status": "checked",
|
||||
"current_version": current_version,
|
||||
"latest_version": latest_version
|
||||
}
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"need_update": need_update,
|
||||
"currentVersion": current_version,
|
||||
"latestVersion": latest_version
|
||||
}
|
||||
|
||||
async def execute_update(self, device_id: str) -> Dict[str, Any]:
|
||||
"""执行更新"""
|
||||
update_url_config = await system_config_manager.get_config('update_firmware_url')
|
||||
if not update_url_config:
|
||||
return {"status": "error", "message": "未找到更新URL"}
|
||||
update_url = update_url_config.config_value
|
||||
websocket = await connection_manager.get_connection(device_id)
|
||||
if not websocket:
|
||||
return {"status": "error", "message": "设备未连接"}
|
||||
try:
|
||||
await websocket.send_text(f"UPDATE_FIRMWARE:{update_url}")
|
||||
session_logger.info(device_id, "ota_flow", f"已发送固件URL到设备: {update_url}")
|
||||
|
||||
await device_firmware_update_manager.update_firmware_update(
|
||||
device_id,
|
||||
firmware_version="updating", # 临时版本标记
|
||||
update_status="updating"
|
||||
)
|
||||
await device_firmware_update_manager.update_firmware_progress(device_id, 0.0)
|
||||
return {"status": "success", "message": "更新已启动"}
|
||||
except Exception as e:
|
||||
session_logger.error(device_id, "ota_flow", f"执行更新过程中出错: {str(e)}")
|
||||
return {"status": "error", "message": str(e)}
|
||||
|
||||
async def get_update_status(self, device_id: str) -> Dict[str, Any]:
|
||||
"""获取更新状态"""
|
||||
device_update = await device_firmware_update_manager.get_firmware_update(device_id)
|
||||
if not device_update:
|
||||
return {"status": "unknown", "progress": 0, "version": "unknown"}
|
||||
return {
|
||||
"status": device_update.update_status,
|
||||
"progress": device_update.progress or 0.0,
|
||||
"version": device_update.firmware_version
|
||||
}
|
||||
|
||||
ota_flow_controller = OTAFlowController()
|
||||
Reference in New Issue
Block a user