以订阅者身份加入直播房间(VideoRoom join)

验证状态:已源码核验、未联调;Web 发送、应答消费、中心转发已双侧核验;attached 事件是否回显 transaction 依赖 Janus 实现,缺证。 适用基线:源码归纳 @ 2026-09-14

用途与场景

subscriber 身份加入设备所在的 VideoRoom 房间并订阅其发布流(feed)。成功的 attached 插件事件携带 Janus 的 SDP offer(jsep),是整条直播链路媒体协商的起点。公共口径见 会话正本

使用位置

页面/功能 角色或空间分支
SFU 直播组件 attach 成功回调内发布 join 登录用户;SFU 分支,room/feed 来自设备 pong
同组件消费 join ack 与 attached 事件 同上

对应 inventory operationId:mqtt-janusattachresultfn-server-center-server-iot-v1-forward-janus-to-a21c10e6

端点

MQTT 发布 server/center-server/iot/v1/forward/janus/to(回包按 transaction 首段 reply topic 回流)— join 请求,以订阅者身份加入 VideoRoom 房间并换取 SDP offer。

通道契约全量事实见 MQTT 主题清单 · 静态 topic动态下行;字段级契约见 yaml 详解 · forward-janus-to;janus 转发链业务语义见设备业务 · mqtt-bridge 设备消息链。请求报文 {janus:"message", body:{request:"join", ptype:"subscriber", room, streams:[{feed}]}, handle_id, transaction, session_id},transaction suffix 为 message-join(注意 start 正本 复用同一 suffix);room/feed 来自设备 pongroom=0 时播放器不进 SFU 分支)。

动线与完成判据

  • 受理 = ack;业务完成 = attached 事件(SDP 到达并计时 receivedSdpTime)。
  • Web 只在 transaction 含 ,message-join, 的回包里识别 attached——即 Web 期望该事件回显原 transaction;该回显行为属 Janus 实现(缺证),若事件不带 transaction,中心虽能按 session 归还,Web 也不会进入 SDP 分支,最终触发 15 秒无 SDP 重试。
  • 无请求级超时;15 秒无 SDP → retryConnection

错误与边界

  • ack 不是完成;attached 未到前页面显示"Waiting for janus response sdp"计时。
  • 房间/feed 不存在(设备未推流)时 Janus 的失败形态缺证;Web 无专门失败分支。
  • 中心侧:join 报文同样受严格 JSON/transaction 校验与回环防护;无回执丢弃同 会话正本

调用关系与资源清理

已知缺口

  1. attached 事件的 transaction 回显、jsep 结构、失败错误码全集由 Janus 插件/核心实现决定,源码不在本工作区;本页记录的是 Web 期望与消费逻辑。
  2. streams:[{feed}] 的 feed 语义(pong.feed)以设备固件为源(缺证)。
  3. 未执行真实 Broker/Janus 联调。