应用与内部接口命令
约 11643 字大约 39 分钟
2026-10-16
本页按 Topic、method 和方向定义完整契约。字段表与JSON中的可选扩展不等于当前全部启用,实际接入前请查支持范围;应用REST封装见应用接入。
应用传输接口:已实现的基础与业务边界
本节四条REST接口已实现;commands接IPC预览及显式启用的独立对讲打开/SDP/连通报告/结束。interaction.trackControl当前只支持预览自身订阅,对讲不套用预览屏障;对讲额外成员应用入口仍待实现。打开预览可显式单向监听,对讲须callId及独立IM/设备准入和平台IPC.Talk配置。其余业务命令及WebSocket主动推送仍待实现。REST路径不是MQTT Topic,不计为新增设备method。纯视频/混合监听/源控制已有Linux C++解码验证;对讲Go Runtime双向实际Opus通过,正式C++对讲E2E仍未完成。
所有调用均须经过登录鉴权与企业上下文初始化,并启用Signaling。端点由平台随机分配并绑定当前用户/企业;客户端自报端点标签、已知其他用户端点或管理员身份不能替代该绑定。以下路径统一前缀为/api/v1/im/interaction。
| POST路径 | 请求 | 成功data及含义 |
|---|---|---|
/endpoints/register | 无请求正文 | endpointId:string、expiresAt:int64;独立端点固定有效一小时,时间为Unix毫秒;它不替代登录Token |
/events | endpointId:string、limit:int(1~32) | list:[{deliveryId:string,event:object}];event为完整原interaction.result/state信封,不是JSON字符串;无消息返回空数组 |
/events/ack | endpointId:string、deliveryIds:string[](1~32,不能重复) | acknowledged:int;本端点已经处理的通知数量;同ID再次确认幂等成功 |
/commands | endpointId:string、command:object(本章原应用命令信封) | accepted:boolean、msgToken:string、replay:boolean;原请求已持久受理,不表示设备接听或媒体连通 |
commands传输包装的唯一契约:只允许endpointId与command两个字段,总JSON不超过65536字节,command必须是对象而不是JSON字符串。HTTP handler严格检查重复键、深度、Unicode和安全整数,未知顶层字段及主体自报拒绝。命令章节及场景JSON展示的是command对象本身,HTTP发送时包装如下,不给设备信封添加endpointId:
{"endpointId":"<registered-endpoint>","command":{"msgToken":"open-view","method":"interaction.open","target":{"productID":"p-demo","deviceName":"device-demo"},"params":{"purpose":"ipcLiveView","cameraId":"front"}}}项目实际REST使用HTTP200及统一结果封装,成功data为{"accepted":true,"msgToken":"open-view","replay":false};HTTP受理不是接通。设备/应用原结果进入持久events,状态以真实协商、双方报告及服务器连通推进;应用受理不能冒充设备状态。端点先鉴权,再按原token持久幂等;错误或未实现方法不返回accepted。原请求重放不会重新创建观看或分配媒体。
门铃原interaction.control决策重试:在原端点、原邀请token、完整请求指纹及固定保留窗内返回原结果;未确认结果仍用原投递,已确认后重新投递相同结果但使用新的deliveryId。客户端须按原msgToken关联业务结果、按deliveryId确认本次传输;迟到旧ACK不能确认新投递。重试只推进投递水位,不推进业务eventSeq,不重新振铃、重新接听、延长授权或改变胜者。换命令/拒因的同token请求仍冲突,保留窗到期仍拒绝。该保证仅描述当前门铃决策,不推断所有旧业务已完成同样的ACK后重放接线。
APP endpointControl 的本人显式重放:原企业、用户、端点、会话、method、msgToken及完整请求指纹一致时,内部保留原已完成应答,HTTP仍只返回accepted/msgToken/replay元信息,完整结果经events消费;原结果尚待确认则复用同一deliveryId,已经确认则新建独立传输回执。新回执保持原完整正文、业务eventSeq、投递Sequence和原ExpiresAt,迟到旧ACK只能确认旧回执。它不再次提交接续、不改变父会话修订或目标媒体,不续期;原投递过期或已被清扫时不创建新投递,缺行也不能被当作重新受理或推算新TTL的理由。events请求只有endpointId和limit,没有名册afterSeq游标;会议名册水位不用于过滤此结果。该保证仅覆盖本章新APP接续接口,不改变旧IM、/ai或action协议。
事件正文的唯一字段契约仍是本章interaction.result/state,不再另造通知方法。拉取按sessionId、投递水位和deliveryId排序,仅返回本端点可读、未确认、未过期且已可投递的事件;重复拉取保留同deliveryId及正文。不同会话和APP/MQTT通道不承诺跨通道同序。
客户端流程:注册并保存本端点 → commands包装原业务命令并使用该端点 → 拉取并解析原信封 → 按deliveryId去重并应用状态 → 批量确认已处理ID。失败重试不得在处理前确认;HTTP确认仅是应用传输确认,不是设备Broker确认、动作完成或音视频已播放。任一ID跨用户/企业/端点、属于设备投递、未知或过期时,整批拒绝,不部分清除。
普通HTTP请求采用10秒客户端超时;注册失败重试会生成新端点,不能推断创建了业务会话。拉取失败允许原请求重试;确认失败原ID重试。绑定不会因拉取自动续期,客户端须在过期前结束相关会话;一小时后注册新端点不接管未声明对应能力的端点会话。长期会话续期/端点转移尚未实现,不隐式放行。服务端错误使用现有公共错误封装,参数/绑定错误明确拒绝,缓存或数据库异常不泄漏底层地址与凭据。
interaction.open · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 平台验证目标、策略和能力后邀请设备;HTTP202的accepted不是接通。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S01、S05、S06、S07、S08 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| purpose | string | 必填 | 业务目的 |
| cameraId | string | 相机场景必填 | 摄像头 |
| callId | string | ipcTalk必填 | 已存在且当前用户已加入的IM群通话ID;平台另检成员和音频许可,不自动入会。预览不允许携带此字段 |
| listenAudio | boolean | IPC预览可选 | 省略为false;true显式请求摄像头侧麦克风单向Opus发布。拒绝null、字符串、数字;不代表开启IM会议对讲、扬声器或AI取帧 |
| callType | string | 通话必填 | voice/video |
| recordingId | string | 回放必填 | 录像ID |
| clip | object | recordPlayback可选 | 精确startMs/endMs安全整数,相对录像半开区间;省略请求整份,平台邀请仍明确固化范围 |
| sourceLanguage | string | 翻译必填 | 源语言 |
| targetLanguage | string | 翻译必填 | 目标语言 |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
recordPlayback打开已接入正式后端,完整端云验收未完成:params只允许purpose、cameraId、recordingId及可选clip,不能自报版本、URL、用户或内容授权。平台从可信目录读取固定版本与时长并独立核对真实设备主人,不借预览或会议许可。首个虚拟驱动仅支持整份,部分clip即使语法合法也明确不支持。load成功、双方实际媒体就绪及显式play分开,打开不自动播放。完整流程及独立查询见支持范围。
历史目录查询 REST(已接线,端云验收待完成)
POST /api/v1/im/interaction/recordings/query 为原登录用户的只读目录接口,不是新的MQTT method。请求仅含endpointId、target{productID,deviceName}、cameraId、startTimeMs、endTimeMs、limit。端点归属、真实设备主人及相机权限先于目录读取;拒绝AllTenant/跨企业绕过。UTC Unix毫秒范围满足0≤startTimeMs<endTimeMs≤9007199254740991、窗口最多24小时;limit为1~32的整数。客户端5秒超时可原请求重试,无媒体或会话副作用。
成功data为list数组和hasMore布尔值;单条只含recordingId、cameraId、startTimeMs、endTimeMs、durationMs、available、videoCodec、可选audioCodec、recordingVersion。空数组是成功,截断时hasMore=true需缩小窗口,不暴露地址、路径或连接密钥。目录available不保证稍后真实load成功;设备离线时当前设备源不能播放,不据此承诺云回放。字段时间为目录事实;clip及positionMs的相对位置不能与Unix时间混用。
实时预览IPC打开使用purpose=ipcLiveView与cameraId;recordingId仅属于独立recordPlayback,不能混入预览。callType及语言字段仍属其它设计业务,不因列在字段表而开放。listenAudio=true通过真实PreflightIPC检查当前设备音频能力,在邀请中增加audio-1(sourceId=mic、direction=sendonly、codec=opus)轨;能力不足在持久领取操作及创建会话前拒绝。省略或false仅邀请video-1。完整请求(含监听意图)参与原token摘要,同token改变监听意图返回冲突;重放既有请求不重新准入、不分配新媒体。设备确认策略同样确认包含音频的完整邀请,不自动改成授权直连。
显式监听请求的command对象:
{"msgToken":"listen-view","method":"interaction.open","target":{"productID":"p-demo","deviceName":"device-demo"},"params":{"purpose":"ipcLiveView","cameraId":"front","listenAudio":true}}报文实例
{
"msgToken": "s01-6",
"method": "interaction.open",
"params": {
"purpose": "ipcLiveView",
"cameraId": "front"
},
"target": {
"productID": "p-demo",
"deviceName": "device-demo"
}
}对应S01-M13;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
interaction.end · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 由参与者结束其有权结束的会话;观看者只退出自己的观看会话,不终止共享源。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S07、S08 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| reason | string | 必填 | userHangup/userStopped |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
报文实例
{
"msgToken": "s07-111",
"method": "interaction.end",
"sessionId": "s07-talk",
"params": {
"reason": "userStopped"
}
}对应S07-M31;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
interaction.join · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 复用IM群通话加入;成员登录态、当前群资格及callId绑定必须核验,不能冒用参数身份。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S06 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| participantId | string | 必填 | 平台授权成员ID |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
报文实例
{
"msgToken": "s06-92",
"method": "interaction.join",
"sessionId": "s-group",
"params": {
"participantId": "user-b"
}
}对应S06-M33;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
interaction.leave · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 本人退出本次IM通话;原活通话发起人可移出另一当前成员。均不是退群;剩余人数至少2人时继续,否则沿原IM策略结束。原媒体Owner独立撤销目标旧腿,结果不等于采集已停止。 |
| 前置条件 | 已登录具体企业、原注册端点、调用者原 ipcTalk 媒体腿与原 callId 绑定;本人仍是原加入实例的活成员。他人控制还要求原通话发起人身份;平台/企业管理员或群主标志不能替代。 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 原企业+端点+method+msgToken唯一受理;同键不同正文冲突。双方加入实例在原IM原子校验中围栏。重复pending只读原退出回执,无回执即结果未知,不再执行;原完成结果至少保留10分钟。重放可重投原结果,不恢复或再移出新加入者。 |
| 失败 | 参数、主体、实例或权限不满足时沿正式HTTP入口返回非200业务码,不伪造accepted。领取后中断或无原回执表示结果未知;HTTP失败本身不能推断“未执行”,只能原token查询/重试,不自动换token重做。当前共用HTTP错误映射不暴露内部Redis/数据库原因。 |
| 适用场景 | S06 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| callId | string | 必填 | 原IM群通话ID;必须等于 sessionId 原媒体腿持久绑定的会议。 |
| participantId | string | 必填 | 规范安全正整数字符串用户ID;本人表示自退,他人表示主持移出。不能使用 user-b、前导零、自报角色。 |
| expectedMemberEpoch | integer | 必填 | 1~9007199254740991;原IM音权读取的目标 memberEpoch。退出重入递增;不接受null、小数、指数或字符串。 |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
报文实例
{
"msgToken": "s06-95",
"method": "interaction.leave",
"sessionId": "s-original-app-leg",
"params": {
"callId": "gcall-example",
"participantId": "103",
"expectedMemberEpoch": 1
}
}对应S06-M42;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
成功 interaction.result.data 固定包含 operation=interaction.leave、callId:string、participantId:string、memberEpoch:integer、remaining:string[]、ended:boolean。remaining 是原操作当时的IM成员快照,不是持续授权;不包含设备播放/采集完成字段。该结果为独立原操作账本通知,不推进媒体腿的 eventSeq、修订或续租。目标腿终态与其他腿名册变化由既有Owner和持久outbox独立产生,可能先于或晚于结果到达。
实现边界:当前统一信令会议音频腿已接入;旧 group_leave 含义、旧IM接口与兼容网关不改变,不借群聊 remove-member 执行主持移出。原IM回执容量256条且不驱逐,耗尽时拒绝新控制;不能清除去重事实后继续执行。详见S06主持移出流程;真实四端验收状态见支持范围。
interaction.subscribe · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 每个观看者新建独立接收会话及令牌;不能共享其他观看者令牌。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S07 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| trackId | string | 必填 | 授权源轨 |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
报文实例
{
"msgToken": "s07-113",
"method": "interaction.subscribe",
"sessionId": "s07-session",
"params": {
"trackId": "video-1"
}
}对应S07-M34;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
interaction.mediaOffer · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 应用 Peer 自己协商;设备完成 SDP 不代替应用 Peer。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S06、S07 |
正文字段
params字段完整复用设备mediaOffer的类型、必填条件与枚举,本页不另建字段表。差异仅是应用登录态鉴权、HTTP/WS传输及interaction.result应答;sessionId绑定应用自身参与端,不复用设备身份或Peer。
报文实例
{
"msgToken": "s06-80",
"method": "interaction.mediaOffer",
"sessionId": "s06-session",
"params": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP caller offer>"
}
}
}对应S06-M10;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
interaction.mediaState · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 应用报告 ICE/DTLS 状态;平台需独立校验。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S06、S07 |
正文字段
params字段完整复用设备mediaState的类型、必填条件与枚举,本页不另建字段表。差异仅是应用登录态鉴权、HTTP/WS传输及interaction.result应答;sessionId绑定应用自身参与端,不复用设备身份或Peer。
报文实例
{
"msgToken": "s06-81",
"method": "interaction.mediaState",
"sessionId": "s06-session",
"params": {
"mediaRevision": 1,
"state": "connected"
}
}对应S06-M12;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
interaction.trackControl · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 鉴权后转轨控制;mute 停麦克风轨,关摄像头停视频轨,不挂断整个通话。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S06 |
正文字段
params字段完整复用设备trackControl的类型、必填条件与枚举,本页不另建字段表。差异仅是应用登录态鉴权、HTTP/WS传输及interaction.result应答;sessionId绑定应用自身参与端,不复用设备身份或Peer。
适用S07的IPC观看端当前实现范围:会话已建立且mediaRevision=1时,只能控制邀请中已授权的自身video-1/audio-1订阅,支持subscribe、unsubscribe、pause、resume;publish、stop拒绝,纯视频会话不能通过订阅新增音频授权。默认订阅active;pause变paused,resume变active,unsubscribe变stopped,显式subscribe可恢复同一已授权轨。取消订阅后pause/resume拒绝,须先subscribe。原token重放返回原结果,不重复改变转发屏障;终态或旧媒体代次拒绝。成功结果data为operation、trackId、state、mediaRevision,state是平台实际转发订阅状态,不是摄像头驱动采集或设备播放状态。媒体屏障失败结束本观看者并释放资源,不返回成功;其它观看者不受影响。设备SIG↑发布及SIG↓驱动控制不因本实现而开放。实际验证见支持范围。
报文实例
{
"msgToken": "s06-app-mute",
"method": "interaction.trackControl",
"sessionId": "s06-session",
"params": {
"trackId": "caller-mic",
"operation": "pause",
"mediaRevision": 1
}
}对应S06-M24;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
interaction.configure · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 翻译语言方向变更;清旧方向缓存,结果带新 configRevision。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S05 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| sourceLanguage | string | 必填 | BCP47 |
| targetLanguage | string | 必填 | BCP47 |
| speakerId | string | 必填 | 指定说话人 |
| configRevision | uint | 必填 | 递增配置号 |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
报文实例
{
"msgToken": "s05-69",
"method": "interaction.configure",
"sessionId": "s05-session",
"params": {
"sourceLanguage": "en-US",
"targetLanguage": "zh-CN",
"speakerId": "person-b",
"configRevision": 2
}
}对应S05-M13;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
本人摄像头→AI同意(HTTP与账本入口已新增,活Owner端云待验)
独立cameraAI同意只用于S09摄像头分享,不复用completedText交接、图片附件授权、IPC观看或录像许可。当前已新增专用CreateVision/统一能力的视觉子校验、本人授权服务、独立SQL账本及下列严格HTTP处理器;签发只接正式Runtime的活Owner Authority,未装配或读失败必须拒绝;processorControl与摄像头→真实模型端云尚待完整验收,不作为已完成视觉分享。同一设备仍只有统一CapabilityReport,不另造视觉能力报文。视觉创建使用原sessionCreate、webrtc、明确cameraId及Opus48000Hz单声道20ms,两音频轨及唯一初始paused的H264 sendonly摄像头轨;默认音频创建仍拒绝视觉请求。
以下接口均为已登录的具体本人,路径统一前缀/api/v1/im/vision-consents,不是MQTT Topic,不增加设备method。企业/本人来自原鉴权上下文,平台管理员、设备认证和通配企业不能代签;本人也不能仅凭正文声明在线、Owner、权限或选轨。
| POST路径 | 严格请求字段 | 成功data与副作用 |
|---|---|---|
/create | msgToken、sourceSessionId、cameraId、trackId、expectedMediaRevision、expiresAt | {consent,replay}:consent只含下列10项公共元数据;仅签同意,不打开摄像头/处理器 |
/get-one | consentId | {consent}:本人原元数据,revokedAt=0仅表示未撤销;到期或会话结束可查询,不等于当前仍授权取帧 |
/revoke | consentId、expectedRevision | {consent}:新revision及首次revokedAt;相同原expectedRevision重复返回首次结果,不刷新任何租约 |
consent固定字段为consentId、scope=cameraAI、sourceSessionId、cameraId、trackId、mediaRevision、expiresAt、grantedAt、revision、revokedAt。不返回内部企业、Owner、ConnectionEpoch、模型资源或完整Source。查询与撤销不要求Signaling.Enabled、活Owner或当前模型仍存在;已鉴权本人才能访问原账本,管理员不能借其管理权限代操作。
请求不超过4096字节,字段全部必填,不接受null、重复键、额外字段或不安全整数。ID原字符串不得含通配或边缘空白;media/consent修订为1~9007199254740991安全整数,撤销expectedRevision须小于该上限。expiresAt为本人明确的UTC Unix毫秒,必须晚于当前时点且不超过原会话deadline;不能将秒猜成毫秒。上例及完整签发/撤销JSON见S09-M26–29。
签发流程:活Owner专属Authority按原本人/设备核真实资源与相机/轨选择、当前连接/能力/隐私,返回本次≤2秒短核权;再读同一原来源以隔离读取期间换代;SQL事务锁真实aiVision源行,核原OwnerNode/OwnerEpoch、ConnectionEpoch、模型ResourceID、原会话deadline及原平台选择,再以本人/token建立唯一Consent。事务内不读取RPC/模型。无活Owner或未知读取不能从旧SQL构造成功Authority,也不能自动回退图片上传。重复原token必须保持来源与明确截止完全相同,不重新签发或续期;更换来源/截止返回冲突。
Owner未来快照只在现有binding/request/mediaRevision之外保存平台原选择vision:{cameraId,trackId,capabilityRevision};它不是用户字段,也不是第二份CapabilityReport。Repo严格读取原CreateVision的视频轨:sourceId等于原cameraId、trackId等于原选择,原创建请求初始paused;当前轨的后继active状态由独立Owner/实际媒体推进,不能改写初始创建来授予分享。独立Consent.Revision用于撤销,不拿每条音频事件Session.Revision当授权revision持续作废;Owner/连接/能力/媒体代次分别按原含义核验。
每次取帧与提交模型都必须在原2秒短核权窗口内重新读活Authority并锁原Consent修订/未撤销状态;短核权只约束本次操作,不将持续Consent有效期裁成2秒。排队票据绑定原帧、原完整来源和原短截止,错帧、墙钟回退、到期、撤权或换代拒消费,不因为仍有旧缓冲画面而重放。撤销无需Owner仍在线;原正在消费的任务和缓冲清理由后继媒体/Sampler装配执行,尚未接线不能声称已取消真实模型。
停止分享的顺序是本人撤销Consent → 原interaction.processorControl detach及trackControl/trackState实际停流 → 清缓冲与在途消费。撤权结果不是物理停采事实;unknown不补造active/stopped。旧主语音保留,旁路拒绝不挂断主会话。HTTP统一结果封装仅返回上表公共元数据,不整份返回内部Source、owner/连接栅栏、设备主体、URL或画面;固定错误分类不输出SQL/RPC正文。
三路由统一使用原CheckTokenWare和InitCtxsWare,均为POST;本人手机终端标识不是IoT设备认证,不可据此错误拒绝本人。API与Swagger列出的必填字段、数据类型、data.consent及data.replay与实际处理器一致;当前生成的OpenAPI未完整表达拒绝额外/重复/null字段、安全整数和4096字节上限,调用端不能只凭生成schema认为报文合法,正式严格decoder仍为准。
摄像头AI取帧所需的设备接线与验收边界见S09嵌入式接线。离散图片inputSend(image_url)、takePhoto上传及IPC观看各有独立用途,不能用其许可或测试替代此接口的活来源核验。
interaction.processorControl · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | detach 先撤权再释放处理器;旁路失败只回本次操作错误,主通话继续。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S05、S09 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| processorId | string | 必填 | 实例ID |
| processor | string | 必填 | translation/aiAssist |
| operation | string | 必填 | attach/detach |
| sourceTrackIds | string[] | 必填 | 授权轨 |
| consentIds | string[] | attach必填 | 服务端可核验同意 |
| targetLanguage | string | 翻译attach必填 | 目标语言 |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
报文实例
{
"msgToken": "s05-72",
"method": "interaction.processorControl",
"sessionId": "s-call",
"params": {
"processorId": "translation-1",
"processor": "translation",
"operation": "attach",
"sourceTrackIds": [
"call-mic",
"call-peer"
],
"consentIds": [
"consent-a",
"consent-b"
],
"targetLanguage": "zh-CN"
}
}对应S05-M18;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
messageSend · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 独立消息提交;不是实时会话。 |
| 前置条件 | 投递身份及内容引用有效,不创建实时会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S10 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| deliveryId | string | 必填 | 投递ID |
| kind | string | 必填 | broadcast/voiceMessage |
| expiresAt | int64 | 必填 | Unix毫秒 |
| contentRef | string | 必填 | 已上传的授权资源 |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
报文实例
{
"msgToken": "s10-139",
"method": "messageSend",
"params": {
"deliveryId": "delivery-1",
"kind": "voiceMessage",
"expiresAt": 1900000000000,
"contentRef": "<authorized-audio-ref>"
},
"target": {
"productID": "p-demo",
"deviceName": "device-demo"
}
}对应S10-M01;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
device.action · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 应用控制物模型;服务端生成并记录 action token 映射,不直接信任调用者设备身份。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S08 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| actionID | string | 必填 | 产品action标识 |
| input | object | 必填 | 按产品物模型校验 |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
报文实例
{
"msgToken": "s08-118",
"method": "device.action",
"params": {
"actionID": "ptzMove",
"input": {
"direction": "left",
"speed": 0.5,
"durationMs": 1000
}
},
"target": {
"productID": "p-demo",
"deviceName": "device-demo"
}
}对应S08-M01;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
device.propertyControl · APP↑
| 项目 | 契约 |
|---|---|
| Topic/接口 | POST /api/v1/im/interaction/commands |
| 发送→接收 | 已鉴权应用→平台 |
| 消息类型 | 请求 |
| 对应应答 | HTTP受理;随后 interaction.result |
| 触发与状态变化 | 配置属性与会话控制分离;具体取值见物模型章节。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 10秒;最多原token重试2次;事件形式不等待ACK |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S08 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| properties | object | 必填 | 产品允许的属性 |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
报文实例
{
"msgToken": "s08-119",
"method": "device.propertyControl",
"params": {
"properties": {
"privacyMode": true,
"nightVision": "auto",
"recordingPolicy": "motion"
}
},
"target": {
"productID": "p-demo",
"deviceName": "device-demo"
}
}对应S08-M11;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
interaction.result · APP↓
| 项目 | 契约 |
|---|---|
| Topic/接口 | WS interaction.event |
| 发送→接收 | 平台→已鉴权应用 |
| 消息类型 | 应答 |
| 对应应答 | — |
| 触发与状态变化 | 经 WS interaction.event 发给原操作者,原 token;设备通知不能充当应用请求应答。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 不等待ACK;重复按公共规则丢弃/重放 |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S01、S05、S06、S07、S08、S09、S10 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| operation | string | 必填 | 原请求method |
| result | object | interaction.control成功必填 | 扩展命令对应State/Updated/Snapshot正文,含所有条件字段 |
| state | string | 非interaction.leave成功必填 | 操作结果;interaction.leave使用以下独立事实字段,不伪造媒体状态 |
| callId | string | interaction.leave成功必填 | 原IM群通话标识 |
| participantId | string | interaction.leave成功必填 | 已退出目标的规范正整数用户ID字符串 |
| memberEpoch | uint | interaction.leave成功必填 | 已退出实例,安全正整数;不是目标重入后的新代次 |
| remaining | string[] | interaction.leave成功必填 | 原操作时的剩余IM成员快照,不授权也不等于当前名册 |
| ended | boolean | interaction.leave成功必填 | 原IM人数规则是否使整场通话结束,不表示所有端采集已停 |
| reason | string | 失败必填 | 错误 |
| sessionId | string | 创建订阅成功必填 | 新会话 |
| webrtc | WebRTC | mediaOffer成功必填 | answer |
| mediaRevision | uint | 媒体操作必填 | 当前代次 |
| playbackToken | string | 订阅成功必填 | 收件者独享令牌 |
| processorId | string | 处理器操作必填 | 实例 |
| deliveryId | string | 异步消息必填 | 投递ID |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
报文实例
{
"msgToken": "s01-6",
"method": "interaction.result",
"sessionId": "s01-invited",
"code": 200,
"data": {
"operation": "interaction.open",
"state": "invited",
"sessionId": "s01-invited"
}
}对应S01-M14;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
interaction.state · APP↓
本事件描述接收APP所绑定的参与端状态,不代替另一端的设备状态。S18初始控制者接续时,旧APP原参与端唯一ended,目标使用独立APP session;原IPC设备锚点继续established且不接收sessionEnded。旧APP不得凭原session继续控制设备。详见支持范围。普通未接续双端行为不变。
| 项目 | 契约 |
|---|---|
| Topic/接口 | WS interaction.event |
| 发送→接收 | 平台→已鉴权应用 |
| 消息类型 | 事件 |
| 对应应答 | — |
| 触发与状态变化 | 原操作者/参与者会话事件;与 interaction.result 独立;有 eventSeq。 |
| 前置条件 | 会话/参与端有效,满足方法语义;结束/失败事件允许清理非终态会话 |
| 超时与重试 | 不等待ACK;重复按公共规则丢弃/重放 |
| 幂等与迟到 | 遵循公共约定;终态不复活;旧sessionId/媒体代次拒绝或丢弃,不影响新资源 |
| 失败 | 请求按对应应答方法返回实际code和data.reason;异步失败单独事件,不以成功字段包装错误 |
| 适用场景 | S01、S05、S06、S07 |
正文字段
| 字段 | 类型 | 必填条件 | 枚举/默认及含义 |
|---|---|---|---|
| state | string | 必填 | invited/established/ended |
| reason | string | ended必填 | 结束原因 |
所有成功字段表以外的共通错误负载为 data.reason:string;条件不满足时不要求成功字段。未声明可选字段缺省为“未提供”,无隐式开启能力。
报文实例
{
"msgToken": "s01-11",
"method": "interaction.state",
"sessionId": "s01-invited",
"eventSeq": 3,
"data": {
"state": "established"
}
}对应S01-M27;完整应答和异常在该场景或S11。设备Topic中的productID/deviceName来自认证,不从正文取身份。
会议音权 REST · APP↑
POST /api/v1/im/interaction/talk/audio-access 复用原IM活群通话、持久群成员及发起人音权CAS;不是新设备method,也不是原media_state通知。本入口不要求设备媒体端点,不创建Peer、加入群、接听设备或开放摄像头。原登录用户必须处于具体企业并同时属于当前活通话与持久群;查询目标同样必须是该通话的活群成员。管理员、设备主人和持久群拥有者均不能替代原通话发起人设置许可。
| 请求字段 | 类型 | 条件及边界 |
|---|---|---|
| operation | string | read或set,无默认 |
| callId | string | 原IM活群通话,非设备sessionId;最多96字节 |
| targetUserID | string | 规范十进制正整数,1~9007199254740991;不能是JSON数字、前导零、自由participant或设备身份 |
| allowed | boolean | 仅set显式必填;read禁止携带,false不是省略 |
| expectedRevision | integer | 仅set必填,1~9007199254740991;原目标许可代次,不是媒体代次 |
read请求恰三个字段,set恰五个字段。重复键、null、未知键、浮点和不安全整数在授权前拒绝。不会接受客户端自报企业、角色、memberEpoch或管理员身份。
{"operation":"read","callId":"call-demo","targetUserID":"103"}{"operation":"set","callId":"call-demo","targetUserID":"103","allowed":false,"expectedRevision":1}成功以原HTTP公共封装返回data,字段固定如下;下例均为占位值:
{"callId":"call-demo","targetUserID":"103","publishAllowed":false,"audioRevision":2,"memberEpoch":1,"expiresAt":1800000001000}audioRevision为目标成员许可代次,memberEpoch为当前真实加入实例,两者均为正安全整数。expiresAt为Unix毫秒,最多当前时刻两秒并且不超过原心跳截止。该结果不是持久续租,不授予更长会话或发布权限,不泄漏设备连接代次、媒体地址、密钥或摄像头权限。
set在服务端先读取目标当前加入实例,再在原Redis事务内同时核验原发起人、活成员、expectedRevision与服务端原memberEpoch;退出重入即使许可代次相同也在写入前拒绝。相同allowed且原CAS仍有效时不递增代次;过时代次拒绝,不能自动重读后强制覆盖。设置的服务端许可还需由媒体房间持续复核;HTTP成功不是实际禁麦或PCM已经停止的证明,禁麦不撤销接收资格。
客户端建议10秒超时。read可原请求重试;set超时或未知结果先重新read核验,不自动替换expectedRevision重试新意图。权限不匹配返回原公共权限错误;非法正文或过时CAS返回公共参数错误,未装配会议运行时明确失败,超时保持未知。响应不反射底层自由错误。
实现与验收边界:正式严格解码、handler/logic/Runtime及Bound CAS已落代码;目标加入实例先真实Redis/SQL复现失败,再修复原子栅栏。中央已执行完整协议与HTTP包race及vet,均通过;会议脚本10项离线契约测试无跳过通过。成员入口必须显式Signaling.IPC.Talk.Members=true,默认false保留原双端行为;音权入口要求已装配真实IM会议运行时,不会因read/set自动开Members或创建媒体。C++设备与三个真实APP使用支持范围中的独立入口,后继支持范围已分阶段通过;验收绑定当时产物,不替代最新增量整链复验,不扩大为群视频SFU或硬件验收。
更新日志
2026/10/16 16:04
查看所有更新日志
fe3a7-docs(AI与音视频): 按场景整理完整接入流程与命令契约于
