控制设备 SFU 直播起播与关键帧(play / idr)

验证状态:存在关键缺口,不可作为完整契约发布。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/连接失败重试兜底

错误与边界

  • 设备不回 play/idr 时仅停止重试;直播失败依赖 Janus 侧 15 秒重试与播放器 retryConnection
  • ctrl 枚举只有 Web 这两个发送点为证据;设备是否支持其他 ctrl 值缺证,App 不应自行扩展。
  • 传输不推出设备必达;play/idr 幂等性属设备契约(缺证),Web 以"应答到达即停"避免无限重发。

调用关系与资源清理

  • 挂载时序:playFnplayState.interval=1000, retryCount=3janusCreateFn(节流 100ms)。
  • 连接成功时序:sendKeyFrameFninterval=1000, retryCount=3
  • 卸载:发送 leave 并清理 WebRTC 资源;play/idr 的重试定时器随组件卸载停止(useInterval 生命周期)。

已知缺口

  1. 设备固件最终消费者缺证:ctrl 执行语义、应答 schema、play 与 Janus 推流的联动关系(设备何时建房/推流)无法核验。
  2. Broker ACL 待部署核验;未执行真实联调。