2026-08-03 16:56:10 +08:00
|
|
|
|
# ====== 插件注册信息(控制加载方式) ======
|
|
|
|
|
|
[workers]
|
|
|
|
|
|
type = "aibox_sophon_adapter"
|
|
|
|
|
|
module = "plugins.aibox_sophon_adapter"
|
|
|
|
|
|
factory = "create_workers"
|
|
|
|
|
|
cleanup = "cleanup"
|
|
|
|
|
|
count = 1
|
|
|
|
|
|
|
2026-07-27 14:26:48 +08:00
|
|
|
|
[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]
|
2026-08-03 09:18:27 +08:00
|
|
|
|
router_prefix = "/aibox_sophon_adapter"
|
|
|
|
|
|
tags = ["aibox_sophon_adapter", "sophon", "adapter"]
|
2026-07-27 14:26:48 +08:00
|
|
|
|
|
2026-08-07 09:39:42 +08:00
|
|
|
|
# ====== MQTT Bridge 额外订阅主题(本插件声明,网关自动订阅并路由到本插件) ======
|
|
|
|
|
|
# topic: 订阅主题,支持 +(单级)/ #(多级,须在末尾)通配符
|
|
|
|
|
|
# subject: 可选,目标 Zenoh subject,支持 {1} {2}... 占位符;
|
|
|
|
|
|
# 默认 "<插件类型>.<topic 最后一段>"
|
|
|
|
|
|
# response_topic: 可选,响应发布主题,支持占位符;默认 "<实际匹配主题>/response"
|
2026-08-14 16:04:09 +08:00
|
|
|
|
# 请求负载为信封协议: {"meta": {"method"/"timeout"/"cacheable"}, "data": {...}}
|
|
|
|
|
|
# meta 各字段可选(method 默认 GET,timeout 默认 30s,cacheable 默认 false)
|
2026-08-19 11:46:12 +08:00
|
|
|
|
# 兼容非信封原始报文(如盒子心跳 JSON):整包视为 data、meta 置空照常路由
|
2026-08-10 10:45:15 +08:00
|
|
|
|
# 盒子侧只支持设置根主题:根主题已改为 box(非 chongming 保留命名空间,避免被网关 Bridge 拦截),
|
|
|
|
|
|
# 盒子心跳发布到 box/aibox_sophon/board_ping,映射到本插件的心跳 RPC。
|
2026-08-07 09:39:42 +08:00
|
|
|
|
[[workers.mqtt_topics]]
|
2026-08-10 10:45:15 +08:00
|
|
|
|
topic = "box/aibox_sophon/board_ping"
|
2026-08-07 09:39:42 +08:00
|
|
|
|
subject = "aibox_sophon_adapter.board_ping"
|
2026-08-10 10:45:15 +08:00
|
|
|
|
# response_topic = "box/aibox_sophon/board_ping/response" # 默认即 "<实际匹配主题>/response"
|
2026-08-07 09:39:42 +08:00
|
|
|
|
|
2026-08-03 16:56:10 +08:00
|
|
|
|
# ====== Worker 运行时配置(由 lifespan_setup 传递给 create_workers) ======
|
|
|
|
|
|
[workers.config]
|
|
|
|
|
|
data_dir = "./data"
|
2026-08-11 14:55:46 +08:00
|
|
|
|
# mediamtx_addr = "rtsp://127.0.0.1:8554" # MediaMTX 地址
|
|
|
|
|
|
mediamtx_addr = "rtsp://127.0.0.1/channel" # MediaMTX 地址
|
2026-08-03 16:56:10 +08:00
|
|
|
|
link_path = "/data/bm-app" # 软链接路径
|
|
|
|
|
|
|
2026-09-18 09:25:43 +08:00
|
|
|
|
# [workers.config.database]
|
|
|
|
|
|
# type = "postgresql"
|
|
|
|
|
|
# url = "postgresql+asyncpg://postgres:postgres@localhost:5432/aibox_sophon_adapter"
|
2026-09-04 14:51:35 +08:00
|
|
|
|
|
2026-08-03 16:56:10 +08:00
|
|
|
|
[workers.config.heartbeat]
|
2026-07-27 14:26:48 +08:00
|
|
|
|
interval = 5 # 设备上报间隔(秒)
|
|
|
|
|
|
timeout = 15 # 超时阈值(秒),超过此时间未收到心跳视为离线
|
|
|
|
|
|
check_interval = 10 # 服务端检查离线设备的间隔(秒)
|
2026-08-03 15:05:35 +08:00
|
|
|
|
|
2026-08-03 16:56:10 +08:00
|
|
|
|
[workers.config.mqtt_forward]
|
2026-09-18 09:25:43 +08:00
|
|
|
|
# enabled = true
|
|
|
|
|
|
enabled = false
|
2026-08-14 16:27:30 +08:00
|
|
|
|
# uri 含凭据,请勿提交到仓库:留空时从环境变量 AIBOX_MQTT_URI 读取
|
|
|
|
|
|
# 格式 mqtt://user:pass@host:port,密码中特殊字符需 URL 编码(@ → %40)
|
|
|
|
|
|
uri = ""
|
2026-08-11 14:55:46 +08:00
|
|
|
|
topic = "/board_ping" # 转发目标主题
|
2026-08-03 15:05:35 +08:00
|
|
|
|
|
2026-08-07 14:28:21 +08:00
|
|
|
|
# ====== 外部 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]
|
2026-09-18 09:25:43 +08:00
|
|
|
|
# enabled = true
|
|
|
|
|
|
enabled = false
|
2026-08-14 16:27:30 +08:00
|
|
|
|
# uri 含凭据,请勿提交到仓库:留空时从环境变量 AIBOX_MQTT_URI 读取(格式同 mqtt_forward)
|
|
|
|
|
|
uri = ""
|
2026-08-07 14:28:21 +08:00
|
|
|
|
|
|
|
|
|
|
# 边缘应用控制器:请求-响应协议
|
|
|
|
|
|
# 请求: 发布到 /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]
|
2026-09-18 09:25:43 +08:00
|
|
|
|
# enabled = true
|
|
|
|
|
|
enabled = false
|
2026-08-07 14:28:21 +08:00
|
|
|
|
uri = "mqtt://127.0.0.1:1883"
|
|
|
|
|
|
|
2026-08-10 10:15:47 +08:00
|
|
|
|
# 内部请求-响应主题(edge_app_controller 的 alg_media_fetch 命令使用)。
|
2026-08-10 10:45:15 +08:00
|
|
|
|
# 与盒子侧约定一致:盒子只设根主题 box(非 chongming 保留命名空间),
|
|
|
|
|
|
# 子路径固定 aibox_sophon/...,回复主题固定为 ..._reply。
|
|
|
|
|
|
# 不要用 chongming/{插件}/{操作}——网关 MQTT Bridge 订阅 chongming/+/+,
|
|
|
|
|
|
# 会拦截 3 级主题并按 Worker RPC 路由,而 edge_app_controller 不是 @rpc_method,
|
|
|
|
|
|
# 会导致 worker_manager 报 "Worker ... 无回复,尝试重试"。
|
|
|
|
|
|
request_topic = "box/aibox_sophon/edge_app_controller"
|
|
|
|
|
|
response_topic = "box/aibox_sophon/edge_app_controller_reply"
|
2026-08-10 10:15:47 +08:00
|
|
|
|
|
2026-08-03 16:56:10 +08:00
|
|
|
|
[workers.config.alarm_retention]
|
2026-08-03 15:05:35 +08:00
|
|
|
|
max_records = 100 # 最多保留的告警记录数,设为 0 表示不限制
|
2026-08-05 14:21:41 +08:00
|
|
|
|
|
|
|
|
|
|
[workers.config.doubao_analysis]
|
2026-08-11 14:55:46 +08:00
|
|
|
|
enabled = false # 是否启用豆包 AI 分析告警图片
|
2026-08-05 14:21:41 +08:00
|
|
|
|
|
2026-09-04 14:51:35 +08:00
|
|
|
|
[workers.config.ip_sound_column]
|
|
|
|
|
|
enabled = false # 是否开启IP音柱报警
|
2026-09-10 16:44:17 +08:00
|
|
|
|
volume = 50
|
|
|
|
|
|
tts = {}
|
2026-09-04 14:51:35 +08:00
|
|
|
|
|
2026-08-05 14:21:41 +08:00
|
|
|
|
[workers.config.alarm_forward]
|
2026-09-18 09:25:43 +08:00
|
|
|
|
enabled = false # 是否启用告警转发到外部平台
|
|
|
|
|
|
# enabled = true # 是否启用告警转发到外部平台
|
2026-08-11 14:55:46 +08:00
|
|
|
|
# url = "http://dg.datagoo.cn:60014/open-api/event-alarm/receive" # 外部告警接收地址
|
|
|
|
|
|
url = "http://192.168.1.6:48092/open-api/event-alarm/receive" # 外部告警接收地址
|
|
|
|
|
|
# video_upload_url = "http://dg.datagoo.cn:60014/open-api/event-alarm/receiveVideoUpload" # 外部视频上传地址
|
|
|
|
|
|
video_upload_url = "http://192.168.1.6:49092/open-api/event-alarm/receiveVideoUpload" # 外部视频上传地址
|
2026-08-05 14:21:41 +08:00
|
|
|
|
timeout = 10.0 # 转发请求超时(秒)
|
2026-09-14 09:19:21 +08:00
|
|
|
|
|
|
|
|
|
|
# ====== IN2 数字输入控制任务启停 ======
|
2026-09-17 15:33:55 +08:00
|
|
|
|
# 监听盒子 IN2 DI 输入,电平变化时控制全部算法任务:
|
2026-09-14 09:19:21 +08:00
|
|
|
|
# IN2 有电(电平 1)→ 启动全部算法任务;IN2 断电(电平 0)→ 停止全部算法任务
|
|
|
|
|
|
# 盒子接口:POST {api_base}/api/alg_task_fetch(查询任务)、POST {api_base}/api/alg_task_control(启停控制)
|
2026-09-17 15:33:55 +08:00
|
|
|
|
# 后端自适应(diwatch.make_in2_backend):
|
|
|
|
|
|
# SE9 — sysfs 状态文件 /sys/bus/platform/devices/gpio-in-2/gpio_status(轮询+抗抖)
|
|
|
|
|
|
# SE5 — 无 gpio-in-2,回退 gpio-keys event 设备(默认 /dev/input/event1,键码 key,默认 KEY_DOWN=108)
|
|
|
|
|
|
# 注意:
|
|
|
|
|
|
# - 只响应电平跳变,不按插件启动时的初始电平动作(避免重启时误触发全量启停)
|
|
|
|
|
|
# - event 后端需要 /dev/input/event* 读权限:linaro 用户执行
|
|
|
|
|
|
# `sudo usermod -aG input linaro` 并重新登录(服务以 root 运行则无此问题)
|
|
|
|
|
|
# - 操作 IN2 无反应时,先运行 `python3 -m diwatch detect` 查实际键码再填 key
|
2026-09-14 09:19:21 +08:00
|
|
|
|
[workers.config.task_switch]
|
|
|
|
|
|
enabled = true
|
|
|
|
|
|
api_base = "http://127.0.0.1" # 盒子 HTTP API 地址(网关与盒子同机部署用 127.0.0.1)
|
|
|
|
|
|
start_command = 1 # 启动任务的 ControlCommand
|
|
|
|
|
|
stop_command = 0 # 停止任务的 ControlCommand
|
2026-09-17 15:33:55 +08:00
|
|
|
|
poll_interval = 0.05 # IN2 轮询间隔(秒,sysfs 后端)
|
|
|
|
|
|
debounce = 3 # 抗抖:连续 N 次采样一致才确认跳变(sysfs 后端)
|
2026-09-14 09:19:21 +08:00
|
|
|
|
# active_low = false # 电平取反(默认 false:1=有电=启动任务)
|
2026-09-17 15:33:55 +08:00
|
|
|
|
# device = "/dev/input/event1" # 显式指定 event 设备(默认自动查找 gpio-keys)
|
|
|
|
|
|
# key = 108 # SE5 event 键码(用 diwatch detect 查实际键码后填写)
|