XCC API

WebRTC

XCC 支持 WebRTC 呼叫。

  • 客户端通过 Websocket 连到 XCtrl 上,XCtrl 可能会有多个实例。
  • 通过node_uuidctrl_uuid映射保证消息能正常路由。
  • 客户端“注册”时,仅连到 XCtrl 上,与 Node 没有关系。
  • 客户端发起呼叫时,发送verto.invite消息,此时,XCtrl 查找可用节点,建立callIDnode_uuid的映射,并通过verto.trying消息通知客户端,客户端应该记住这个node_uuid并在后续的消息中发送。
  • callIDnode_uuid的映射关系将在通话结束后解除。后续的通话可能会路由到其它节点。

WebRTC 做主叫

  • RTC 客户端通过 Websocket 连接到 XCtrl。XCtrl 负责鉴权、分配 FreeSWITCH 资源等。
  • RTC 客户端发送 INVITE,XCtrl 检查路由(找到 Node 节点)并发送到对应的 FreeSWITCH,XCtrl 会保持callIDnode_uuid的对应关系,以便路由后续的消息(如 Bye)。
  • 当一个 FreeSWITCH 处理后,返回响应消息,携带node_uuid
  • 后续客户端消息都携带node_uuid,以便路由到原来的 FreeSWITCH。
  • 如果客户端刷新重新,则可能连接到其它的 XCtrl 实例上,由于node_uuid是在客户端携带,因此能正确路由到相应的 Node 节点。

WebRTC 做被叫

  • RTC 客户端的 Websocket 连接鉴权通过后,XCtrl 要存储注册信息。
  • 如果 FreeSWITCH 呼叫 WebRTC 用户,它将呼叫发送到cn.xswitch.ctrl.rtc上,XCtrl 查询到用户对应的 Websocket,然后呼叫用户。
  • 如果有多个 XCtrl,则需要一种查询机制。

Verto 支持如下呼叫字符串:

  • xrtc/profile_name/user@domain:FreeSWITCH 将查找配置文件中名字为profile_name的 profile,并将呼叫发送到 profile 配置中的xrtc-ctrl-subject节点上。由 XCtrl 负责后续寻址。
  • xrtc/user@domain:如果不带 profile_name 则默认为default profile。
  • {xcc_ctrl_uuid=xxxx}xrtc/profile_name/user@domain:FreeSWITCH 将忽略 profile 中的xrtc-ctrl-subject,将消息发送到呼叫字符串携带的通道变量xcc_ctrl_uuid
  • xrtc/user@domain;ctrl_uuid=xxxx:XCtrl 在发起呼叫时,首先查询用户 Websocket 对应的ctrl_uuid,然后生成呼叫字符串。
  • {ctrl_uuid=xxxx}xrtc/user@domain:同上。

WebRTC 配置

配置文件名字为xcc-rtc.conf.xml,大部分配置与 mod_verto 模块的配置一致。

settings

  • debug 类型 integer 调试级别

profiles

profile

  • profile 属性 name 为 profile 的名称

参数(xcc 独有的参数):

  • xrtc-ctrl-subject 类型 string XCtrl 的 nats 通信 topic,使用这个 profile 的 verto 消息都会发送到这个 topic
  • media-timeout 类型 integer 媒体超时,单位为毫秒。 当通话时超过设定时间没有媒体通信的话 freeswitch 会将通话挂断

客户端协议

客户端建议还是使用现有的verto.js协议,稍加改动(往来消息中增加params.node_uuid)。

连接

如下代码,系统支持以下连接鉴权方式:

  • 用户名/密码:只需输入login/passwd参数
  • XUI 统一登录:需要获取 xuiToken 作为xui_sessid,具体获取方法参见 XUI 相关说明
  • XCC 统一登录:需要获取 xccToken 作为xcc_token参数传入。具体获取方法参见 XCC 系统相关说明
verto.connect({
  login: username + "@" + domain,
  passwd: password, // optional, when use xui_sessid or xcc_token
  socketUrl: socketUrl,

  loginParams: {
    xui_sessid: xuiToken, // optional
    xcc_token: xccToken, // optional
  },
});

会议

Verto 会议,对于同一个会议,统一路由到一个 Node 节点上。

第一个成员呼入时,Node 将发送一个 Event Channel 消息,ConfMan 收到后,会订阅相关的事件。需要保证所有后续消息都路由到同一个 Node 节点上。

消息如下:

  • confman-liveArray.3000-xswitch.cn@xswitch.cn:与会成员列表
  • confman-chat.3000-xswitch.cn@xswitch.cn:Chat Channel
  • confman-mod.3000-xswitch.cn@xswitch.cn:Moderator Channel,可以对会议进行控制

如果后续有人加入会议,则向 Node 发送bootstrap消息,Node 收到后回复 liveArray,同步所有已经参会的与会者列表。

会议