feat(ota): support forced firmware dispatch
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user