Files
taoyao/docs/Protocol.md
2023-07-26 08:18:58 +08:00

21 KiB
Raw Blame History

信令格式

{
    "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:🔑: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": 是否开启sctptrue|false,
    "numSctpStreams": sctp数量,
    "enableSrtp": 是否开启srtptrue|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

# 消息主体
{}
# 数据流向
信令服务+)终端
终端->信令服务+)终端