diff --git a/README.md b/README.md index 5672169..db686bc 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,10 @@ * `Media`终端只支持录像之后自动生成预览图片,不支持视频直接拍照。 * `Media`终端只支持视频房间(会议模式)录像,视频会话(监控模式)不支持。 +## 信令 + +[现有信令](./docs/Protocol.md) + ## Docker ``` diff --git a/docs/Protocol.md b/docs/Protocol.md new file mode 100644 index 0000000..f456d2f --- /dev/null +++ b/docs/Protocol.md @@ -0,0 +1,1122 @@ + +## 信令格式 + +``` +{ + "code" : "状态编码", + "message": "状态描述", + "header": { + "v" : "消息版本", + "id" : "消息标识", + "signal": "信令标识" + }, + "body": { + ... + } +} +``` + +### 符号解释 + +``` +-[消息类型]> 异步请求 | 单播 +=[消息类型]> 同步请求 +-[消息类型]) 全员广播:对所有的终端广播信令(排除自己) ++[消息类型]) 全员广播:对所有的终端广播信令(包含自己) +...:其他自定义的透传内容 +``` + +> 消息类型可以省略表示和前面一致 + +### 终端告警信令(client::alarm) + +``` +# 消息主体 +{ + "message" : "告警描述", + "datetime": "告警时间(yyyyMMddHHmmss)" +} +# 数据流向 +终端->信令服务 +``` + +### 终端广播信令(client::broadcast) + +没有指定终端类型时广播所有类型终端 + +``` +# 消息主体 +{ + "clientType": "终端类型(可选)" + ... +} +# 数据流向 +终端->信令服务-)终端 +``` + +### 关闭终端信令(client::close) + +同时释放所有资源,所以如果终端意外掉线重连,需要终端实现音视频重连逻辑。 + +``` +# 消息主体 +{} +# 数据流向 +终端->信令服务->终端 +终端->信令服务-[终端下线])终端 +``` + +### 终端配置信令(client::config) + +``` +# 消息主体 +{ + "media": "媒体配置(可选)", + "webrtc": "WebRTC配置(可选)", + "datetime": "日期时间(yyyyMMddHHmmss)" +} +# 数据流向 +终端=[终端注册]>信令服务->终端 +``` + +### 终端心跳信令(client::heartbeat) + +``` +# 消息主体 +{ + "latitude": 纬度, + "longitude": 经度, + "humidity": 湿度, + "temperature": 温度, + "signal": 信号强度(0~100), + "battery": 电池电量(0~100), + "alarming": 是否发生告警(true|false), + "charging": 是否正在充电(true|false), + "recording": 是否正在录像(true|false), + "lastHeartbeat": "最后心跳时间", + "status": {更多状态}, + "config": {更多配置} +} +# 数据流向 +终端->信令服务->终端 +``` + +### 终端列表信令(client::list) + +没有选择终端类型时返回所有类型终端状态列表 + +``` +# 消息主体 +{ + "clientType": "终端类型(可选)" +} +[ + { + "ip": "终端IP", + "name": "终端名称", + "clientId": "终端ID", + "clientType": "终端类型", + "latitude": 纬度, + "longitude": 经度, + "humidity": 湿度, + "temperature": 温度, + "signal": 信号强度(0~100), + "battery": 电池电量(0~100), + "alarming": 是否发生告警(true|false), + "charging": 是否正在充电(true|false), + "recording": 是否正在录像(true|false), + "lastHeartbeat": "最后心跳时间", + "status": {更多状态}, + "config": {更多配置} + }, + ... +] +# 数据流向 +终端->信令服务->终端 +``` + +### 终端下线信令(client::offline) + +``` +# 消息主体 +{ + "clientId": "下线终端ID" +} +# 数据流向 +终端-[终端关闭]>信令服务-)终端 +``` + +### 终端上线信令(client::online) + +``` +# 消息主体 +{ + "ip": "终端IP", + "name": "终端名称", + "clientId": "终端ID", + "clientType": "终端类型", + "latitude": 纬度, + "longitude": 经度, + "humidity": 湿度, + "temperature": 温度, + "signal": 信号强度(0~100), + "battery": 电池电量(0~100), + "alarming": 是否发生告警(true|false), + "charging": 是否正在充电(true|false), + "recording": 是否正在录像(true|false), + "lastHeartbeat": "最后心跳时间", + "status": {更多状态}, + "config": {更多配置} +} +# 数据流向 +终端=[终端注册]>信令服务-)终端 +``` + +### 重启终端信令(client::reboot) + +``` +# 消息主体 +{} +# 数据流向 +信令服务->终端 +``` + +### 终端注册信令(client::register) + +``` +# 消息主体 +{ + "username": "信令用户", + "password": "信令密码", + "name": "终端名称", + "clientId": "终端ID", + "clientType": "终端类型", + "latitude": 纬度, + "longitude": 经度, + "humidity": 湿度, + "temperature": 温度, + "signal": 信号强度(0~100), + "battery": 电池电量(0~100), + "alarming": 是否发生告警(true|false), + "charging": 是否正在充电(true|false), + "recording": 是否正在录像(true|false), + "lastHeartbeat": "最后心跳时间", + "status": {更多状态}, + "config": {更多配置} +} +# 数据流向 +终端=>信令服务->终端 +终端=>信令服务-[终端配置]>终端 +终端=>信令服务-[终端上线])终端 +``` + +### 关闭终端信令(client::shutdown) + +``` +# 消息主体 +{} +# 数据流向 +信令服务->终端 +``` + +### 终端状态信令(client::status) + +没有指定终端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), + "recording": 是否正在录像(true|false), + "lastHeartbeat": "最后心跳时间", + "status": {更多状态}, + "config": {更多配置} +} +# 数据流向 +终端->信令服务->终端 +``` + +### 终端单播信令(client::unicast) + +``` +# 消息主体 +{ + "to": "接收终端ID", + ... +} +{ + ... +} +# 数据流向 +终端->信令服务->终端 +``` + +### 终端唤醒信令(client::wakeup) + +``` +# 消息主体 +{} +# 数据流向 +信令服务->终端 +``` + +### 响铃信令(control::bell) + +``` +# 消息主体 +{ + "to": "目标终端ID", + "enabled": 是否响铃(true|false) +} +# 数据流向 +信令服务->终端 +终端->信令服务->终端 +``` + +### 终端录像信令(control::client::record) + +``` +# 消息主体 +{ + "to": "目标终端ID", + "enabled": 是否录像(true|false) +} +{ + "enabled": 是否录像(true|false), + "filepath": "视频文件路径" +} +# 数据流向 +信令服务->目标终端->信令服务 +终端=>信令服务->目标终端->信令服务->终端 +``` + +### 配置音频信令(control::config::audio) + +如果没有指定参数使用默认参数配置 + +``` +# 消息主体 +{ + "to": "目标终端ID", + ...MediaAudioProperties +} +# 数据流向 +信令服务->终端 +终端=>信令服务->终端 +``` + +### 配置视频信令(control::config::video) + +如果没有指定参数使用默认参数配置 + +``` +# 消息主体 +{ + "to": "目标终端ID", + ...MediaVideoProperties +} +# 数据流向 +信令服务->终端 +终端=>信令服务->终端 +``` + +### 拍照信令(control::photograph) + +``` +# 消息主体 +{ + "to": "目标终端ID" +} +{ + "filepath": "图片文件路径" +} +# 数据流向 +信令服务->目标终端->信令服务 +终端=>信令服务->目标终端->信令服务->终端 +``` + +### 服务端录像信令(control::server::record) + +``` +# 消息主体 +{ + "to" : "目标终端ID", + "roomId" : "房间ID", + "enabled": 是否录像(true|false) +} +{ + "roomId" : "房间ID", + "enabled" : 是否录像(true|false), + "filepath": "视频文件路径", + "clientId": "录像终端ID" +} +# 数据流向 +终端=>信令服务->终端 +``` + +### 终端音量信令(media::audio::volume) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "volumes" : [ + { + "volume": 音量, + "clientId": "终端ID" + }, + ... + ] +} +# 数据流向 +媒体服务->信令服务->终端 +``` + +### 消费媒体信令(media::consume) + +消费媒体:主动消费、终端生产媒体、终端创建WebRTC消费通道 +终端生产媒体当前房间所有终端根据订阅类型自动消费媒体 +终端创建WebRTC消费通道根据订阅类型自动消费当前房间已有媒体 + +``` +# 消息主体 +{ + "roomId": "房间ID" + "producerId": "生产者ID" +} +# 数据流向 +终端-[生产媒体]>信令服务-[其他终端消费])信令服务 +终端-[创建WebRTC消费通道]>信令服务-[消费其他终端])信令服务 +终端->信令服务->媒体服务=>信令服务->终端->信令服务->媒体服务 +``` + +### 关闭消费者信令(media::consumer::close) + +``` +# 消息主体 +{ + "roomId": "房间ID" + "consumerId": "消费者ID" +} +# 数据流向 +媒体服务->信令服务-)终端 +终端->信令服务->媒体服务->信令服务+)终端 +``` + +### 暂停消费者信令(media::consumer::pause) + +``` +# 消息主体 +{ + "roomId": "房间ID" + "consumerId": "消费者ID" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务->终端 +``` + +### 请求关键帧信令(media::consumer::request::key::frame) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "consumerId": "消费者ID" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务->终端 +``` + +### 恢复消费者信令(media::consumer::resume) + +``` +# 消息主体 +{ + "roomId": "房间ID" + "consumerId": "消费者ID" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务->终端 +``` + +### 媒体消费者评分信令(media::consumer::score) + +``` +# 消息主体 +{ + "score": "消费者RTP流得分表示传输质量:0~10", + "producerScore": "生产者RTP流得分表示传输质量:0~10", + "producerScores": [所有生产者RTP流得分] +} +# 数据流向 +媒体服务->信令服务->终端 +``` + +### 修改最佳空间层和时间层信令(media::consumer::set::preferred::layers) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "consumerId": "消费者ID", + "spatialLayer": 最佳空间层, + "temporalLayer": 最佳时间层 +} +# 数据流向 +终端->信令服务->媒体服务->信令服务->终端 +``` + +### 设置消费者优先级信令(media::consumer::set::priority) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "consumerId": "消费者ID", + "priority": 优先级(1~255) +} +# 数据流向 +终端->信令服务->终端 +``` + +### 查询消费者状态信令(media::consumer::status) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "consumerId": "消费者ID" +} +# 数据流向 +终端=>信令服务->媒体服务->信令服务->终端 +``` + +### 消费数据信令(media::data::consume) + +数据通道消费者不会自动创建,需要用户自己订阅生产者。 + +``` +# 消息主体 +{ + "roomId": "房间ID" + "producerId": "生产者ID", +} +# 数据流向 +终端=>信令服务->媒体服务->信令服务->媒体服务 +``` + +### 关闭数据消费者信令(media::data::consumer::close) + +``` +# 消息主体 +{ + "roomId": "房间ID" + "consumerId": "数据消费者ID" +} +# 数据流向 +媒体服务->信令服务-)终端 +终端->信令服务->媒体服务->信令服务+)终端 +``` + +### 查询数据消费者状态信令(media::data::consumer::status) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "consumerId": "数据消费者ID" +} +# 数据流向 +终端=>信令服务->媒体服务->信令服务->终端 +``` + +### 生产数据信令(media::data::produce) + +``` +# 消息主体 +{ + "roomId": "房间标识", + "transportId": "通道标识" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务->终端 +``` + +### 关闭数据生产者信令(media::data::producer::close) + +``` +# 消息主体 +{ + "roomId": "房间ID" + "consumerId": "数据生产者ID" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务+)终端 +``` + +### 查询数据生产者状态信令(media::data::producer::status) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "producerId": "数据生产者ID" +} +# 数据流向 +终端=>信令服务->媒体服务->信令服务->终端 +``` + +### 重启ICE信令(media::ice::restart) + +``` +# 消息主体 +{ + "roomId": "房间标识", + "transportId": "通道标识" +} +{ + "roomId": "房间标识", + "transportId": "通道标识", + "iceParameters": "iceParameters" +} +# 数据流向 +终端=>信令服务->媒体服务->信令服务->终端 +``` + +### 生产媒体信令(media::produce) + +``` +# 消息主体 +{ + "kind": "媒体类型", + "roomId": "房间标识", + "transportId": "通道标识", + "rtpParameters": "rtpParameters" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务->终端 +``` + +### 关闭生产者信令(media::producer::close) + +``` +# 消息主体 +{ + "roomId": "房间ID" + "consumerId": "生产者ID" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务+)终端 +``` + +### 暂停生产者信令(media::producer::pause) + +``` +# 消息主体 +{ + "roomId": "房间ID" + "producerId": "消费者ID" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务->终端 +``` + +### 恢复生产者信令(media::producer::resume) + +``` +# 消息主体 +{ + "roomId": "房间ID" + "producerId": "消费者ID" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务->终端 +``` + +### 媒体生产者评分信令(media::producer::score) + +``` +# 消息主体 +{} +# 数据流向 +媒体服务->信令服务->终端 +``` + +### 查询生产者状态信令(media::producer::status) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "producerId": "生产者ID" +} +# 数据流向 +终端=>信令服务->媒体服务->信令服务->终端 +``` + +### 路由RTP协商信令(media::router::rtp::capabilities) + +``` +# 消息主体 +{ + "roomId": "房间标识" +} +{ + "codec": "编码解码", + "headerExtensions": "扩展" +} +# 数据流向 +终端=>信令服务->媒体服务->信令服务->终端 +``` + +### 设置路由类型信令(media::set::router::type) + +``` +# 消息主体 +{ + "roomId": "房间ID" + "routerType": "路由类型" +} +# 数据流向 +终端->信令服务->终端 +``` + +### 关闭通道信令(media::transport::close) + +``` +# 消息主体 +{ + "roomId": "房间ID" + "transportId": "通道ID" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务+)终端 +``` + +### 创建RTP输入通道信令(media::transport::plain) + +``` +# 消息主体 +{ + "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": "密钥" + } +} +# 数据流向 +终端->信令服务->终端 +``` + +### 查询通道状态信令(media::transport::status) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "transportId": "通道ID" +} +# 数据流向 +终端=>信令服务->媒体服务->信令服务->终端 +``` + +### 连接WebRTC通道信令(media::transport::webrtc::connect) + +``` +# 消息主体 + +# 数据流向 +终端->信令服务->媒体服务->信令服务->终端 +``` + +### 创建WebRTC通道信令(media::transport::webrtc::create) + +``` +# 消息主体 +{ + "roomId": "房间标识" +} +{ + "roomId": "房间标识", + "transportId": "传输通道标识", + "iceCandidates": "iceCandidates", + "iceParameters": "iceParameters", + "dtlsParameters": "dtlsParameters", + "sctpParameters": "sctpParameters" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务->终端 +``` + +### 视频方向变化信令(media::video::orientation::change) + +``` +# 消息主体 + +# 数据流向 +媒体服务->信令服务->终端 +``` + +### 平台异常信令(platform::error) + +``` +# 消息主体 +{} +# 数据流向 +终端->信令服务->终端 +``` + +### 重启平台信令(platform::reboot) + +``` +# 消息主体 +{} +# 数据流向 +信令服务+)终端 +终端->信令服务+)终端 +``` + +### 执行命令信令(platform::script) + +``` +# 消息主体 +{ + "script": "命令" +} +{ + "result": "结果" +} +# 数据流向 +终端->信令服务->终端 +``` + +### 关闭平台信令(platform::shutdown) + +``` +# 消息主体 +{} +# 数据流向 +信令服务+)终端 +终端->信令服务+)终端 +``` + +### 房间广播信令(room::broadcast) + +``` +# 消息主体 +{ + "roomId": "房间ID", + ... +} +# 数据流向 +终端->信令服务-)终端 +``` + +### 房间终端列表信令(room::client::list) + +``` +# 消息主体 +{ + "roomId": "房间ID" +} +[ + { + "ip": "终端IP", + "name": "终端名称", + "clientId": "终端ID", + "clientType": "终端类型", + "latitude": 纬度, + "longitude": 经度, + "humidity": 湿度, + "temperature": 温度, + "signal": 信号强度(0~100), + "battery": 电池电量(0~100), + "alarming": 是否发生告警(true|false), + "charging": 是否正在充电(true|false), + "recording": 是否正在录像(true|false), + "lastHeartbeat": "最后心跳时间", + "status": {更多状态}, + "config": {更多配置} + }, + ... +] +# 数据流向 +终端=>信令服务->终端 +``` + +### 房间终端ID信令(room::client::list::id) + +终端所有ID集合:消费者、生产者等等 + +``` +# 消息主体 +{ + "roomId": "房间ID", + "clientId": "终端ID(可选)" +} +{ + ... +} +# 数据流向 +终端=>信令服务->终端 +``` + +### 关闭房间信令(room::close) + +``` +# 消息主体 +{ + "roomId": "房间ID" +} +# 数据流向 +终端->信令服务+)终端 +``` + +### 创建房间信令(room::create) + +``` +# 消息主体 +{ + "name": "房间名称", + "passowrd": "房间密码(选填)", + "mediaClientId": "媒体服务ID" +} +{ + "name": "房间名称", + "clientSize": "终端数量", + "mediaClientId": "媒体服务ID" +} +# 数据流向 +终端->信令服务->媒体服务->信令服务+)终端 +``` + +### 进入房间信令(room::enter) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "password": "房间密码(选填)" +} +{ + "roomId": "房间标识", + "clientId": "终端标识" +} +# 数据流向 +终端->信令服务-)终端 +``` + +### 踢出房间信令(room::expel) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "clientId": "终端ID" +} +# 数据流向 +终端->信令服务->终端 +``` + +### 邀请终端信令(room::invite) + +``` +# 消息主体 +{ + "roomId": "房间ID", + "clientId": "终端ID", + "password": "密码(选填)" +} +# 数据流向 +终端->信令服务->终端 +``` + +### 离开房间信令(room::leave) + +``` +# 消息主体 +{ + "clientId": "离开终端ID" +} +# 数据流向 +终端->信令服务-)终端 +终端-[关闭终端]>信令服务-)终端 +``` + +### 房间列表信令(room::list) + +``` +# 消息主体 +[ + { + "name": "房间名称", + "passowrd": "房间密码", + "clientSize": "终端数量", + "mediaClientId": "媒体服务标识" + }, + ... +] +# 数据流向 +终端->信令服务->终端 +``` + +### 房间状态信令(room::status) + +``` +# 消息主体 +{ + "name" : "房间名称", + "passowrd" : "房间密码", + "clientSize" : "终端数量", + "mediaClientId": "媒体服务标识" +} +# 数据流向 +终端=>信令服务->终端 +``` + +### 发起会话信令(session::call) + +``` +# 消息主体 +{ + "clientId": "接收者ID", + "audio" : 是否需要声音(true|false), + "video" : 是否需要视频(true|false) +} +# 数据流向 +终端->信令服务->终端 +终端=>信令服务->终端 +``` + +### 关闭媒体信令(session::close) + +``` +# 消息主体 +{ +} +# 数据流向 +终端->信令服务+)终端 +``` + +### 媒体交换信令(session::exchange) + +媒体交换协商:offer/answer/candidate + 安卓需要注意: + 1. 交换类型大小写 + 2. candidate内容默认名称sdp + +``` +# 消息主体 +{ + "sdp": "sdp" + "type": "offer", + "sessionId": "会话ID" +} +{ + "sdp": "sdp" + "type": "answer", + "sessionId": "会话ID" +} +{ + "type": "candidate", + "sessionId": "会话ID", + "candidate": { + "sdpMid": "sdpMid", + "candidate": "candidate信息", + "sdpMLineIndex":sdpMLineIndex + } +} +# 数据流向 +终端->信令服务->终端 +``` + +### 暂停媒体信令(session::pause) + +``` +# 消息主体 +{ + "sessionId": "会话ID", + "type" : "媒体类型(audio|voice)" +} +# 数据流向 +终端->信令服务->终端 +``` + +### 恢复媒体信令(session::resume) + +``` +# 消息主体 +{ + "sessionId": "会话ID", + "type" : "媒体类型(audio|voice)" +} +# 数据流向 +终端->信令服务->终端 +``` + +### 系统信息信令(system::info) + +``` +# 消息主体 +{ + "diskspace": [ + { + "path": "存储路径", + "free": 存储空闲, + "total": 存储总量 + }, + ... + ], + "maxMemory": 最大能用内存, + "freeMemory": 空闲内存, + "totalMemory": 已用内存, + "osArch": "系统架构", + "osName": "系统名称", + "osVersion": "系统版本", + "javaVmName": "虚拟机名称", + "javaVersion": "虚拟机版本", + "cpuProcessors": CPU核心数量 +} +# 数据流向 +终端->信令服务->终端 +``` + +### 重启系统信令(system::reboot) + +``` +# 消息主体 +{} +# 数据流向 +信令服务+)终端 +终端->信令服务+)终端 +``` + +### 关闭系统信令(system::shutdown) + +``` +# 消息主体 +{} +# 数据流向 +信令服务+)终端 +终端->信令服务+)终端 +``` +