《device-link.md》修订附录 2026-10-19

原报告 · 核对基线 commit eac3717 · 总评审:DCU_DesktopController_专家评审_2026-10-19.html
原报告:Device Link / ConnectionHub(全链路统一连接层)
时间线:status: delivered,2026-09-16(670b833 → f950257)
原结论概要:外壳 tabs.html 作为 Owner 持有链路健康轮询并经 BroadcastChannel 广播;端点(IP/网卡)集中在 deviceLink;外壳启动即 open+motor/start,失败 10s 退避。

原文件保持不变;本附录逐条记录其结论在当前代码中的状态。

逐条结论跟踪

编号原结论 / 建议当前状态证据(文件:行号)备注
DL-1外壳 Owner + BroadcastChannel 快照已修复(已交付)tabs.html:205; js/common/device-link.js:117, 389
DL-2端点配置只在 ConnectionHub部分修复pages/can_monitor.html:55; js/can_monitor.js:60-68; js/app.js:63-71CAN 监控页硬编码 IP 优先于 Hub(C-11);OTA 页 IP 输入可绕过
DL-3功能页不再各自判定在线部分修复js/common/polling.js; js/can.js:424; js/can_monitor.js:487多处仍独立轮询 /system/status(C-13)
DL-4外壳启动强制开总线,失败 10s 退避仍存在风险js/common/device-link.js:32, 250-287无 reason、unknown 视为需启动、OTA 闸读不到 iframe 标志(M-6、M-7)
DL-5BLE 经 reportBle 上报已修复(已交付)js/ble/gatt.js:119, 123, 128

相关新问题(详见总评审)

严重 [C-11] 独立 CAN 监控页无视所选设备

模块
CAN/公共层
位置
pages/can_monitor.html:55; js/can_monitor.js:60-68; js/can/dbc.js:40-47
现象
页面输入框写死 value="192.168.31.127" 且优先于共享端点,监控标签总连 .127;绕过 IPv4 校验;与 dbc.js 优先级不一致,破坏 README 所述单端点写入者设计。
风险
监控的不是正在控制的设备。
修改建议
移除硬编码值,统一从 deviceLink 读取。

严重 [M-6] 「谁可以动总线」红线被多处绕过

模块
电机控制/故障保护
位置
js/motor/transport-ecat.js:394-459, 668; js/common/device-link.js:250-287, 322-327
现象
transport-ecat.ensureStarted 在 isBusHealthy 为 false(含 unknown)时调用 motor/start,不带 reason、不走 ensureEcatLoopRepair 预算,并重复实现 ecat-bus.resolveEcatStartBody 的周期/DC 逻辑;Owner bootstrapEcatBus 同样无 reason 且把 unknown 当需要启动;repairEcatDc 无间隔/次数预算,pollEcat 每 2 s 与 healthCheck 都可触发。
风险
健康总线被误重启、OTA/刷写期间总线被抢、DC 修复风暴。
修改建议
所有 start/repair 统一经 ecat-bus 单入口(带 reason、预算与 OTA 闸);unknown 状态不得触发启动;删除 transport-ecat 内重复的周期计算(与 host-code-quality R6 同源)。

严重 [M-7] OTA 忙标志写在 iframe 窗口,外壳 Owner 读不到

模块
电机控制/故障保护
位置
js/motor/transport-ecat.js:80-82; js/common/device-link.js:255
现象
setMotorOtaEcatBusy 写的是电机页 iframe 自身的 window.motorOtaEcatBusy;Owner 运行于 tabs.html 顶层窗口并读自己的 window,闸门永不生效;页面中途关闭时标志也不会清除。
风险
OTA 期间 Owner 仍可能 open/motor/start 抢总线,导致刷写失败或半截镜像。
修改建议
改用 BroadcastChannel/localStorage 带 TTL 的跨帧忙标志(与 boot_ecat.js:598 统一一处实现),Owner 读取同一来源。

一般 [C-13] 对设备的并发轮询过多

模块
CAN/公共层
位置
js/common/device-link.js:30; js/can.js:131, 424; js/can_monitor.js:487, 490; tabs.html:76-81; js/common/polling.js:350-352
现象
/system/status 被 Owner(1 Hz)、OTA 页(1 Hz)、can.js(5 s)、can_monitor(5 s) 同时轮询;/can/feedback 被抽屉与独立监控页各 1 Hz;隐藏 iframe 继续轮询,无可见性暂停与离线退避。README 称设备 httpd 仅 6 个 socket 且 lru_purge。
风险
连接被挤占驱逐,业务请求失败。
修改建议
状态统一由 Owner 广播;隐藏页暂停;离线指数退避。

结论

共 5 条:已修复 2、部分修复 2、仍存在/存疑 1、已过时 0、无法在本仓库核实 0。