# ====== 插件注册信息(控制加载方式) ====== [workers] type = "aibox_sophon_adapter" module = "plugins.aibox_sophon_adapter" factory = "create_workers" cleanup = "cleanup" count = 1 [worker] name = "aibox_sophon_adapter" version = "0.1.0" description = "AI Box Sophon 设备适配器 — MQTT 心跳上报与设备状态监控" config_version = "1.0" defaults = { method = "GET", timeout = 30, auth_required = false, cacheable = false, internal = false } [worker.registration] router_prefix = "/aibox_sophon_adapter" tags = ["aibox_sophon_adapter", "sophon", "adapter"] # ====== MQTT Bridge 额外订阅主题(本插件声明,网关自动订阅并路由到本插件) ====== # topic: 订阅主题,支持 +(单级)/ #(多级,须在末尾)通配符 # subject: 可选,目标 Zenoh subject,支持 {1} {2}... 占位符; # 默认 "<插件类型>." # response_topic: 可选,响应发布主题,支持占位符;默认 "<实际匹配主题>/response" # 请求负载同样支持 _method / _timeout / _cacheable 控制字段 [[workers.mqtt_topics]] topic = "/board_ping" subject = "aibox_sophon_adapter.board_ping" # response_topic = "/board_ping/response" # 默认即 "/board_ping/response" # ====== Worker 运行时配置(由 lifespan_setup 传递给 create_workers) ====== [workers.config] data_dir = "./data" mediamtx_addr = "rtsp://127.0.0.1:8554" # MediaMTX 地址 link_path = "/data/bm-app" # 软链接路径 [workers.config.heartbeat] interval = 5 # 设备上报间隔(秒) timeout = 15 # 超时阈值(秒),超过此时间未收到心跳视为离线 check_interval = 10 # 服务端检查离线设备的间隔(秒) [workers.config.mqtt_forward] enabled = true uri = "mqtt://admin:Mixc%402021@dg.datagoo.cn:48081" # %40 是 @ 的 URL 编码 topic = "/internal/aibox_sophon_adapter/board_ping" # 转发目标主题 # ====== 外部 MQTT 订阅(本插件直接订阅外部 Broker,不走网关 Bridge) ====== # enabled: 是否启用外部订阅 # uri: 外部 Broker 地址(mqtt://user:pass@host:port,密码中特殊字符需 URL 编码) # topics: 订阅主题列表,每项包含 # topic: 订阅主题,支持 +(单级)/ #(多级,须在末尾)通配符 # handler: 处理函数名,按序从插件 router 模块、插件包自身查找 # 若该函数首个参数为 Pydantic 模型,则以消息 JSON 构造模型后调用; # 否则将消息 JSON 作为关键字参数展开调用 # reply_topic: 可选,回复主题;处理后返回值(非 None)发布到该主题 # 支持 {1} {2}... 占位符(填充 topic 通配符捕获值) [workers.config.mqtt_subscribe] enabled = true uri = "mqtt://admin:Mixc%402021@dg.datagoo.cn:48081" # 边缘应用控制器:请求-响应协议 # 请求: 发布到 /edge_app_controller,消息 {"command": "query_status", ...} # 回复: 处理结果发布到 /edge_app_controller_reply,统一封装 {"code": 0, "msg": "ok", "data": {...}} [[workers.config.mqtt_subscribe.topics]] topic = "/edge_app_controller" # 订阅主题(外部请求) handler = "edge_app_controller" # 处理函数(按 command 分发) reply_topic = "/edge_app_controller_reply" # 回复主题 # ====== 内部 MQTT 请求-响应客户端 ====== # 供外部订阅 handler 内部对任意应用进程发起请求-响应(主题显式传入,不依赖 chongming 协议) # uri: 目标 Broker(默认内部 127.0.0.1:1883;如需连外部可改为外部地址) # 使用示例(handler 内): # resp = await internal_mqtt.request( # request_topic="/other_app/request", # 目标应用监听的请求主题 # response_topic="/other_app/reply/#", # 目标应用回复的主题(支持 +/# 或 {rid} 模板) # payload={"BoardId": ...}, # timeout=30, # ) [workers.config.internal_mqtt] enabled = true uri = "mqtt://127.0.0.1:1883" # 内部请求-响应主题(edge_app_controller 的 alg_media_fetch 命令使用)。 # 注意:不要使用 chongming/{插件}/{操作} 保留命名空间——网关 MQTT Bridge # 订阅了 chongming/+/+,会拦截该命名空间下的主题并按 Worker RPC 路由, # 而 edge_app_controller 不是 @rpc_method(Worker 无对应 Queryable), # 会导致 worker_manager 报 "Worker ... 无回复,尝试重试"。请与对端应用(设备)约定一致。 request_topic = "/internal/aibox_sophon_adapter/edge_app_controller" response_topic = "/internal/aibox_sophon_adapter/edge_app_controller_reply" [workers.config.alarm_retention] max_records = 100 # 最多保留的告警记录数,设为 0 表示不限制 [workers.config.doubao_analysis] enabled = true # 是否启用豆包 AI 分析告警图片 [workers.config.alarm_forward] enabled = false # 是否启用告警转发到外部平台 url = "http://dg.datagoo.cn:60014/open-api/event-alarm/receive" # 外部告警接收地址 video_upload_url = "http://dg.datagoo.cn:60014/open-api/event-alarm/receiveVideoUpload" # 外部视频上传地址 timeout = 10.0 # 转发请求超时(秒)