按键对讲与多人抢麦
约 1454 字大约 5 分钟
2026-10-16
本页包含扩展设计,不能作为当前整场景已实现的承诺。参见支持范围、场景索引和命令手册。图中S编号只用于本文定位,不放入实际JSON。
前置条件
humanCall会话已按S01/S06建立,callPolicy.floor=exclusive;设备或应用都能做参与端,主持人权限由平台验证。
松键、离线、租约到期及移出成员都释放发言权;最后一个有效上行帧之后的旧租约媒体不转发。leaseId不进入RTP/UDP包,由会话腿和媒体授权绑定。fullDuplex AI模式与PTT抢麦无关。
D/D2是不同设备参与端,A是应用端,P是平台和媒体节点。各端分别使用鉴权Topic/登录态,不能冒用另一端身份。基础会话与媒体协商见S01/S06,复用时保留本场景sessionId并独立分配密钥和token。
完整时序
报文索引
编号按图阅读;编号保留历史引用,不要求数值连续。字段定义以命令链接为准。
| 编号 | 发送→接收 | Topic/接口 | 方法及契约 | 应答/等待 | 状态或作用 |
|---|---|---|---|---|---|
| S12-M01 | D→P | SIG↑ | floorControl | floorState;10秒受理,媒体协商15秒 | |
| S12-M02 | P→D | SIG↓ | floorState | 应答/状态事件;不等待ACK | |
| S12-M03 | D2→P | SIG↑ | floorControl | floorState;10秒受理,媒体协商15秒 | |
| S12-M04 | P→D2 | SIG↓ | floorState | 应答/状态事件;不等待ACK | |
| S12-M05 | D→P | SIG↑ | floorControl | floorState;10秒受理,媒体协商15秒 | |
| S12-M06 | P→D | SIG↓ | floorState | 应答/状态事件;不等待ACK | |
| S12-M07 | D→P | SIG↑ | floorControl | floorState;10秒受理,媒体协商15秒 | |
| S12-M08 | P→D | SIG↓ | floorState | 应答/状态事件;不等待ACK | |
| S12-M09 | P→D | SIG↓ | floorState | 应答/状态事件;不等待ACK | |
| S12-M10 | D→P | SIG↑ | sessionEnd | 对应应答见命令;10秒受理,媒体协商15秒 | |
| S12-M11 | P→D | SIG↓ | sessionEnded | 应答/状态事件;不等待ACK |
逐条JSON
S12-M01 · floorControl
{
"msgToken": "s12-1",
"method": "floorControl",
"sessionId": "s12-session",
"params": {
"operation": "acquire",
"expectedRevision": 0,
"floorId": "room-a",
"leaseMs": 5000
}
}S12-M02 · floorState
{
"msgToken": "s12-1",
"method": "floorState",
"sessionId": "s12-session",
"data": {
"state": "granted",
"revision": 1,
"floorId": "room-a",
"leaseId": "lease-a",
"holderId": "member-a",
"expiresAt": 1900000000000
},
"code": 200
}S12-M03 · floorControl
{
"msgToken": "s12-2",
"method": "floorControl",
"sessionId": "s12-session",
"params": {
"operation": "acquire",
"expectedRevision": 1,
"floorId": "room-a",
"leaseMs": 5000
}
}S12-M04 · floorState
{
"msgToken": "s12-2",
"method": "floorState",
"sessionId": "s12-session",
"data": {
"reason": "floorBusy"
},
"code": 409
}S12-M05 · floorControl
{
"msgToken": "s12-3",
"method": "floorControl",
"sessionId": "s12-session",
"params": {
"operation": "renew",
"expectedRevision": 1,
"floorId": "room-a",
"leaseId": "lease-a",
"leaseMs": 5000
}
}S12-M06 · floorState
{
"msgToken": "s12-3",
"method": "floorState",
"sessionId": "s12-session",
"data": {
"state": "granted",
"revision": 2,
"floorId": "room-a",
"leaseId": "lease-a",
"holderId": "member-a",
"expiresAt": 1900000005000
},
"code": 200
}S12-M07 · floorControl
{
"msgToken": "s12-4",
"method": "floorControl",
"sessionId": "s12-session",
"params": {
"operation": "release",
"expectedRevision": 2,
"floorId": "room-a",
"leaseId": "lease-a"
}
}S12-M08 · floorState
{
"msgToken": "s12-4",
"method": "floorState",
"sessionId": "s12-session",
"data": {
"state": "released",
"revision": 3,
"floorId": "room-a"
},
"code": 200
}S12-M09 · floorState
{
"msgToken": "s12-5",
"method": "floorState",
"sessionId": "s12-session",
"data": {
"state": "expired",
"revision": 3,
"floorId": "room-a",
"reason": "leaseExpired"
},
"eventSeq": 1
}S12-M10 · sessionEnd
{
"msgToken": "s12-6",
"method": "sessionEnd",
"sessionId": "s12-session",
"params": {
"reason": "userHangup"
}
}S12-M11 · sessionEnded
{
"msgToken": "s12-6",
"method": "sessionEnded",
"sessionId": "s12-session",
"data": {
"state": "ended",
"reason": "userHangup"
},
"code": 200
}媒体与本地动作
| 编号 | 路径 | 格式与约束 |
|---|---|---|
| S12-R01 | D→P | 授权WebRTC Opus上行;播放别人的音轨不授予上行权 |
| S12-R02 | D→D | 设备本地计时停采集;云端租约同时撤销转发 |
异常、状态与资源释放
路由与信封见公共约定;阶段性状态不代表最终完成。操作终态时限见命令手册;编号、超时等元信息不发送。
能力不足422、无权限403、资源/修订号冲突409、超时504按S11处理,不静默开启设备能力。同token只重放原结果;事件按eventSeq去重,旧会话/端代次不可恢复。验证本页正常路径、alt分支及支持范围断言。文档通过不代表代码或硬件已实现。
验证入口
更新日志
2026/10/16 16:04
查看所有更新日志
fe3a7-docs(AI与音视频): 按场景整理完整接入流程与命令契约于
