门铃告警与多端接听
约 1891 字大约 6 分钟
2026-10-16
本页包含已接线核心流程及可选扩展;具体子能力必须按设备、平台与用户授权求交集。参见支持范围、场景索引和命令手册。图中S编号只用于本文定位,不放入实际JSON。
前置条件
门铃按键或产品告警由物模型事件进入策略引擎;策略在确认权限/免打扰后创建humanCall呼叫组。事件本身不授予视频分享或开锁权限。
同组推送多个用户/终端,每端分配独立候选sessionId和邀请token。平台在Accept提交点原子选首个有权接听者;其他端409 alreadyAnswered并结束自己的候选腿,不能广播结束整个组。重复物模型事件按sourceEventId去重;未接听过期转成独立语音留言须事先配置并获录音同意。
D/D2是不同设备参与端,A是应用端,P是平台和媒体节点。各端分别使用鉴权Topic/登录态,不能冒用另一端身份。基础会话与媒体协商见S01/S06,复用时保留本场景sessionId并独立分配密钥和token。
完整时序
报文索引
编号按图阅读;编号保留历史引用,不要求数值连续。字段定义以命令链接为准。
| 编号 | 发送→接收 | Topic/接口 | 方法及契约 | 应答/等待 | 状态或作用 |
|---|---|---|---|---|---|
| S17-M01 | P→A | APP↓ | interaction.invite | 应答/状态事件;不等待ACK | |
| S17-M02 | P→D2 | SIG↓ | sessionInvite | 对应应答见命令;10秒受理,媒体协商15秒 | |
| S17-M03 | A→P | APP↑ | interaction.control | interaction.result;10秒受理,媒体协商15秒 | |
| S17-M04 | P→A | APP↓ | interaction.result | 应答/状态事件;不等待ACK | |
| S17-M05 | D2→P | SIG↑ | sessionAccept | 对应应答见命令;10秒受理,媒体协商15秒 | |
| S17-M06 | P→D2 | SIG↓ | requestAck | 应答/状态事件;不等待ACK | |
| S17-M07 | P→D2 | SIG↓ | sessionEnded | 应答/状态事件;不等待ACK | |
| S17-M11 | A→P | APP↑ | interaction.mediaOffer | 按契约等待10秒 | 核对补齐,不以受理替代完成 |
| S17-M12 | P→A | APP↓ | interaction.result | 应答或事件,无ACK | 核对补齐,不以受理替代完成 |
| S17-M13 | A→P | APP↑ | interaction.mediaState | 按契约等待10秒 | 核对补齐,不以受理替代完成 |
| S17-M14 | P→A | APP↓ | interaction.result | 应答或事件,无ACK | 核对补齐,不以受理替代完成 |
| S17-M08 | P→A | APP↓ | interaction.state | 应答/状态事件;不等待ACK | |
| S17-M09 | P→A | APP↓ | interaction.state | 应答/状态事件;不等待ACK | |
| S17-M10 | P→D2 | SIG↓ | sessionEnded | 应答/状态事件;不等待ACK |
逐条JSON
S17-M01 · interaction.invite
{
"msgToken": "invite-a",
"method": "interaction.invite",
"sessionId": "door-leg-a",
"data": {
"invitation": {
"purpose": "humanCall",
"callType": "video",
"admission": "accept",
"transport": "webrtc",
"expiresAt": 1900000000000,
"tracks": [
{
"trackId": "video-new",
"kind": "video",
"sourceId": "front",
"sourceType": "camera",
"direction": "recvonly",
"codec": "H264",
"state": "requested"
}
],
"callGroupId": "door-call",
"sourceEventId": "door-event"
},
"endpointId": "phone-a",
"callGroupId": "door-call"
},
"eventSeq": 1
}S17-M02 · sessionInvite
{
"msgToken": "invite-b",
"method": "sessionInvite",
"sessionId": "door-leg-b",
"eventSeq": 1,
"params": {
"purpose": "humanCall",
"callType": "video",
"admission": "accept",
"transport": "webrtc",
"expiresAt": 1900000000000,
"tracks": [
{
"trackId": "video-new",
"kind": "video",
"sourceId": "front",
"sourceType": "camera",
"direction": "recvonly",
"codec": "H264",
"state": "requested"
}
],
"callGroupId": "door-call",
"sourceEventId": "door-event"
}
}S17-M03 · interaction.control
{
"msgToken": "invite-a",
"method": "interaction.control",
"sessionId": "door-leg-a",
"params": {
"command": "sessionAccept",
"arguments": {
"acceptedTracks": [
"video-new"
]
}
}
}S17-M04 · interaction.result
{
"msgToken": "invite-a",
"method": "interaction.result",
"sessionId": "door-leg-a",
"data": {
"operation": "interaction.control",
"state": "applied",
"result": {
"state": "negotiating"
}
},
"code": 200
}S17-M05 · sessionAccept
{
"msgToken": "invite-b",
"method": "sessionAccept",
"sessionId": "door-leg-b",
"params": {
"acceptedTracks": [
"video-new"
]
}
}S17-M06 · requestAck
{
"msgToken": "invite-b",
"method": "requestAck",
"sessionId": "door-leg-b",
"data": {
"requestMethod": "sessionAccept",
"reason": "alreadyAnswered"
},
"code": 409
}S17-M07 · sessionEnded
{
"msgToken": "s17-58",
"method": "sessionEnded",
"sessionId": "door-leg-b",
"data": {
"state": "ended",
"reason": "answeredElsewhere"
},
"eventSeq": 2
}S17-M11 · interaction.mediaOffer
{
"msgToken": "s17-offer",
"method": "interaction.mediaOffer",
"sessionId": "door-leg-a",
"params": {
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP caller offer>"
}
}
}S17-M12 · interaction.result
{
"msgToken": "s17-offer",
"method": "interaction.result",
"sessionId": "door-leg-a",
"code": 200,
"data": {
"operation": "interaction.mediaOffer",
"state": "negotiating",
"mediaRevision": 1,
"webrtc": {
"iceMode": "complete",
"sdp": "<SDP caller answer>"
}
}
}S17-M13 · interaction.mediaState
{
"msgToken": "s17-connected",
"method": "interaction.mediaState",
"sessionId": "door-leg-a",
"params": {
"mediaRevision": 1,
"state": "connected"
}
}S17-M14 · interaction.result
{
"msgToken": "s17-connected",
"method": "interaction.result",
"sessionId": "door-leg-a",
"code": 200,
"data": {
"operation": "interaction.mediaState",
"state": "connected",
"mediaRevision": 1
}
}S17-M08 · interaction.state
{
"msgToken": "s17-59",
"method": "interaction.state",
"sessionId": "door-leg-a",
"data": {
"state": "established"
},
"eventSeq": 2
}S17-M09 · interaction.state
{
"msgToken": "s17-60",
"method": "interaction.state",
"sessionId": "door-leg-a",
"data": {
"state": "ended",
"reason": "inviteTimeout"
},
"eventSeq": 3
}S17-M10 · sessionEnded
{
"msgToken": "s17-61",
"method": "sessionEnded",
"sessionId": "door-leg-b",
"data": {
"state": "ended",
"reason": "inviteTimeout"
},
"eventSeq": 3
}媒体与本地动作
| 编号 | 路径 | 格式与约束 |
|---|---|---|
| S17-R03 | A→P | WebRTC ICE/DTLS;接听后独立Peer,不复用门铃密钥 |
| S17-R02 | D→A | 授权门铃WebRTC视频及显式启用的对讲音轨,经媒体节点转发 |
异常、状态与资源释放
路由与信封见公共约定;阶段性状态不代表最终完成。操作终态时限见命令手册;编号、超时等元信息不发送。
能力不足422、无权限403、资源/修订号冲突409、超时504按S11处理,不静默开启设备能力。同token只重放原结果;事件按eventSeq去重,旧会话/端代次不可恢复。验证本页正常路径、alt分支及支持范围断言。文档通过不代表代码或硬件已实现。
本图入口前门铃源端已按S01完成自身媒体腿door-source的建立;M08须同时确认门铃源与胜出接听端连通。尚未连通只能保持negotiating,不能只因抢答胜出就发established。接听端视频轨方向是recvonly,不能要求手机发布门铃画面。
验证入口
更新日志
2026/10/16 16:04
查看所有更新日志
fe3a7-docs(AI与音视频): 按场景整理完整接入流程与命令契约于
