modify: mqtt心跳转发
This commit is contained in:
@@ -19,6 +19,8 @@ from fastapi import APIRouter, UploadFile, File, Form, Request, Body, HTTPExcept
|
||||
from fastapi.responses import FileResponse
|
||||
from pydantic import ValidationError
|
||||
|
||||
from chongming_request import Client
|
||||
|
||||
from .models.video_models import VideoUploadResponse, VideoUploadResult
|
||||
from .models.alarm_models import (
|
||||
AlarmReportRequest,
|
||||
@@ -30,7 +32,7 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
# 自定义路由器,前缀与 config.toml 中的 router_prefix 保持一致
|
||||
# 最终路径由网关 register_routes() 加上全局 prefix (/api/v1) 组合而成
|
||||
router = APIRouter(prefix="/aibox", tags=["aibox_sophon_adapter"])
|
||||
router = APIRouter(prefix="/aibox_sophon_adapter", tags=["aibox_sophon_adapter"])
|
||||
|
||||
|
||||
@router.post(
|
||||
@@ -168,6 +170,8 @@ async def alarm_report(
|
||||
返回格式:{"Result": {"Code": 0, "Desc": ""}}
|
||||
仅当 HTTP 200 + Code 非 0 时,盒子认为上报失败。
|
||||
"""
|
||||
zenoh_session = request.app.state.zenoh_session
|
||||
|
||||
# 手动 Pydantic 验证,失败时记录完整原始请求体
|
||||
try:
|
||||
body = AlarmReportRequest.model_validate(payload)
|
||||
@@ -182,6 +186,27 @@ async def alarm_report(
|
||||
# 获取完整报文(含 extra 字段,排除 None 值以生成整洁 JSON)
|
||||
full_data = body.model_dump(exclude_none=True)
|
||||
|
||||
async with Client(session=zenoh_session) as client:
|
||||
try:
|
||||
result = await client.call(
|
||||
worker_type="doubao",
|
||||
subject="doubao.analyze",
|
||||
payload={
|
||||
"image_base64": full_data.get("ImageData", ""),
|
||||
"prompt": full_data.get("Summary", ""),
|
||||
},
|
||||
timeout=30.0,
|
||||
retries=1
|
||||
)
|
||||
analysis = result.get("result", "")
|
||||
error = result.get("error", "")
|
||||
if error:
|
||||
logger.warning(f"Doubao 分析失败: {error}")
|
||||
else:
|
||||
logger.info(f"Doubao 分析结果: {analysis}")
|
||||
except Exception as e:
|
||||
logger.error(f"Doubao 分析调用失败: {type(e).__name__}: {e}")
|
||||
|
||||
board_id = full_data.get("BoardId", "")
|
||||
board_ip = full_data.get("BoardIp", "")
|
||||
alarm_id = full_data.get("AlarmId") or full_data.get("UniqueId", "")
|
||||
@@ -228,6 +253,11 @@ async def alarm_report(
|
||||
f"BoardId={board_id}, Summary={summary}, "
|
||||
f"Media={media_name}, VideoFile={video_file}"
|
||||
)
|
||||
# 裁剪告警记录,保留最新 N 条
|
||||
from .global_var import alarm_max_records, upload_root as _upload_root
|
||||
if alarm_max_records > 0:
|
||||
from .alarm_trim import trim_alarm_records
|
||||
await trim_alarm_records(session, _upload_root, alarm_max_records)
|
||||
else:
|
||||
logger.warning(
|
||||
f"[AlarmReport] 重复告警,已忽略: AlarmId={alarm_id}"
|
||||
|
||||
Reference in New Issue
Block a user