Files
web-Iot/docs/命令状态机.md
2026-08-10 13:33:06 +08:00

109 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 命令状态机
| 项目 | 内容 |
|------|------|
| 文档编号 | DES-05 |
| 文档名称 | 命令状态机 |
| 版本 | V1.0 |
| 状态 | 已评审(Reviewed) |
| 适用系统 | 机器人智慧服务系统(命令服务 Alpha) |
| 编写日期 | 2026-08-10 |
| 关联文档 | DOC-09 控制命令字典、控制会话状态机、越权-冲突-超时测试记录 |
---
## 1. 概述
命令状态机定义控制命令从创建到终态的全部状态与迁移规则。**命令服务 Alpha(3030)** 已按本文档实现:每条命令携带 `status` 与 `events[]`(迁移审计链),超时自动重试,取消/重试受状态约束。
## 2. 命令状态定义(CMD-STATE)
| 状态 | 编码 | 说明 |
|------|------|------|
| 待发送 | `PENDING` | 命令已创建,排队等待下发(预留态) |
| 已下发 | `SENT` | 已发送至设备端,等待 ACK |
| 已确认 | `ACKED` | 设备已确认收到,准备执行 |
| 执行中 | `EXECUTING` | 设备正在执行 |
| 成功 | `SUCCEEDED` | 执行成功(终态) |
| 失败 | `FAILED` | 执行失败(终态,可手动重试) |
| 超时 | `TIMEOUT` | 超时未完成(终态,可手动重试) |
| 已取消 | `CANCELLED` | 用户取消/会话关闭(终态) |
## 3. 状态迁移图
```
自动重试(≤maxRetries)
┌─────────────────────────────────┐
│ ▼
创建 → PENDING → SENT ──ACK──→ ACKED ──exec──→ EXECUTING ──result──→ SUCCEEDED
│ │ │
│cancel │cancel │result(failed)
▼ ▼ ▼
CANCELLED CANCELLED FAILED ──retry──→ SENT
▲ ▲
│ │
└──── 会话关闭自动取消 ────────────┘
TIMEOUT(超时且重试耗尽)──retry──→ SENT
```
## 4. 状态迁移表(CMD-TRANSITION)
| 当前状态 | 事件 | 目标状态 | 触发方 | 条件 / 动作 |
|----------|------|----------|--------|-------------|
| `PENDING` | `DISPATCH` | `SENT` | 平台 | 发送至设备通道 |
| `SENT` | `DEVICE_ACK` | `ACKED` | 设备 | 记录 ackAt;ACK 携带 `executing:true` 可直接进入 EXECUTING |
| `ACKED` | `EXEC_START` | `EXECUTING` | 设备 | 设备开始执行 |
| `EXECUTING` | `RESULT_OK` | `SUCCEEDED` | 设备 | `result{status:'success'}`;清除超时定时器 |
| `EXECUTING` | `RESULT_FAIL` | `FAILED` | 设备 | `result{status:'failed', errorCode}`;清除定时器 |
| `SENT`/`ACKED`/`EXECUTING` | `TIMEOUT` | `TIMEOUT` | 平台 | 超时;重试次数 < maxRetries 时先自动重试(→SENT) |
| `PENDING`/`SENT`/`ACKED` | `CANCEL` | `CANCELLED` | 用户/会话 | 仅非执行态可取消 |
| `TIMEOUT`/`FAILED` | `RETRY` | `SENT` | 用户 | 手动重试,retries+1 |
| 任意非终态 | `SESSION_CLOSE` | `CANCELLED` | 平台 | 控制会话关闭,自动取消未终态命令 |
## 5. 超时与重试策略(CMD-TIMEOUT)
| 参数 | 默认值 | 范围 | 说明 |
|------|--------|------|------|
| `timeoutMs` | 30000 | 1000~300000 | 从 SENT 起算,到达终态或 ACK+result 全流程的超时预算 |
| `maxRetries` | 1 | 0~3 | 超时自动重试次数;重试后重新计时 |
| 重试间隔 | 0(立即) | — | Alpha 版立即重发,后续版本可加指数退避 |
**计时规则:** 命令创建即启动定时器;进入 SUCCEEDED/FAILED/CANCELLED 时取消;自动重试与手动重试均重新启动定时器。
## 6. 命令事件审计(CMD-EVENT)
每条命令维护 `events[]` 不可变事件链,用于联调定位与测试记录核对:
```json
{
"at": "2026-08-10T10:00:00.000Z",
"from": "SENT",
"to": "ACKED",
"reason": "device_ack"
}
```
| reason 取值 | 说明 |
|-------------|------|
| `dispatch` | 创建下发 |
| `device_ack` | 设备确认 |
| `exec_start` | 开始执行 |
| `exec_result` | 结果回传 |
| `auto_retry` | 超时自动重试 |
| `manual_retry` | 用户手动重试 |
| `user_cancel` | 用户取消 |
| `timeout` | 超时终态 |
## 7. 与设备接入/状态服务的衔接
- **下发前置校验**:命令服务调用设备接入服务 `GET /api/devices/:id/online`,设备离线返回 `40902` 拒绝下发(设备接入服务不可达时降级放行)。
- **执行联动**:命令进入 EXECUTING 时,状态服务侧设备 `mode` 切换为 `working`/`patrol`;命令终态后恢复 `idle`(联调阶段由设备端模拟上报)。
---
**变更记录**
| 版本 | 日期 | 变更内容 | 作者 |
|------|------|----------|------|
| V1.0 | 2026-08-10 | 初稿:命令状态定义/迁移表/超时重试/事件审计 | 系统组 |