feat(ota): support forced firmware dispatch

This commit is contained in:
stu2not
2026-09-22 14:58:53 +08:00
parent 2467656806
commit e5ba92ba13
10 changed files with 401 additions and 27 deletions
+27 -7
View File
@@ -172,10 +172,8 @@ class TalkingQMQTTService:
),
)
await self._schedule_persistence(
device_id,
"device_info",
device_setting_service.insert_or_update(
async def persist_info_and_check_forced_ota():
await device_setting_service.insert_or_update(
device_id=device_id,
power=data.get("power"),
signal_strength=data.get("signal"),
@@ -183,8 +181,28 @@ class TalkingQMQTTService:
volume=data.get("voice"),
imei=str(imei).strip() if imei is not None and str(imei).strip() else None,
device_type=device_type,
),
)
)
if version is not None:
try:
from banban.service.device import device_service
setting = await device_setting_service.get_setting_by_device_id(device_id)
forced_update = await device_service.maybe_dispatch_forced_update(
device_id=device_id,
current_version=version,
device_type=setting.get("device_type") if setting else device_type,
ota_channel=setting.get("ota_channel") if setting else data.get("ota_channel"),
)
if forced_update:
logger.info(
device_id,
"ota",
f"已自动下发强制 OTA: target={forced_update.get('target_version')}, msg_id={forced_update.get('msg_id')}",
)
except Exception as exc:
logger.error(device_id, "ota", f"强制 OTA 自动下发失败: {exc}")
await self._schedule_persistence(device_id, "device_info", persist_info_and_check_forced_ota())
wechat_mp_notification_service.schedule_low_battery_notification(
device_id=device_id,
power=power,
@@ -854,10 +872,12 @@ class TalkingQMQTTService:
return state
async def send_ota_command(self, device_id: str, url: str, version: str) -> str:
await self._publish(
published = await self._publish(
f"device/{device_id}/command",
{"msg_id": "003", "params": {"url": url, "version": version}},
)
if not published:
raise RuntimeError(f"OTA command publish failed: {device_id}")
return "003"
async def send_nfc_notice(self, device_id: str, url: str) -> str: