modify: mqtt 插件返回问题

This commit is contained in:
2026-08-10 10:16:25 +08:00
parent ba09b6768e
commit 1d768298e4
5 changed files with 106 additions and 24 deletions
+25 -13
View File
@@ -56,12 +56,12 @@ async def edge_app_controller(payload: dict, topic: str) -> dict | None:
)
if command is None:
return None
return _reply(-1, "缺少 command 字段")
handler = _COMMANDS.get(str(command))
if handler is None:
logger.warning(f"[EdgeAppController] 未知命令: {command}")
return None
return _reply(-2, f"未知命令: {command}")
try:
data = await handler(payload)
@@ -73,7 +73,7 @@ async def edge_app_controller(payload: dict, topic: str) -> dict | None:
return data
except Exception as e:
logger.error(f"[EdgeAppController] 命令 {command} 执行失败: {e}")
return None
return _reply(-3, f"命令执行异常: {e}")
# ============================================================
@@ -115,19 +115,24 @@ async def _cmd_alg_media_fetch(payload: dict) -> dict | None:
请求: {"Event": "/alg_media_fetch", "BoardId": "..."}
返回: {"board_id": ..., "medias": [...], "tasks": [...]}
"""
from .global_var import db, internal_mqtt
from .global_var import (
db,
internal_mqtt,
internal_request_topic,
internal_response_topic,
)
board_id = payload.get("BoardId")
if not board_id:
return None
return _reply(-4, "缺少 BoardId 参数")
print(f"[alg_media_fetch]Processing for board: {board_id}")
print(f"[alg_media_fetch]Expected payload: {payload}")
if db is None:
raise RuntimeError("数据库未初始化")
return _reply(-5, "数据库未初始化")
if internal_mqtt is None:
raise RuntimeError("internal_mqtt 未初始化")
return _reply(-5, "internal_mqtt 未初始化")
async with db.get_session() as session:
from .models.orm import BoardHeartbeat
@@ -139,17 +144,24 @@ async def _cmd_alg_media_fetch(payload: dict) -> dict | None:
if record is None:
print(f"[alg_media_fetch]Board {board_id} not found in database.")
return None
return _reply(-4, f"设备 {board_id} 不在数据库中")
# 内部请求-响应主题:勿用 chongming/{插件}/{操作} 保留命名空间。
# 网关 MQTT Bridge 订阅了 chongming/+/+,会拦截该命名空间并按 Worker RPC
# 路由,而 edge_app_controller 不是 @rpc_method(Worker 无对应 Queryable),
# 会导致 worker_manager 报 "Worker ... 无回复,尝试重试"。
# 主题由 [workers.config.internal_mqtt] 配置,需与对端应用(设备)约定一致。
resp = await internal_mqtt.request(
request_topic="/chongming/aibox_sophon_adapter/edge_app_controller",
response_topic="/chongming/aibox_sophon_adapter/edge_app_controller_reply",
request_topic=internal_request_topic,
response_topic=internal_response_topic,
payload=payload,
timeout=5
)
print(f"[alg_media_fetch]Response from internal_mqtt: {resp}")
if resp is None:
return _reply(-5, "获取媒体信息超时或失败")
return resp
async def _cmd_alg_task_fetch(payload: dict) -> dict | None:
@@ -163,13 +175,13 @@ async def _cmd_alg_task_fetch(payload: dict) -> dict | None:
board_id = payload.get("BoardId")
if not board_id:
return None
return _reply(-4, "缺少 BoardId 参数")
print(f"[alg_task_fetch]Processing for board: {board_id}")
print(f"[alg_task_fetch]Expected payload: {payload}")
if db is None:
raise RuntimeError("数据库未初始化")
return _reply(-5, "数据库未初始化")
async with db.get_session() as session:
from .models.orm import BoardHeartbeat
@@ -181,7 +193,7 @@ async def _cmd_alg_task_fetch(payload: dict) -> dict | None:
if record is None:
print(f"[alg_task_fetch]Board {board_id} not found in database.")
return None
return _reply(-4, f"设备 {board_id} 不在数据库中")
import json
ping_data = {}