小鱼系统内部有诸如小鱼解绑等事件发生时,可通过回调的方式通知合作伙伴的服务器。使得外部服务器做出适当的响应。目前支持两种方式回调,rest api 和 websocket。
1、调用接口进行管理
通过编程的方式根据业务逻辑在合适的时机调用接口或者发送Websocket消息进行管理,详情请参考实现方法
2、使用云视讯管理后台
我们提供了管理页面,可通过企业管理平台进行管理(系统服务->云视讯API->事件回调),可以管理API回调的增删改查以及查看Websocket回调
注:一个企业只能从Api回调和Websocket回调中选一种,不能混用
rest api方式回调(推荐使用此方式)
websocket方式回调
事件级别分为企业级、会议室级和分组级
①企业级事件:根据企业id将事件回调到此企业下对应事件的回调地址上
②会议室级事件:根据企业id+会议室号,将事件回调到此会议室的事件对应的回调地址上
③分组级事件:为了将企业级事件细化(因此只对企业级事件有效,标签管理请参考:标签管理),在企业级事件的基础上支持根据会议室标签(businessTag)回调,当企业级事件发生时,如果数据中的会议室有标签就将此事件回调到标签对应的回调地址,如果标签对应的回调地址不存在则查找无标签的回调地址进行回调(回归到①、②的处理逻辑)
注:Api回调需要将标签带到body中,Websocket回调需要在连接时将标签带到参数中,详见对应的文档
目前支持的业务回调事件类型:
5.2最新版:20230922版本
回调事件类型 | 说明 | 回调级别 | 默认版本(body中的version字段) | 初始平台 |
入会/出会;当用户进出会议时会推送数据 | 企业级、分组级 | v1 | 3.9最新版 | |
监控设备入会/出会;当监控设备进出会议时会推送数据(仅响应会控邀请入会的监控设备) | 企业级、分组级 | v2 | 5.2最新版 | |
视频文件生成结束;视频文件生成后推送数据; 注:如果会议室的预约会议设置了离线录制则此会议室的当场预约会议将不会发送此消息 | 企业级 、分组级 | v1 | 3.9最新版 | |
直播状态变更反馈;当直播状态有变化时推送数据 | 企业级 | v1 | 3.9最新版 | |
会议室录制状态反馈;录制动作产生时推送数据 | 企业级、分组级 | v1 | 3.9最新版 | |
会议室离线录制视频转码状态反馈;会直接推送文件生成成功的状态,如果预约会议室设置了离线录制则转码状态也会由此事件推送 | 企业级、分组级 | v1 | 3.9最新版 | |
解密状态反馈;当获取视频分享、下载链接是会触发文件解密,推送不同阶段的解密状态; | 企业级 、分组级 | v1 | 3.9最新版 | |
推流状态信息反馈;当推流发起是推送数据 | 企业级、分组级 | v1 | 5.2最新版 | |
会议状态反馈;会议开始、结束等状态发生时触发推送数据 | 企业级、分组级 | v2 | 5.2最新版 | |
会议邀请状态反馈;当邀请用户入会时会收到用户入会结果反馈;目前仅支持sdk接口邀请入会方式触发 | 企业级、分组级 | v1 | ||
云会议室参会人状态反馈;会议中人员状态变化推送数据,包含但不限于摄像头、静音等状态,无变化时1分钟推送一次(最后一个参会者退会时不推送) | 云会议室级 | v1 | 3.9最新版 | |
云会议室参会人举手动作反馈;当会议中有人举手是推送数据 | 云会议室级 | v1 | 3.9最新版 |
eventType | 说明 | 参数类型 | 适用范围 |
PING | 客户端向服务端发送该消息检测联通性 | 请求参数 | websocket |
PONG | 服务端对客户端发送的PING消息作出的响应 | 返回参数 | websocket |
REG_EVENT | 注册业务事件 | 请求参数 | websocket |
REMOVE_EVENT | 删除业务事件 | 请求参数 | websocket |
GET_EVENT | 获取业务事件 | 请求参数 | websocket |
EVENTS | 服务端对GET_EVENT事件作出的响应 | 返回参数 | websocket、Api |
REG_ROSTER_EVENT | 注册ConferenceRosterInfo事件 | 请求参数 | websocket |
REMOVE_ROSTER_EVENT | 删除ConferenceRosterInfo事件 | 请求参数 | websocket |
GET_ROSTER_EVENT | 获取ConferenceRosterInfo事件 | 请求参数 | websocket |
ROSTER_EVENTS | 服务端对GET_ROSTER_EVENT作出的响应 | 返回参数 | websocket、Api |
REG_NEMO_HANDS_EVENT | 注册终端举手事件 | 请求参数 | websocket |
REMOVE_NEMO_HANDS_EVENT | 删除终端举手事件 | 请求参数 | websocket |
GET_NEMO_HANDS_EVENT | 获取终端举手事件 | 请求参数 | websocket |
NEMO_HANDS_EVENTS | 服务端对GET_NEMO_HANDS_EVENT事件作出的响应 | 返回参数 | websocket、Api |
SERVER_UPGRADE | 服务端重启升级 | 返回参数 | websocket、Api |
{
"eventType":"回调事件类型,参考callbackEvent,类型为String",
"data": "真是的数据,类型为Object",
"code": "返回的状态码,类型为int",
"msgId": "消息id,类型为String",
"timestamp": "时间戳,类型为long"
}
NewUserCall事件回调的data数据结构(Json):
{
"callerNumber": "123456",
"calleeNumber":"91234567890",
"callerType":"device",
"calleeType":"meettingRoom",
"callStatus":"start",
"time":1522732942000,
"caller":true,
"userCountOfSameConf":5,
"callerId":"1002001",
"calleeId":"2002001",
"callerName":"安卓参会设备",
"calleeName":"pc参会设备",
"callerExternalUserId":"user1",
"calleeExternalUserId":"user2",
"callerDeviceType":1,
"calleeDeviceType":0,
"meetingId":"101-bj1-prdSig1-113314433680"
}
NewUserCall事件响应参数说明
Key | 说明 |
callerNumber | 主叫号码 |
calleeNumber | 被叫号码 |
callerType | 主叫类型(device,user,meetingRoom) |
calleeType | 被叫类型 (device,user,meetingRoom) |
callStatus | start(入会)、end(出会) |
time | 事件发生时间 |
caller | true:主叫入会 ,false:被叫入会 |
userCountOfSameConf | 会议中的人数 |
callerId | 主叫ID |
calleeId | 被叫ID |
callerName | 主叫设备名称 |
calleeName | 被叫设备名称 |
callerExternalUserId | 主叫第三方用户id |
calleeExternalUserId | 被叫第三方用户id |
callerDeviceType | |
calleeDeviceType | |
meetingId | 会议id |
IpcUserCall事件回调的data数据结构(Json):
{
"callStatus":"end",
"meetingId":"103-bj2-testqaSig2ms-2168614790956",
"time":1683255342197,
"deviceName":"武汉海康-shuttle2-研发培训场地--H264",
"deviceId":"13013100581314000093",
"meetingRoomNumber":"9026984337"
}
IpcUserCall事件响应参数说明
Key | 说明 |
callStatus | 呼叫状态,start(入会)、end(出会) |
meetingId | 会议id |
time | 事件发生时间 |
deviceName | 监控设备名称 |
deviceId | 监控设备id |
meetingRoomNumber | 会议室号码 |
RecordingStop事件回调的data数据结构(Json)
{
"vodId":98878,
"sessionId":"NORMAL_101-bj1-prdSig1-1133241065607_101-bj1-prdSig1-116196213ee7_2123168_0",
"nemoNumber":"123321",
"meetingRoomNumber":"91000637037"
}
RecordingStop事件响应参数说明
Key | 说明 |
vodId | 录制视频唯一标识 |
sessionId | 获取视频下载url的唯一标识 |
nemoNumber | 终端号码,如果为云会会议室录制,则该为空 |
meetingRoomNumber | 云会议室号,如果为终端录制,则该为空 |
LiveStatus事件回调的data数据结构(Json)
{
"status": "END",
"liveId": "9628979c7a1e1195017a1ef1644800fb",
"time": 1234567890123
}
LiveStatus事件响应参数说明
Key | 说明 |
status | 直播状态: WAIT 直播未开始 LIVING 直播中 PAUSE 暂停 END 结束 NOT_FOUND 直播不存在 |
liveId | 直播id |
time | 变更时间 |
RecordStatus事件回调的data数据结构(Json)
{
"type":"start|stop|pause|resume",
"recordStatus":"success",
"meetingRoomNumber":"91000637037",
"meetingId":"101-bj1-prdSig1-113314433680",
"time": 1634567890123
}
RecordStatus事件响应参数说明
Key | 说明 |
type | 录制类型 start(开启录制)、stop(结束录制)、pause(暂停)、resume(继续) |
recordStatus | 录制结果 fail、success |
meetingRoomNumber | 云会议室号 |
meetingId | 会议id |
time | 回调时间戳 |
TranscodingStatus事件回调的data数据结构(Json)
{
"vodId":98878,
"transcodingStatus":"success|start|fail",
"sessionId":"NORMAL_101-bj1-prdSig1-1133241065607_101-bj1-prdSig1-116196213ee7_2123168_0",
"nemoNumber":"200200",
"liveId":"9628979c7a1e1195017a1ef1644800fb",
"meetingRoomNumber":"91000637037"
}
TranscodingStatus事件响应参数说明
Key | 说明 |
vodId | 录制视频唯一标识 |
transcodingStatus | 转码状态 success(录制成功)、start(转码开始)、fail(转码失败) |
sessionId | 获取视频下载url的唯一标识 |
nemoNumber | 终端号码,如果为云会会议室录制,则该为空 |
liveId | 直播id |
meetingRoomNumber | 云会议室号 |
DecryptStatus事件回调的data数据结构(Json)
{
"vodId":98878,
"decrypt":true,
"sessionId":"NORMAL_101-bj1-prdSig1-1133241065607_101-bj1-prdSig1-116196213ee7_2123168_0",
"nemoNumber":"123367",
"liveId":"9628979c7a1e1195017a1ef1644800fb",
"meetingRoomNumber":"91000637037"
}
DecryptStatus事件响应参数说明
Key | 说明 |
vodId | 录制视频唯一标识 |
decrypt | 是否解密成功 |
sessionId | 获取视频下载url的唯一标识 |
nemoNumber | 终端号码,如果为云会会议室录制,则该为空 |
liveId | 直播id |
meetingRoomNumber | 云会议室号 |
AudioPushStatus事件回调的data数据结构(Json)
{
"pushableCount": "100",
"pushingCount": "1",
"number": "9095624694",
"state": "START",
"scene": "push",
"timestamp": "1661938111523",
"expireTime": "1724601599000"
}
AudioPushStatus事件响应参数说明
参数名称 | 说明 |
pushableCount | 当前可推送总路数 |
pushingCount | 正在推流的总路数 |
number | 当前推送的会议室号码 |
state | 推送状态,START、END |
scene | push代表推流 |
timestamp | 事件发生时间戳 |
expireTime | 当前推流总资源过期时间 |
MeetingStatus事件回调的data数据结构(Json)
{
"meetingId":"103-bj2-testqaSig2-2168371486724",
"meetingStaus":"ConfStatisReport_End",
"meetingRoomNumber":"9026984337"
}
MeetingStatus事件响应参数说明
参数名称 | 说明 |
meetingId | 会议id |
meetingStaus | 会议状态: ConfStatisReport_Start:会议开始 ConfStatisReport_End:会议结束 |
meetingRoomNumber | 会议室号码 |
MeetingInviteResp事件回调的data数据结构(Json)
{
"respList":[
{
"callNumber":"+86-17777777777",
"inviteSuccess":false,
"respCode":"611408"
}
],
"meetingId":"104-bj1-private53Sig1-1168524615660",
"meetingRoomNumber":"9006160153"
}
MeetingInviteResp事件响应参数说明
参数名称 | 说明 |
callNumber | 邀请号码 |
inviteSuccess | 邀请结果:true/false |
respCode | 返回状态码: 呼叫异常:611xxx 计费异常:622xxx 录制异常:633xxx 未知异常:6990001 成功:200 |
meetingId | 会议id |
meetingRoomNumber | 会议室号码 |
ConferenceRosterInfo事件回调的data数据结构(Json)
{
"meetingRoomNumber": "9100637037",
"meetingName": "小毛的会议室",
"meetingId": "101-bj1-prdSig1-113314433680",
"mode": null,
"mainVenue": null,
"mainImage": {
"id": 131122,
"type": 1,
"externalUserId": null,
"participantNumber": "13137387788"
},
"deviceStatusList": [
{
"name": "大毛的客户端",
"muteStatus": 0,
"vedioStatus": 0,
"watingState":1,
"participantVideoStatus":1,
"hideEndpointVideo":"hidden",
"device": {
"id": 122133,
"type": 1,
"participantId": "12332",
"externalUserId": "maomao",
"participantNumber": "13137388877"
}
}
],
"handUpList": [
{
"id": 123321,
"type": 5
}
],
"recordingDevice": {
"id": 122133,
"type": 1,
"externalUserId": "maomao",
"participantNumber": "13137388877"
},
"contentDevice": {
"id": 122133,
"type": 1,
"externalUserId": "maomao",
"participantNumber": "13137388877"
},
"whiteBoardDevice": {
"id": 122133,
"type": 1,
"externalUserId": "maomao",
"participantNumber": "13137388877"
},
"forceMute": false,
"locked": false,
"superviseMode": false,
"unReceiveAudioDeviceList": null,
"dialogueMode": false,
"focusMode": false,
"waitingRoom": false,
"multiImageBroadcastDevice": {
"id": 7,
"type": 8,
"participantId": null,
"externalUserId": null,
"participantNumber": null
}
}
ConferenceRosterInfo事件响应参数说明
参数名称 | 说明 | 初始平台 |
meetingRoomNumber | 云会议号或终端号 | all |
meetingName | 云会议室名称 | all |
mode | 会议模式,1 主席模式,0 讨论模式 | all |
mainVenue | 丢弃不用的属性值,固定为null | all |
mainImage | 主席模式时,设为主会场的设备 | all |
deviceStatusList | 设备及状态列表 | all |
name | 参会方显示名称 | all |
muteStatus | 参会方静音状态,1表示设备被静音,0表示非静音状态 | all |
watingState | 设备等候状态,1(在等待中),0(已进入) | 分区云20240329 |
participantVideoStatus | 1:关闭视频 2:开启视频 | 分区云20241018 |
hideEndpointVideo | 为空 则表示不支持该功能 为 “hidden”表示已经隐藏 为“open”表示当前没有隐藏 | 分区云20241018 |
device | 表示参会方,含两个字段id,type | all |
id | 表示参会方id(对于type=1、type=5,此处的id对应小鱼体系的UserId;对于type=7,对应终端号,其他类型终端,则对应小鱼体系的deviceId) | all |
type | all | |
participantId | 当前会议的用户唯一标识,Android/iOS SDK入会后回调函数中的participantId | all |
externalUserId | 集成sdk的app,在注册时传入的第三方用户ID | all |
participantNumber | 对于用户为呼叫号码,对于硬件设备为终端号 | all |
hardDevice | 是否为硬件设备(true/false) | all |
softDevice | 是否为app设备(true/false) | all |
deskDevice | 是否为桌面端设备(true/false) | all |
handUpList | 举手列表------举手设备的列表,由一个或多个设备构成 | all |
recordingDevice | 开启录制的设备 | all |
meetingId | 会议id | all |
forceMute | 是否强制静音 | all |
locked | 是否会议锁定 | all |
time | 回调发生的时间戳 | all |
dialogueMode | 是否开启对话模式(true\\false) | 分区云20241018 |
focusMode | 是否开启焦点模式(true\\false) | 分区云20241018 |
waitingRoom | 是否开启等候室(true\\false) | 分区云20241018 |
multiImageBroadcastDevice | 多画面广播设备 | 分区云20241108(20241018hotfix) |
NemoHands事件对应的data结构(Json)
{
"meetingRoomNumber": "91000637037",
"meetingName": "我的会议名称",
"handUpList": [
{
"id": 111231,
"type": 1,
"deviceName": "终端1"
}
],
"handChange": {
"id": 222131,
"type": 2,
"deviceName": "终端2"
},
"action": "HANDS_UP",
"time":1634567890123
}
NemoHands事件响应参数说明
参数名称 | 说明 |
meetingRoomNumber | 云会议号或终端号 |
meetingName | 会议名称 |
id | 表示参会方id(对于type=1、type=5,此处的id对应小鱼体系的UserId;对于type=7,对应终端号,其他类型终端,则对应小鱼体系的deviceId) |
type | |
handUpList | 当前举手列表------由一个或多个设备构成 |
handChange | 产生变动的终端设备------由一个构成 |
action | 动作类型:HANDS_UP(举手动作)、HANDS_DOWN(取消举手动作)、HANDS_CLEAR(清楚所有举手请求,此时handUpList和handChange均为空) |
time | 回调时间(时间戳) |