1. 提交控制# POST /api/v1/devices/{deviceId}/commands扩展建议 # 鉴权:屏或会员身份,只能控制授权设备。路径沿用现有接口,补充以下约定。
参数:body: DeviceCommand
⌘ 查看 JSON 示例 13 JSON · 6 行 JSON 示例 复制
{
"commandType" : "set" ,
"params" : {"switch_1" : false },
"timeout" : 30000 ,
"schemaRevision" : 2
}action 请求示意:
⌘ 查看 JSON 示例 14 JSON · 6 行 JSON 示例 复制
{
"commandType" : "action" ,
"params" : {"actionCode" : "stop" , "arguments" : {}},
"timeout" : 10000 ,
"schemaRevision" : 2
}动作必须在 schema.actions 中声明,示例 stop 不意味着所有设备都支持。
平台先原子记录幂等请求和命令,再调度执行;不得等待物理动作结束才生成 commandId。接受请求后返回 HTTP 202,data: CommandResult。
⌘ 查看 JSON 示例 15 JSON · 17 行 JSON 示例 复制
{
"code" : 0 ,
"message" : "success" ,
"data" : {
"commandId" : "command-001" ,
"deviceId" : "device-001" ,
"state" : "QUEUED" ,
"terminal" : false ,
"executionSource" : "LOCAL_PANEL" ,
"executorPanelId" : "panel-001" ,
"routeRevision" : 3 ,
"createdAt" : 1792123200000 ,
"expiresAt" : 1792123230000 ,
"completionMode" : "STATE" ,
"result" : null
}
}executionSource 为 CLOUD 或 LOCAL_PANEL。CLOUD 由平台既有云驱动执行;LOCAL_PANEL 只进入指定屏的队列,不能同时调用云驱动。
提交时若本地执行屏已离线或设备已明确不可控,返回 DEVICE_OFFLINE,不建立等待日后联网自动执行的队列。在线检查后发生断网的已有命令按各自有效期处理。
同一 set 请求包含多个属性时,默认不保证物理原子性。平台先校验全部属性,然后逐项记录结果;部分完成返回 PARTIAL_FAILURE 及每项结果,不显示整体成功。涉及严格原子动作时应由设备原生服务另行声明。
2. 查询控制结果# GET /api/v1/device-commands/{commandId}新增建议 # 返回 CommandResult,只允许本命令关联家庭的合法调用者读取。
QUEUED/DELIVERED 超时后为 EXPIRED;EXECUTING 或等待目标回报超时后为 UNKNOWN,不宣称设备没有动作。终态不再自动重放。迟到状态仍可更新设备状态,并追加 lateEvidence,但不把过期命令重新排队。
3. 领取命令# POST /api/v1/panels/{panelId}/commands/pull新增建议 # 参数:body: CommandPullRequest
⌘ 查看 JSON 示例 16 JSON · 5 行 JSON 示例 复制
{
"bootId" : "boot-example-01" ,
"waitSeconds" : 20 ,
"maxItems" : 10
}bootId 必填;maxItems 建议 1–20。每次新的领取使用新 Idempotency-Key;同一次请求网络重试使用原键。平台保留领取结果,不因响应丢失再次创建任务。
响应 data:
⌘ 查看 JSON 示例 17 JSON · 18 行 JSON 示例 复制
{
"commands" : [
{
"commandId" : "command-001" ,
"deviceId" : "device-001" ,
"localDeviceId" : "local-device-001" ,
"commandType" : "set" ,
"params" : {"switch_1" : false },
"schemaRevision" : 2 ,
"routeRevision" : 3 ,
"deliveryToken" : "<delivery-token>" ,
"deliveryExpiresAt" : 1792123210000 ,
"expiresAt" : 1792123230000 ,
"completionMode" : "STATE"
}
],
"serverTime" : 1792123200000
}只投递当前归本屏负责且有效的命令。建议投递租期 10 秒,且不能晚于命令 expiresAt。屏未申请执行、投递租期已过时,可重新投递并更换 deliveryToken;旧 token 立即失效。已进入 EXECUTING 的命令不能重新投递给其他实例。
4. 申请执行# POST /api/v1/panels/{panelId}/commands/{commandId}/start新增建议 # ⌘ 查看 JSON 示例 18 JSON · 5 行 JSON 示例 复制
{
"bootId" : "boot-example-01" ,
"deliveryToken" : "<delivery-token>" ,
"routeRevision" : 3
}平台原子检查命令状态、有效期、最新执行归属、调用权限和 deliveryToken,成功转为 EXECUTING,返回:
⌘ 查看 JSON 示例 19 JSON · 6 行 JSON 示例 复制
{
"executionToken" : "<execution-token>" ,
"state" : "EXECUTING" ,
"expiresAt" : 1792123230000 ,
"serverTime" : 1792123201000
}屏收到有效执行许可后才能向设备发送。申请响应丢失时,以同一 Idempotency-Key 重试取得同一许可,平台仍检查当前身份、归属及有效期;屏重新核对截止时间,不能因响应超时自行执行。
在发送物理指令前,屏必须以 commandId 唯一约束原子占用本地执行记录,并先持久化 ATTEMPTING 标记;并发回调不能各执行一次。若进程在发送附近中断,重启后不再重发该动作,查询设备状态并报告 UNKNOWN 或可核实证据。分布式协议不能保证跨设备断电的物理“恰好一次”;本约定优先避免重复动作,并保留无法确定的结果。
5. 报告执行结果# POST /api/v1/panels/{panelId}/commands/{commandId}/report新增建议 # 参数:body: CommandReport
⌘ 查看 JSON 示例 20 JSON · 15 行 JSON 示例 复制
{
"executionToken" : "<execution-token>" ,
"reportId" : "command-report-001" ,
"reportSequence" : 2 ,
"state" : "CONFIRMED" ,
"observedAt" : 1792123202500 ,
"items" : [
{
"code" : "switch_1" ,
"state" : "CONFIRMED" ,
"reportedValue" : false ,
"evidence" : "DEVICE_REPORT"
}
]
}ACK_ONLY 动作可报告 ACCEPTED 作为终态,但界面仍显示“已接受”,不能显示“已确认机械停止”等未取得的结果。
平台核对目标、物模型允许的数值精度和执行归属,不接受用旧缓存值直接报告 CONFIRMED。可接受证据为实际设备回报,或指令之后完成且能证明新鲜度的读回;无证据时保留 ACCEPTED/UNKNOWN。命令回执不直接覆盖设备最新状态,设备状态另走第七节并按顺序合并。
响应 data:
⌘ 查看 JSON 示例 21 JSON · 6 行 JSON 示例 复制
{
"commandId" : "command-001" ,
"state" : "CONFIRMED" ,
"terminal" : true ,
"duplicate" : false
}reportId 重复且内容相同返回同一结果;不同内容返回冲突。旧 reportSequence 不回退状态。中途会话刷新不影响有效 executionToken;新 bootId、撤权或路由变化后只能追加经平台核验的旧执行证据,不能凭旧 executionToken 获取新执行权。
6. 屏上本地点击与回声处理# 负责该设备的屏可直接执行本地操作,随后上报状态及活动;这种操作不再同时向平台提交一条待下发控制命令。
本地操作以 localOperationId 标记来源。平台因该上报产生的事件只是同步,不重新生成控制命令。其他屏控制该设备时通过平台提交,仍由唯一执行屏领取。
同一屏对同一设备的本地操作与远程操作进入同一个串行执行入口;不能因来源不同并行修改同一属性。相互冲突的请求分别保留结果,不使用先前另一条命令的回报冒充当前命令完成。