技术规范
Runtime
- NodeJs 14.16.0
- npm 7.19.1
- MeidaSoup 3.7.17
业务场景前端
- Vue Cli 4.5.12
- Vue 2.0
- TypeScript 4.1.5
服务端
- ws7.4.5
- TypeScript 4.1.5
开发工具
- Intellij IDEA
术语
通讯 本文泛指基于TCP、UDP协议的Socket通讯技术,包括但不限于基于Http协议的Web Socket、长连接。
通信 本文特指基于WebRTC技术实现的通信。
产品 在SFU模式中,发布者的媒体信息被抽象成一个产品。
订阅 在SFU模式中,由消费者获取一个产品时,称为订阅。
生产者 由端发布的媒体后形成的实例。
消费者 由端订阅媒体后产生的实例。
基本思路
服务端实现基本通讯、通讯协议、通信业务逻辑的拆分。
客户端实现基本通讯、通讯协议、单拨逻辑、组拨逻辑的拆分。
服务端
基本通讯
|-- 通讯协议
|-- 通信业务(信令)
|- 通信业务(实体)
客户端
基本通讯
|-- 通讯协议
|-- 通信业务(双方通信)
|-- 通信业务(多方通信)服务端
基本通讯
服务端与客户端的通讯基于标准的WebSocket。服务端WebSocket依靠导入外部包实现。
通讯协议
通过json格式对通讯内容进行封装,包含ev(event name)、args(arguments)、ask(请求)、ans(响应)四个字段。
字段含义及作用如下:
- ev 事件名称,用于触发服务端/客户端的监听事件。
- args 事件参数,用于在触发服务端/客户端监听事件时,传入必须的参数。
- ask 请求编号,用于执行异步的监听事件。客户端/服务器向服务器/客户端发送该字段时,由服务器/客户端封装一个单独的消息返回函数,仅包含ans和args字段,以便客户端/服务器执行返回的监听。
- ans 响应编号,用于执行异步的监听事件。
通信业务
基础信令
用于维护客户端与服务器之间的连接、客户端的合法校验等等。
- '''注册'''
用于客户端鉴权、支撑通信业务。由客户端主动向服务端发起,服务端监听register事件,接收用户id、鉴权信息两个字段。服务端收到客户端消息且鉴权成功后,将用户id与用户的socket实例做绑定。对于已存在的注册信息,关闭之前注册的socket实例,保留新的socket实例。服务端可以选择是否为用户发送注册结果。
- '''心跳'''
用于维护客户端与服务端之间的通讯。由客户端主动向服务端发起,服务端监听ping事件,接收特定十六进制数0x9。
双方通信信令
- '''呼叫'''
由主叫发起,用于创建一个双方通信。服务端需判断被叫用户是否在线,判断用户是否正忙,满足可呼条件后,向被叫用户发起一双方通信呼叫请求。服务端同时需将主叫状态置忙。
- '''接受'''
由被叫用户发起,用于通知主叫用户双方通信链接可以建立。服务端需将被叫置忙。
- '''拒绝'''
由被叫用户发起,用于通知主叫用户双方通信链接已经被被叫拒绝。服务端需销毁主叫用户的生产者以及传输实例,同时将主叫状态置闲。
- '''挂断'''
由通信双方任意一方发起,用于通知另一方双方通信已经结束。服务端需销毁主被叫用户的生产者、消费者以及传输实例。同时将主被叫状态置闲。
双方通信基础信令
- '''创建WebRTC传输实例'''
用于创建一个WebRTC通讯的传输实例。传输方向分为发送和接收,因此,一个端需要创建两个传输实例,传输实例默认不连接到服务器。
- '''执行传输实例连接'''
用于将端创建的传输实例连接到服务器。
- '''创建生产者(生产产品)'''
用于端发布媒体。发布的媒体轨道即为一个生产者。一个媒体流若存在n个媒体轨道,则在不重复的情况下,最大可以创建n个生产者。
- '''关闭生产者(销毁产品)'''
用于取消一个媒体的发布。
- '''创建消费者(订阅产品)'''
用于获取一个已经发布的媒体。
- '''恢复消费者传输(恢复订阅传输)'''
默认情况下,订阅产品时,为了使媒体的传输稳定有效。在端真正获取到产品之前,订阅是处于传输暂停状态的。这样做可以使视频媒体在获得到第一帧时,不至于获取到空帧导致视频效果出现闪烁、绿条等问题。
双方通信场景信令
- '''查询全部双方通信'''
查询正在进行的全部双方通信业务。
- '''查询指定双方通信'''
根据用户id查询用户正在参与的双方通信业务。
- '''终止全部双方通信'''
终止服务器上的正在进行的全部双方通信业务。
- '''终止指定双方通信'''
终止指定用户正在进行的双方通信业务。
多方通信信令
- '''进群'''
用于端加入一个群组。服务端需创建用于执行语音视频业务的路由,并将该路由于群组信息绑定,同时需更新群组状态。
- '''离群'''
用于端离开一个群组。服务器需销毁端创建的生产者、消费者以及传输实例,同时更新群组的状态。
- '''通知生产者已创建'''
用于端在创建生产者后,通知群组内其他成员,可以订阅该生产者。
- '''获取全部生产者'''
用于端在初次进群时,查询群内已有的生产者信息。
多方通信基础信令
以下描述参考"双方通信基础信令"描述的内容
- 创建WebRTC传输实例
- 执行传输实例连接
- 创建生产者(生产产品)
- 关闭生产者(销毁产品)
- 创建消费者(订阅产品)
- 恢复消费者传输(恢复订阅传输)
多方通信场景信令
- '''设置场景'''
当具有频道管理权限的用户进入频道时,频道场景可依据管理人员设定进行变换。支持以下场景:
- 自由发言。所有在频道内的用户可以自由发言
- 自由开麦。所有在频道内的用户保持默认闭麦,可以通过发言按钮自由发言,不限制发言人数。
- 平等抢麦。所有在频道内的用户保持默认闭麦,可以通过发言按钮进行发言,当存在用户发言时,只能等待用户发言完毕后才能发言。
- 权限抢麦。所有在频道内的用户保持默认闭麦,可以通过发言按钮进行发言,用户角色权限大的用户将使正在发言的低权限用户闭麦,高权限用户发言,低权限用户无发言权力。
- 全体禁言。所有在频道内的低权限用户保持默认闭麦状态,高权限用户具有通过发言按钮进行发言的权力。
- 范围禁言。禁止指定权限范围的用户发言。
- '''摘机'''
用于抢麦的群组场景,摘机后用户可发言。
- '''挂机'''
用于抢麦的群组场景,挂机后用户不可发言。
- '''查询全部多方通信'''
查询服务器上当前正在进行的全部多方通信信息。
- '''查询指定多方通信'''
若指定用户id,查询用户参与的多方通信及参与多方通信的用户。若指定群组id,查询群组id查询参与多方通信的用户。
- '''终止指定多方通信'''
若指定用户id,终止用户的多方通信状态。若指定群组id,终止整个多方通信。
客户端
基本通讯
客户端与服务端的通讯基于标准的WebSocket。WebSocket实现由浏览器提供。
通讯协议
参考"服务端-通讯协议"的内容。
通信业务
- 注册
创建客户端实例时,会自动向服务器进行注册。客户端注册后,应同时监听call(呼叫)事件,以便接收来自于服务器的双方通信信令。
- 心跳
创建客户端实例时,会自动触发心跳方法,客户端内部监听pong事件,接收特定十六进制数0xa。由业务内部自行维护。
双方通信
- '''呼叫'''
用于呼叫一个用户。
- '''接受'''
用于接收一个来自于主叫的呼叫。
- '''拒绝'''
用于拒绝一个来自于主叫的呼叫。
- '''挂断'''
用于挂断一个已存在的通话。
''其余双方通信业务参考:双方通信场景信令''
多方通信
- '''进群'''
用于进入一个群组。
- '''离群'''
用于离开一个群组。
- '''创建生产者'''
用于发布媒体。
- '''废除生产者'''
用于取消一个已经发布的媒体。
- '''创建消费者'''
用于订阅一个媒体。
- '''获取群组生产者'''
用于获取群组内已经创建的生产者信息。
''其余多方通信业务参考:多方通信场景信令''
DISCUSSION
评论
还没有公开评论,欢迎留下想法。