验证状态:存在关键缺口,不可作为完整契约发布。Web 发布、应答等待与重试已源码核验;设备固件是
device/{deviceNo}/webrtc/v1的最终消费者,其对ctrl的执行与应答行为缺证。 适用基线:源码归纳 @ 2026-09-14
SFU(Janus)直播分支中,Web 在两个时机直发设备命令:组件挂载时 ctrl:"play" 请求设备开始向 Janus 房间推流(与 Janus 会话建立并行);WebRTC 连接建立后 ctrl:"idr" 请求关键帧以尽快出图。两者共页。会话信令本身见 Janus 直播会话;设备直播状态探测见探测正本。
| 页面/功能 | 角色或空间分支 |
|---|---|
| SFU 直播组件挂载即发 play,与 create 并行 | 登录用户;播放器分派到 SFU 分支(pong.room>0) |
同组件连接成功后发 ctrl:"idr" 请求关键帧 |
同上;WebRTC connectionState==="connected" |
对应 inventory operationId:mqtt-webrtclivejanus1-device-var-webrtc-v1-f76e915e(play)、mqtt-webrtclivejanus1-device-var-webrtc-v1-0e521a1b(idr)。
MQTT 发布 device/{deviceNo}/webrtc/v1(Web → Broker → 设备直发,中心网关不消费;QoS/retain 等 wire 细节见业务页)— ctrl:"play"(起播推流)与 ctrl:"idr"(请求关键帧)两个设备媒体控制命令。
设备直连 webrtc 通道属中心不消费的接入面(网关默认订阅清单无 device/+/webrtc/#,见服务端订阅面);通道业务语义见设备业务 · mqtt-bridge 设备消息链。载荷形态 {sub:"media", id, reply, params:{ctrl}},应答回流到请求 reply topic(play → …/play;idr → …/send-key-frame)。
| 层级 | 判据 |
|---|---|
| 发布完成 | publishAsync Promise 成功;不代表设备执行 |
| 命令确认 | 对应 reply topic 收到任何应答(内容不解析,仅用于清除重试定时器,) |
| 媒体可用 | 另见 Janus 直播 join 正本(SDP 到达)与 WebRTC connectionState==="connected";idr 只影响出图速度,不是可用判据 |
| 超时 | play:应答前每 1 秒重发、最多 3 次;idr:连接成功后每 1 秒重发、最多 3 次;收到应答即停止。重试 3 次后无失败终态,整体由 15 秒无 SDP/连接失败重试兜底 |
retryConnection。ctrl 枚举只有 Web 这两个发送点为证据;设备是否支持其他 ctrl 值缺证,App 不应自行扩展。playFn → playState.interval=1000, retryCount=3 → janusCreateFn(节流 100ms)。sendKeyFrameFn → interval=1000, retryCount=3。useInterval 生命周期)。ctrl 执行语义、应答 schema、play 与 Janus 推流的联动关系(设备何时建房/推流)无法核验。