venus,sdk,网关,imcp, 管控,信令,gateway,MCU这些都是什么

2 阅读7分钟

简单一句话版

先给你一个总图:

  • MCU 和 网关(gateway / Venus):偏“音视频底座”,负责真正的通话/推流。
  • imcp / 管控 / 信令:偏“业务大脑”,负责有哪些会议、谁在开会、列表、录制、权限等。
  • SDK(venus / venus-sdk):前端/客户端用来“调用这些能力”的开发库。

下面逐个用你的词解释:

1. Venus / gateway / 网关

  • Venus:
  • 一个音视频引擎 + 网关方案的名字(你项目里用的 venus-0.7.5.js、venus_manager.js 就是它)。
  • 负责 WebRTC、SIP 通话、媒体转发等“底层音视频能力”。
  • gateway / 网关地址(例:ws://106.120.208.24:8188/gw):
  • 是 Venus 网关服务的访问地址,通常是 WebSocket 或 HTTPS URL。
  • 你的浏览器 / APP 通过它和 Venus 网关建立连接,做:
  • 注册到网关
  • 发起/接听音视频通话
  • 进会、退会
  • 推/拉流等
  • 登录页里的“网关地址”填的就是这个。

可以简单理解:Venus + 网关 = 音视频信令 + 媒体通道的入口。

2. MCU(Multipoint Control Unit)

  • 中文一般叫“多点控制单元/会议服务器”,例:10.110.0.21:15060。
  • 职责:
  • 维护每个 SIP 分机(register_code,比如 1002、12233)
  • 音视频混屏、转发、录制
  • 对讲、监控通道(mcu_channels)、会议室媒体路由等
  • 在你项目中:
  • 登录页的 MCU 地址 是 IP:端口(如 10.110.0.21:15060)
  • Venus SDK 在底层会向 MCU 做 SIP 注册:
  • 使用 authuser(name / exten = 账号或分机号)
  • 使用 SIP 密码(secret)
  • 没有正确的 MCU 地址、分机号和密码,就会出现:
  • sip Service Unavailable (503)
  • sip Operation has no matching challenge 之类报错。

可以理解成:MCU = 真正开会、混音混画、录制的会议服务器,网关+客户端都要跟它打交道。

3. SDK / venus-sdk

  • 你项目里的 sdk.js + venus-core.js 封装了一层 SDK:
  • 向外提供简单方法:sdk.login、sdk.callAudio、sdk.callVideo 等。
  • 内部调用 Venus 的 legacy 库(venus_manager.js、venus-0.7.5.js),再通过 Venus 去和 网关 + MCU 打交道。
  • 对前端开发者来说:
  • 你调用的是 SDK(sdk.login({ account, gateway, mcu, register_code }))
  • SDK 替你调用 Venus,再去连网关、连 MCU、做 SIP 注册。

一句话:SDK = 给前端用的“封装好的一套 API”,底层真正干活的是 Venus 和 MCU。

4. imcp / 管控 / 信令 / backend

  • imcp:你环境里的 管控信令服务,示例地址:
  • ws://106.120.208.24:10020/imcp
  • 管控(管理控制):
  • 管“业务”:有哪些会议、会议列表分页、谁是主持人、谁静音、录制列表、直播列表等等。
  • 信令(在这个项目语境下):
  • 通过 WebSocket(imcp)传输的 业务消息:
  • 例如:type: 'meeting', action: 'list'、action: 'mute_all'、type: 'streaming' 等。
  • 我们写的 BackendWS / Signaling / SignalingState 就是对这套 后台信令 的封装。
  • 区分一下:
  • Venus 网关信令:偏音视频、SIP / WebRTC ,走 ws://.../gw
  • imcp 管控信令:偏会议/直播业务状态,走 ws://.../imcp

可以想象:

  • imcp 管控 = 大脑:管有哪些会议、什么状态
  • Venus 网关 + MCU = 身体:具体打电话、开会、推流

5. “信令”这个词本身

  • 广义上:非媒体的数据控制消息,用来:
  • 建立 / 修改 / 结束会话(谁呼谁、谁挂断)
  • 同步状态(静音、举手、布局、直播开启/停止)
  • 在你项目里有两层信令:
  • 前端 ↔ 管控(imcp):业务信令(会议列表、mute_all、participants list 等)
  • 终端 ↔ 网关/MCU(Venus/SIP/WebRTC):媒体信令(SIP REGISTER、INVITE、ICE、SDP)。

总结一张对照表

  • Venus / 网关 / gateway:
  • 音视频网关 + WebRTC/SIP 信令入口,地址如 ws://106.120.208.24:8188/gw
  • 登录页的“网关地址”,call 页通话时使用。
  • MCU:
  • 会议服务器,多点控制单元,地址如 10.110.0.21:15060
  • 存 SIP 分机、混屏、录制,对讲/监控都依赖它。
  • SDK(sdk.js + venus-core):
  • 给前端用的一层封装:你调 sdk.login/call,内部帮你去连 Venus 网关 + MCU。
  • imcp / 管控 WebSocket:
  • ws://106.120.208.24:10020/imcp,负责会议/直播等业务信令
  • 对应 BackendWS / Signaling / SignalingState。
  • 管控后台(HTTP):
  • 人用的管理界面 + REST API,会议列表、录制列表等。
  • 信令:
  • 所有“控制类”的消息统称;
  • 既包括 imcp 的会议业务信令,也包括 SIP / WebRTC 层的通话信令。

如果你愿意,我可以画一个简单流程图,把“登录 → 取 register_code/gateway/mcu → SDK → Venus → MCU/imcp”整个链条串起来,便于你和后端、运维对齐。

总体架构流程图(文字版)

先给你一张整体“数据流”图,方便脑子里有全局: flowchart LR subgraph Browser[浏览器 / 小京 Web 前端] Login[登录页 login.html
输入账号/网关/MCU/分机号] Meetings[会议管理页 meetings.html] Call[通话页 call.html] SDK[sdk.js / venus-core.js] end

subgraph Backend[后台 / 管控]
  IMCP_WS[管控信令 WebSocket<br/>ws://106.120.208.24:10020/imcp]
  IMCP_HTTP[管控 REST 接口<br/>http://106.120.208.24:9000/api/...]
end

subgraph Media[音视频侧]
  VenusGW[Venus 网关<br/>ws://106.120.208.24:8188/gw]
  MCU[MCU 会议服务器<br/>10.110.0.21:15060]
end

Login -->|保存 account/gateway/mcu/register_code| Call
Meetings -->|BackendWS / Signaling<br/>会议/直播列表、状态| IMCP_WS

Call -->|调用 sdk.login / callAudio / callVideo| SDK
SDK -->|WebRTC/SIP 信令| VenusGW
SDK -->|SIP 注册: authuser=register_code 或 account<br/>proxy=sip:10.110.0.21:15060| MCU

Meetings -->|HTTP: 会议分页、录制列表等| IMCP_HTTP

image.png

登录 → 通话 → MCU / 网关 流程

再用步骤把上图拆开说一遍:

  1. 登录页 login.html
  • 你在页面上填:
  • 账号:account
  • 密码:password
  • 网关地址:gateway_url(如 ws://106.120.208.24:8188/gw)
  • MCU 地址:mcu_ip:mcu_port(如 10.110.0.21:15060)
  • 分机号(可选):register_code(如 1002、12233)
  • 页面把这些值写到 sessionStorage 里,供后面的通话页使用。
  1. 通话页 call.html 自动登录
  • 打开 call 页时,会从 sessionStorage 取:
  • account、password
  • gateway、mcu
  • register_code(如果有)
  • 然后调用:
sdk.login({
   account,
   password,
   gateway,      // 网关地址
   mcu,          // MCU IP:port
   register_code // 分机号(可选)
 })
  1. SDK / Venus-core 封装参数
// venus-core.js 里
   const sipIdentity = register_code || account;

data = {
 name: sipIdentity,   // SIP name
 exten: sipIdentity,  // SIP exten
 gateway: gateway,    // ws://.../gw
 server: mcu,         // 10.110.0.21:15060
 password: password
}

然后调用 legacy:

venus_manager.initAndLogin(data, ...)
  1. Venus / SIP 注册到 MCU

在 venus_manager.js 里会构造真正的 SIP 注册报文:

   register = {
     username: 'sip:' + name + '@' + server, // name = 分机号或账号
     authuser: name,
     secret: password,                       // 密码
     proxy: 'sip:' + server + ":" + port    // sip:10.110.0.21:15060
   }
  • 如果 MCU 上有这个分机号 + 密码 → 注册成功,后面就能呼叫。
  • 不匹配就会出现:
  • sip Service Unavailable (503):地址不对 / 服务不可用。
  • sip Operation has no matching challenge:用户名或密码对不上。
  1. 发起通话
  • 页面输入被叫号码(如 1001),点击拨号:
  • sdk.callAudio('sip:1001@ip') 或 sdk.callVideo(...)
  • SDK 通过 Venus 网关和 MCU 建立会话,完成媒体通道建立。

管控(IMCP)侧:会议/直播列表和状态

这条链路和上面的“打电话”是并行、互补的:

image.png

  • 这条线主要负责 业务界面:
  • 会议列表 / 历史会议
  • 直播列表、录制列表
  • 参会人、静音、布局、直播开关等
  • 它和 Venus 网关 / MCU 分工不同:
  • imcp:业务大脑
  • Venus + MCU:音视频通道 如果你愿意,我可以再给一版「最简 2×2 象限图」,帮你快速判断“这个问题该去看哪一块(网关/MCU 还是管控/imcp)”。

2×2 象限图:问题归属快速判断

用两个维度来划分:

  • 横轴:媒体相关 ←→ 业务相关
  • 纵轴:客户端侧 ←→ 后端侧

image.png

四个象限分别是谁?

  • A 象限(客户端 & 媒体/业务混合)
  • login.html / call.html / meetings.html
  • sdk.js、venus-core.js、signaling.js
  • 这里的问题通常是:参数没传好、UI 逻辑错误、状态没更新等。
  • B 象限(后端 & 业务)
  • 管控 WebSocket:ws://106.120.208.24:10020/imcp
  • 这里的问题通常是:会议列表不对、状态不更新、权限/接口错。
  • C 象限(后端 & 媒体)
  • Venus 网关:ws://106.120.208.24:8188/gw
  • MCU 媒体通道:10.110.0.21:15060(SIP / RTP 等)
  • 这里的问题通常是:SIP 注册错误、Service Unavailable、音视频连不通、ICE 失败。
  • D 象限(后端 & 媒体 + 业务控制交界)
  • MCU 上的会议控制:布局、混屏策略、录制开关等
  • 比如:某些会场看不到画面、录制策略不符合预期,多半在这块配置。

你可以这么用这张图:

  • 看到 sip ... 报错、SDP/ICE 日志 → 先看 C 象限(网关 / MCU)和 A 象限 SDK 参数。
  • 会议列表、直播列表、参会人错了 → 看 B 象限(imcp / REST)。
  • UI 不刷、按钮没反应 → 多半在 A 象限。