{
"code" : "状态编码",
"message": "状态描述",
"header": {
"v" : "消息版本",
"id" : "消息标识",
"signal": "信令标识"
},
"body": {
...
}
}
-[消息类型]> 异步请求 | 单播消息
=[消息类型]> 同步请求:到达目标终端后沿原路返回
-[消息类型]) 全员广播:对所有的终端广播信令(排除自己)
+[消息类型]) 全员广播:对所有的终端广播信令(包含自己)
...:其他自定义的透传内容
消息类型可以省略表示和前面一致
# 消息主体
{
"message" : "告警描述",
"datetime": "告警时间(yyyyMMddHHmmss)"
}
# 数据流向
终端->信令服务
没有指定终端类型时广播所有类型终端
# 消息主体
{
"clientType": "终端类型(可选)"
...
}
# 数据流向
终端->信令服务-)终端
信令连接断开以后执行,同时释放所有资源。 如果终端意外掉线,需要自己实现重连逻辑。
# 消息主体
{}
# 数据流向
终端=>信令服务
终端=[关闭终端]>信令服务-[终端下线])终端
终端-[连接断开]>信令服务-[终端下线])终端
终端应该在收到配置之后进行媒体操作
# 消息主体
{
"media" : "媒体配置(可选)",
"webrtc" : "WebRTC配置(可选)",
"datetime": "日期时间(yyyyMMddHHmmss)"
}
# 数据流向
终端=[终端注册]>信令服务-[终端配置]>终端
# 消息主体
{
"latitude" : 纬度,
"longitude" : 经度,
"humidity" : 湿度,
"temperature" : 温度,
"signal" : 信号强度(0~100),
"battery" : 电池电量(0~100),
"alarming" : 是否发生告警(true|false),
"charging" : 是否正在充电(true|false),
"clientRecording": 是否正在录像(true|false),
"serverRecording": 是否正在录像(true|false),
"lastHeartbeat" : "最后心跳时间",
"status" : {更多状态},
"config" : {更多配置}
}
# 数据流向
终端->信令服务->终端
没有选择终端类型时返回所有类型终端状态列表
# 消息主体
{
"clientType": "终端类型(可选)"
}
[
{
"ip" : "终端IP",
"name" : "终端名称",
"clientId" : "终端ID",
"clientType" : "终端类型",
"latitude" : 纬度,
"longitude" : 经度,
"humidity" : 湿度,
"temperature" : 温度,
"signal" : 信号强度(0~100),
"battery" : 电池电量(0~100),
"alarming" : 是否发生告警(true|false),
"charging" : 是否正在充电(true|false),
"clientRecording": 是否正在录像(true|false),
"serverRecording": 是否正在录像(true|false),
"lastHeartbeat" : "最后心跳时间",
"status" : {更多状态},
"config" : {更多配置}
},
...
]
# 数据流向
终端=>信令服务
# 消息主体
{
"clientId": "下线终端ID"
}
# 数据流向
终端=[关闭终端]>信令服务-[终端下线])终端
终端-[连接断开]>信令服务-[终端下线])终端
# 消息主体
{
"ip" : "终端IP",
"name" : "终端名称",
"clientId" : "终端ID",
"clientType" : "终端类型",
"latitude" : 纬度,
"longitude" : 经度,
"humidity" : 湿度,
"temperature" : 温度,
"signal" : 信号强度(0~100),
"battery" : 电池电量(0~100),
"alarming" : 是否发生告警(true|false),
"charging" : 是否正在充电(true|false),
"clientRecording": 是否正在录像(true|false),
"serverRecording": 是否正在录像(true|false),
"lastHeartbeat" : "最后心跳时间",
"status" : {更多状态},
"config" : {更多配置}
}
# 数据流向
终端=[终端注册]>信令服务-)终端
# 消息主体
{}
# 数据流向
信令服务->终端
收到注册响应之后应该设置终端的终端索引
# 消息主体
{
"username" : "信令用户",
"password" : "信令密码",
"name" : "终端名称",
"clientId" : "终端ID",
"clientType" : "终端类型",
"latitude" : 纬度,
"longitude" : 经度,
"humidity" : 湿度,
"temperature" : 温度,
"signal" : 信号强度(0~100),
"battery" : 电池电量(0~100),
"alarming" : 是否发生告警(true|false),
"charging" : 是否正在充电(true|false),
"clientRecording": 是否正在录像(true|false),
"serverRecording": 是否正在录像(true|false),
"lastHeartbeat" : "最后心跳时间",
"status" : {更多状态},
"config" : {更多配置}
}
# 数据流向
终端=>信令服务
终端=>信令服务-[终端配置]>终端
终端=>信令服务-[终端上线])终端
# 消息主体
{}
# 数据流向
信令服务->终端
没有指定终端ID返回请求终端状态
# 消息主体
{
"clientId": "终端ID(可选)"
}
{
"ip" : "终端IP",
"name" : "终端名称",
"clientId" : "终端ID",
"clientType" : "终端类型",
"latitude" : 纬度,
"longitude" : 经度,
"humidity" : 湿度,
"temperature" : 温度,
"signal" : 信号强度(0~100),
"battery" : 电池电量(0~100),
"alarming" : 是否发生告警(true|false),
"charging" : 是否正在充电(true|false),
"clientRecording": 是否正在录像(true|false),
"serverRecording": 是否正在录像(true|false),
"lastHeartbeat" : "最后心跳时间",
"status" : {更多状态},
"config" : {更多配置}
}
# 数据流向
终端=>信令服务
# 消息主体
{
"to": "接收终端ID",
...
}
{
...
}
# 数据流向
终端->信令服务->终端
# 消息主体
{
"to" : "目标终端ID",
"enabled": 是否响铃(true|false)
}
# 数据流向
信令服务=>终端
终端=>信令服务->终端
# 消息主体
{
"to" : "目标终端ID",
"enabled": 是否录像(true|false)
}
{
"enabled" : 是否录像(true|false),
"filepath": "视频文件路径"
}
# 数据流向
信令服务=>终端
终端=>信令服务->终端
如果没有指定参数使用默认参数配置
# 消息主体
{
"to": "目标终端ID",
...MediaAudioProperties
}
# 数据流向
信令服务=>终端
终端=>信令服务->终端
如果没有指定参数使用默认参数配置
# 消息主体
{
"to": "目标终端ID",
...MediaVideoProperties
}
# 数据流向
信令服务=>终端
终端=>信令服务->终端
# 消息主体
{
"to": "目标终端ID"
}
{
"filepath": "图片文件路径"
}
# 数据流向
信令服务=>终端
终端=>信令服务->终端
# 消息主体
{
"to" : "目标终端ID",
"roomId" : "房间ID",
"enabled": 是否录像(true|false)
}
{
"roomId" : "房间ID",
"enabled" : 是否录像(true|false),
"filepath": "视频文件路径",
"clientId": "录像终端ID"
}
# 数据流向
终端=>信令服务->终端
# 消息主体
{
"to": "目标终端ID"
}
# 数据流向
信令服务=>终端
终端=>信令服务->终端
# 消息主体
{
"roomId" : "房间ID",
"volumes": [
{
"volume" : 音量,
"clientId": "终端ID"
},
...
]
}
# 数据流向
媒体服务->信令服务-)终端
消费媒体:主动消费、终端生产媒体、终端创建WebRTC消费通道 终端生产媒体当前房间所有终端根据订阅类型自动消费媒体 终端创建WebRTC消费通道根据订阅类型自动消费当前房间已有媒体
# 消息主体
{
"roomId" : "房间ID",
"producerId": "生产者ID"
}
{
"roomId" : "房间ID",
"clientId" : "消费者ID",
"sourceId" : "生产者ID",
"streamId" : "媒体ID",
"producerId" : "生产者ID",
"consumerId" : "消费者ID",
"kind" : "消费者媒体类型",
"type" : "消费者类型",
"appData" : "APP数据",
"rtpParameters" : "RTP参数",
"producerPaused": "生产者是否暂停",
}
# 数据流向
终端->信令服务->媒体服务=>信令服务->终端
终端-[生产媒体]>信令服务-[消费媒体])信令服务=>信令服务->终端
终端-[创建WebRTC通道]>信令服务-[消费媒体])信令服务=>信令服务->终端
关闭通过回调实现所以不能同步响应
# 消息主体
{
"roomId" : "房间ID"
"consumerId": "消费者ID"
}
# 数据流向
媒体服务->信令服务->终端
信令服务->媒体服务->信令服务->终端
终端->信令服务->媒体服务->信令服务->终端
# 消息主体
{
"roomId" : "房间ID"
"consumerId" : "消费者ID",
"spatialLayer" : 最佳空间层,
"temporalLayer": 最佳时间层
}
# 数据流向
媒体服务->信令服务+)终端
# 消息主体
{
"roomId" : "房间ID"
"consumerId": "消费者ID"
}
# 数据流向
终端->信令服务->媒体服务->信令服务->终端
终端-[暂停生产者]>信令服务->媒体服务-[暂停消费者]>信令服务->终端
# 消息主体
{
"roomId" : "房间ID",
"consumerId": "消费者ID"
}
# 数据流向
终端->信令服务->媒体服务
# 消息主体
{
"roomId" : "房间ID"
"consumerId": "消费者ID"
}
# 数据流向
终端->信令服务->媒体服务->信令服务->终端
终端-[恢复生产者]>信令服务->媒体服务-[恢复消费者]>信令服务->终端
# 消息主体
{
"roomId" : "房间ID"
"consumerId": "消费者ID"
"score" : {
"score" : 消费者RTP流得分表示传输质量:0~10,
"producerScore" : 生产者RTP流得分表示传输质量:0~10,
"producerScores": [Simulcast生产者RTP流得分]
}
}
# 数据流向
媒体服务->信令服务+)终端
# 消息主体
{
"roomId" : "房间ID",
"consumerId" : "消费者ID",
"spatialLayer" : 最佳空间层,
"temporalLayer": 最佳时间层
}
# 数据流向
终端->信令服务->媒体服务
如果优先级不在范围内表示取消优先级设置
# 消息主体
{
"roomId" : "房间ID",
"consumerId": "消费者ID",
"priority" : 优先级(1~255)
}
# 数据流向
终端->信令服务->媒体服务
# 消息主体
{
"roomId" : "房间ID",
"consumerId": "消费者ID"
}
{
"roomId" : "房间ID",
"consumerId": "消费者ID",
"status" : [
...状态信息
]
}
# 数据流向
终端=>信令服务->媒体服务
数据通道消费者不会自动创建,需要用户自己订阅生产者。
# 消息主体
{
"roomId" : "房间ID"
"producerId": "生产者ID",
}
# 数据流向
终端->信令服务->媒体服务->信令服务->终端
关闭通过回调实现所以不能同步响应,以下场景出现:主动断开、离开房间、信令断开
# 消息主体
{
"roomId" : "房间ID"
"consumerId": "数据消费者ID"
}
# 数据流向
媒体服务->信令服务->终端
信令服务->媒体服务->信令服务->终端
终端->信令服务->媒体服务->信令服务->终端
# 消息主体
{
"roomId" : "房间ID",
"consumerId": "数据消费者ID"
}
{
"roomId" : "房间ID",
"consumerId": "数据消费者ID",
"status" : [
...状态信息
]
}
# 数据流向
终端=>信令服务->媒体服务
# 消息主体
{
"roomId" : "房间标识",
"transportId": "通道标识"
}
{
"roomId" : "房间ID",
"producerId": "生产者ID",
}
# 数据流向
终端=>信令服务->媒体服务
关闭通过回调实现所以不能同步响应,以下场景出现:主动断开、离开房间、信令断开
# 消息主体
{
"roomId" : "房间ID"
"consumerId": "数据生产者ID"
}
# 数据流向
媒体服务->信令服务->终端
信令服务->媒体服务->信令服务->终端
终端->信令服务->媒体服务->信令服务->终端
# 消息主体
{
"roomId" : "房间ID",
"producerId": "数据生产者ID"
}
{
"roomId" : "房间ID",
"producerId": "数据生产者ID",
"status" : [
...状态信息
]
}
# 数据流向
终端=>信令服务->媒体服务
# 消息主体
{
"roomId" : "房间标识",
"transportId": "通道标识"
}
{
"roomId" : "房间标识",
"transportId" : "通道标识",
"iceParameters": "iceParameters"
}
# 数据流向
终端=>信令服务->媒体服务
# 消息主体
{
"kind" : "媒体类型",
"roomId" : "房间ID",
"transportId" : "通道ID",
"rtpParameters": "rtpParameters"
}
{
"kind" : "媒体类型",
"roomId" : "房间ID",
"producerId": "生产者ID",
}
# 数据流向
终端=>信令服务->媒体服务
关闭通过回调实现所以不能同步响应,以下场景出现:主动断开、离开房间、信令断开
# 消息主体
{
"roomId" : "房间ID"
"consumerId": "生产者ID"
}
# 数据流向
媒体服务->信令服务->终端
信令服务->媒体服务->信令服务->终端
终端->信令服务->媒体服务->信令服务->终端
# 消息主体
{
"roomId" : "房间ID"
"producerId": "生产者ID"
}
# 数据流向
终端->信令服务->媒体服务->信令服务->终端
# 消息主体
{
"roomId" : "房间ID"
"producerId": "生产者ID"
}
# 数据流向
终端->信令服务->媒体服务->信令服务->终端
# 消息主体
{
"roomId" : "房间ID"
"consumerId": "消费者ID"
"score" : {
...生产者评分
}
}
# 数据流向
媒体服务->信令服务+)终端
# 消息主体
{
"roomId" : "房间ID",
"producerId": "生产者ID"
}
{
"roomId" : "房间ID",
"producerId": "生产者ID",
"status" : [
...状态信息
]
}
# 数据流向
终端=>信令服务->媒体服务
# 消息主体
{
"roomId": "房间标识"
}
"roomId" : "房间标识",
"rtpCapabilities": {
"codec" : "编码解码",
"headerExtensions": "扩展"
}
# 数据流向
终端=>信令服务->媒体服务
关闭通过回调实现所以不能同步响应,以下场景出现:主动断开、离开房间、信令断开
# 消息主体
{
"roomId" : "房间ID"
"transportId": "通道ID"
}
# 数据流向
媒体服务->信令服务->终端
信令服务->媒体服务->信令服务->终端
终端->信令服务->媒体服务->信令服务->终端
用来接入RTP协议终端
# 消息主体
{
"roomId" : "房间ID",
"rtcpMux" : RTP/RTCP端口复用(true|false),
"comedia" : 自动识别终端端口(true|false),
"enableSctp" : 是否开启SCTP(true|false),
"numSctpStreams" : SCTP数量,
"enableSrtp" : 是否开启SRTP(true|false),
"srtpCryptoSuite": {
"cryptoSuite": "算法(AEAD_AES_256_GCM|AEAD_AES_128_GCM|AES_CM_128_HMAC_SHA1_80|AES_CM_128_HMAC_SHA1_32)",
"keyBase64" : "密钥"
}
}
{
roomId : "房间ID",
transportId: "通道ID",
ip : "RTP监听IP",
port : "RTP媒体端口",
rtcpPort : "RTP媒体RTCP端口"
}
# 数据流向
终端=>信令服务->媒体服务
# 消息主体
{
"roomId" : "房间ID",
"transportId": "通道ID"
}
{
"roomId" : "房间ID",
"transportId": "通道ID",
"status" : [
...状态信息
]
}
# 数据流向
终端=>信令服务->媒体服务
# 消息主体
{
"roomId" : "房间ID",
"transportId" : "通道ID",
"dtlsParameters": "DTLS参数"
}
{
"roomId" : "房间ID",
"transportId" : "传输通道标识"
}
# 数据流向
终端=>信令服务->媒体服务
# 消息主体
{
"roomId" : "房间ID",
"forceTcp" : "强制使用TCP",
"producing" : "是否生产",
"consuming" : "是否消费",
"sctpCapabilities": "sctpCapabilities"
}
{
"roomId" : "房间ID",
"transportId" : "传输通道ID",
"iceCandidates" : "iceCandidates",
"iceParameters" : "iceParameters",
"dtlsParameters": "dtlsParameters",
"sctpParameters": "sctpParameters"
}
# 数据流向
终端=>信令服务->媒体服务
# 消息主体
{
"roomId" : "房间ID",
"producerId": "生产者ID",
"flip" : "是否翻转",
"camera" : "是否摄像头",
"rotation" : "旋转角度"
}
# 数据流向
媒体服务->信令服务->终端
# 消息主体
{}
# 数据流向
终端=>信令服务
信令服务->终端
# 消息主体
{}
# 数据流向
信令服务+)终端
终端=>信令服务
终端->信令服务+)终端
# 消息主体
{
"script": "命令"
}
{
"result": "结果"
}
# 数据流向
终端=>信令服务
# 消息主体
{}
# 数据流向
信令服务+)终端
终端=>信令服务
终端->信令服务+)终端
# 消息主体
{
"roomId": "房间ID",
...
}
# 数据流向
终端->信令服务-)终端
# 消息主体
{
"roomId": "房间ID"
}
[
{
"ip" : "终端IP",
"name" : "终端名称",
"clientId" : "终端ID",
"clientType" : "终端类型",
"latitude" : 纬度,
"longitude" : 经度,
"humidity" : 湿度,
"temperature" : 温度,
"signal" : 信号强度(0~100),
"battery" : 电池电量(0~100),
"alarming" : 是否发生告警(true|false),
"charging" : 是否正在充电(true|false),
"clientRecording": 是否正在录像(true|false),
"serverRecording": 是否正在录像(true|false),
"lastHeartbeat" : "最后心跳时间",
"status" : {更多状态},
"config" : {更多配置}
},
...
]
# 数据流向
终端=>信令服务
终端=[进入房间]>信令服务->终端
终端所有ID集合:消费者、生产者等等
# 消息主体
{
"roomId" : "房间ID",
"clientId": "终端ID(可选)"
}
{
"roomId" : "房间ID",
"clientId" : "终端ID",
"dataProducers" : "数据生产者ID集合",
"dataConsumers" : "数据消费者ID集合",
"audioProducers": "音频生产者ID集合",
"videoProducers": "视频生产者ID集合",
"audioConsumers": "音频消费者ID集合",
"videoConsumers": "视频消费者ID集合"
}
# 数据流向
终端=>信令服务
# 消息主体
{
"roomId": "房间ID"
}
# 数据流向
终端->信令服务->媒体服务->信令服务+)终端
# 消息主体
{
"name" : "房间名称",
"passowrd" : "房间密码(选填)",
"mediaClientId": "媒体服务ID"
}
{
"roomId" : "房间ID",
"name" : "房间名称",
"clientSize" : "终端数量",
"mediaClientId": "媒体服务ID"
}
# 数据流向
终端=>信令服务->媒体服务
终端->信令服务->媒体服务->信令服务-)终端
# 消息主体
{
"roomId" : "房间ID",
"password": "房间密码(选填)"
}
{
"roomId" : "房间标识",
"clientId": "终端标识"
}
# 数据流向
终端=>信令服务
终端->信令服务-)终端
终端收到信令以后调用离开房间信令离开房间,没有实现强制在服务端提出。
# 消息主体
{
"roomId" : "房间ID",
"clientId": "终端ID"
}
# 数据流向
终端->信令服务->终端
终端收到信令以后调用进入房间信令进入房间
# 消息主体
{
"roomId" : "房间ID",
"clientId": "终端ID",
"password": "密码(选填)"
}
# 数据流向
终端->信令服务->终端
# 消息主体
{
"roomId": "房间ID"
}
{
"roomId" : "房间ID"
"clientId": "离开终端ID"
}
# 数据流向
终端->信令服务-)终端
终端-[关闭终端]>信令服务-)终端
# 消息主体
{
"roomId": "房间ID"
}
[
{
"name" : "房间名称",
"passowrd" : "房间密码",
"clientSize" : "终端数量",
"mediaClientId": "媒体服务标识"
},
...
]
# 数据流向
终端=>信令服务
# 消息主体
{
"roomId": "房间ID"
}
{
"name" : "房间名称",
"passowrd" : "房间密码",
"clientSize" : "终端数量",
"mediaClientId": "媒体服务标识"
}
# 数据流向
终端=>信令服务
# 消息主体
{
"clientId": "目标ID",
"audio" : 是否需要声音(true|false),
"video" : 是否需要视频(true|false)
}
{
"name" : "终端名称",
"clientId" : "终端ID",
"sessionId": "会话ID"
}
# 数据流向
终端=>信令服务->终端
# 消息主体
{
"sessionId": "会话ID"
}
# 数据流向
终端->信令服务->终端
媒体交换协商:offer/answer/candidate 安卓需要注意: 1. 交换类型大小写 2. candidate内容默认名称sdp
# 消息主体
{
"sdp" : "sdp"
"type" : "offer|answer",
"sessionId": "会话ID"
}
{
"type" : "candidate",
"sessionId": "会话ID",
"candidate": {
"sdpMid" : "sdpMid",
"candidate" : "candidate",
"sdpMLineIndex": sdpMLineIndex
}
}
# 数据流向
终端->信令服务->终端
# 消息主体
{
"sessionId": "会话ID",
"type" : "媒体类型(audio|voice)"
}
# 数据流向
终端->信令服务->终端
# 消息主体
{
"sessionId": "会话ID",
"type" : "媒体类型(audio|voice)"
}
# 数据流向
终端->信令服务->终端
# 消息主体
{
"diskspace": [
{
"path" : "存储路径",
"free" : 存储空闲,
"total": 存储总量
},
...
],
"maxMemory" : 最大能用内存,
"freeMemory" : 空闲内存,
"totalMemory" : 已用内存,
"osArch" : "系统架构",
"osName" : "系统名称",
"osVersion" : "系统版本",
"javaVmName" : "虚拟机名称",
"javaVersion" : "虚拟机版本",
"cpuProcessors": CPU核心数量
}
# 数据流向
终端=>信令服务
重启系统
# 消息主体
{}
# 数据流向
信令服务+)终端
终端=>信令服务+)终端
关闭系统
# 消息主体
{}
# 数据流向
信令服务+)终端
终端=>信令服务+)终端