# 通话状态通知
# 简介
获取通话状态通知是菊风云平台提供的一项服务。通过该服务,您的服务器可以获得通话的实时状态通知,从而使您能够在通话业务的基础上增加额外的业务控制。
文档描述基于您已经完成以下工作:
基本架构
# 控制台配置通知服务器
为了获取通话状态通知,您需要在控制台设置接收通话状态通知的服务器地址、鉴权用户名和密码:
- 进入控制台 - 服务管理 - 应用管理
- 在 操作 一栏中点击 设置 图标
- 在 状态配置 中 点击 添加状态服务器 后的 添加 按钮
其中:
HTTP 鉴权域用户名和用户密码,是用于访问您的服务器的用户名和密码
服务器 URL 是您的服务器访问的 URL 信息
- 如果您的服务器通过 HTTPS 访问,请对应选择 HTTPS
- 如果您的服务器通过域名访问,这里需要填入对应域名
- 如果您的服务器有特定的访问路径,请一并填入。例如 112.124.116.65:7123/call_status/
TIP
配置将在 15 分钟内生效。
# 重发机制
为保证状态通知的可靠性,菊风服务器按照以下规则重发通知请求:
- 事件发生时发送第一次通知请求
- 正确响应要求响应中的 tid 和请求中的 tid 保持一致,并且 ret 的值为 true
- 没有收到正确响应的情况下,间隔 2 分钟重发一次,一共重发 5 次
# 消息格式
statusNotify 消息用于通知通话状态,由菊风服务器发起 RESTful 请求,由客户服务器响应。获取通话状态通知的操作如下:
# 请求
HTTP报文样例:
POST HTTP/1.1
Authorization: Basic YWRtaW46MTIz
Content-Length: 317
Content-Type: application/json
Domain: sample.cloud.justalk.com
{
"in":{"params":{},
"roomId":"96305879581145",
"status":"{\"pub\":\"join\",
\"actor\":{\"[username:alice@sample.cloud.justalk.com]\":
{\"nick\":\"alice\",
\"role\":7,
\"state\":2,
\"idx\":3}
},
\"roomId\":\"96305879581145\",
\"time\":1469511339}",
"userData":"My UserData",
"conferenceNumber":"327511"},
"cmd":"statusNotify.JSME.JSM",
"oid":"JSMUser",
"tid":4022588287,
"params":{}
}
HTTP报文头:
报文头域 | 是否必选 | 值 | 说明 |
---|---|---|---|
POST | 是 | ||
Authorization | 否 | Basic [Base64(菊风分配的域用户名:密码)] | 此处假定客户指定的HTTP鉴权用户名为user,密码为password,"dXNlcjpwYXNzd29yZA=="为(“user:password”)字符串经过Base64编码后的结果 |
Content-Length | 是 | HTTP Body的实际长度 | |
Content-Type | 是 | application/json | |
Domain | 否 | 发起请求者的域名 |
配置参数:
键 | 值的格式/类型 | 说明 |
---|---|---|
in | Object | 会议相关信息 |
roomId | string | 会议ID,会议通话的唯一标识 |
status | string | 会议的实时状态, status 对应的 value 为 json 字符串, 您需要将其转换成 json 然后取出对应的值 |
pub | string | 判断会议行为:
|
actor | string | 加入会议的用户的数据 |
userData | string | 用户自定义数据。可用于传客户自定义数据,例如订单号。预约会议时在参数加入 userdata,例如 "params":{"video":"1","title":"test","userdata":"My UserData"} |
conferenceNumber | string | 会议编号 |
oid | string | 提供服务的对象名称。 |
tid | string | 事务ID,值唯一的整数。transaction 代表本次 Nofity 的一次交互。该 ID 值由发起 Request 的一方生成 |
# 响应
HTTP报文样例:
HTTP/1.1 202 Accepted
Cntent-Length: 29
{"tid":4174673023,"ret":true}
HTTP报文头:
报文头域 | 是否必选 | 值 |
---|---|---|
202 Accepted | 是 | |
Authorization | 否 | Basic [Base64(菊风分配的域用户名:密码)] |
Demain | 否 | HTTP Body的实际长度 |
Content-Length | 是 | application/json |
配置参数:
值 | 值的格式/类型 | 说明 |
---|---|---|
tid | int | 事务ID。您的HTTP服务器回复的响应中,该字段的值应与请求报文保持一致。 |
ret | boolean | true表示收到通知。 |
# 报文案例
# 创建会议
new
表示 创建会议;time
表示创建时间,单位是秒。
{
"in": {
"params": null,
"roomId": "-181601554958257",
"status": "{\"pub\":\"new\",\"roomId\":\"-181601554958257\",\"id\":\"-181601554958257\",\"time\":1523947486,\"config\":{\"capacity\":2047,\"sender\":16,\"media\":\"\"},\"room\":{\"title\":\"123456\",\"psswrd\":\"123456\",\"screen\":\"\",\"dat\":\"\"}}",
"userData": "",
"conferenceNumber": "10521028"
},
"cmd": "statusNotify.JSME.JSM",
"oid": "JSMUser",
"tid": 1031033531,
"params": null
}
# 加入会议
join
表示 加入会议;time
表示加入时间,单位是秒。
{
"in": {
"params": null,
"roomId": "-181601554958257",
"status": "{\"pub\":\"join\",\"actor\":{\"[username:cfl1@sample.cloud.justalk.com]\":{\"nick\":\"cfl1\",\"role\":15,\"state\":14,\"idx\":1}},\"mid\":\"-181601554958257\",\"sid\":\"-181601554958257\",\"roomId\":\"-181601554958257\",\"id\":\"-181601554958257\",\"time\":1523947486}",
"userData": "",
"conferenceNumber": "10521028"
},
"cmd": "statusNotify.JSME.JSM",
"oid": "JSMUser",
"tid": 1031033532,
"params": null
}
# 离开会议(带流量和视频时间)
actorleave
表示离开会议;time
表示离开会议的时间,单位是秒;nf.snd.sum
表示发送流量,单位KB;nf.rcv.sum
表示接收流量,单位KB;90ptime
,180ptime
,360ptime
,720ptime
,1080ptime
分别表示90p,180p,360p,720p,1080p 各用了多少时长,单位是秒。
{
"in": {
"params": null,
"roomId": "-181601554958257",
"status": "{\"pub\":\"actorleave\",\"actorleave\":{\"actorid\":\"[username:cfl1@sample.cloud.justalk.com]\",\"actorrole\":15,\"actorstate\":14,\"appid\":1,\"lasttime\":100,\"channeltype\":1,\"mediatype\":{\"est.br.snd.avg\":1200,\"est.br.rcv.avg\":1200,\"nf.snd.sum\":74,\"nf.rcv.sum\":21,\"br.snd.avg\":5,\"br.rcv.avg\":1,\"loss.snd.avg\":0,\"loss.rcv.avg\":0,\"rtt.avg\":51,\"jitter.snd.avg\":0,\"jitter.rcv.avg\":0,\"idletime\":98,\"audiotime\":0,\"screensharetime\":0,\"90ptime\":0,\"180ptime\":0,\"360ptime\":0,\"720ptime\":0,\"1080ptime\":0}},\"mid\":\"-181601554958257\",\"sid\":\"-181601554958257\",\"roomId\":\"-181601554958257\",\"id\":\"-181601554958257\",\"time\":1523947587}",
"userData": "",
"conferenceNumber": "10521028"
},
"cmd": "statusNotify.JSME.JSM",
"oid": "JSMUser",
"tid": 1031033676,
"params": null
}
# 离开会议(不带流量和视频时间)
leave
表示离开会议;time
表示离开会议的时间,单位是秒。
{
"in": {
"params": null,
"roomId": "-181601554958257",
"status": "{\"pub\":\"leave\",\"actor\":{\"[username:cfl1@sample.cloud.justalk.com]\":\"leave\"},\"mid\":\"-181601554958257\",\"sid\":\"-181601554958257\",\"roomId\":\"-181601554958257\",\"id\":\"-181601554958257\",\"time\":1523947587}",
"userData": "",
"conferenceNumber": "10521028"
},
"cmd": "statusNotify.JSME.JSM",
"oid": "JSMUser",
"tid": 1031033677,
"params": null
}
# 销毁会议
delete
表示销毁会议。nf.snd.sum
表示整个会议发送流量,单位KB。nf.rcv.sum
表示整个会议接收流量,单位KB。audiotime
表示会议所有成员累计使用的音频时间,单位秒。90ptime
,180ptime
,360ptime
,720ptime
,1080ptime
分别表示90p,180p,360p,720p,1080p 各用了多少时长,单位是秒。
{
"in": {
"params": null,
"roomId": "-181601554958257",
"status": "{\"pub\":\"delete\",\"net\":{\"mediatypes\":\" Au\",\"nf.snd.sum\":99,\"nf.rcv.sum\":89,\"br.snd.avg\":0,\"br.rcv.avg\":0,\"est.br.snd.avg\":2400,\"est.br.rcv.avg\":2400,\"loss.snd.avg\":0,\"loss.rcv.avg\":0,\"rtt.avg\":78,\"jitter.snd.avg\":0,\"jitter.rcv.avg\":0,\"idletime\":113,\"audiotime\":43,\"screensharetime\":0,\"90ptime\":0,\"180ptime\":0,\"360ptime\":0,\"720ptime\":0,\"1080ptime\":0},\"channeltypes\":\"N\",\"monline\":2,\"md\":120,\"td\":162,\"mid\":\"-181601554958257\",\"sid\":\"-181601554958257\",\"roomId\":\"-181601554958257\",\"id\":\"-181601554958257\",\"time\":1523947595}",
"userData": "",
"conferenceNumber": "10521028"
},
"cmd": "statusNotify.JSME.JSM",
"oid": "JSMUser",
"tid": 1031033704,
"params": null
}